Jump to content

cespues

Members
  • Posts

    10
  • Joined

  • Last visited

About cespues

  • Birthday 11/24/1979

Contact Methods

Profile Information

  • Location
    Spain
  • Interests
    Software developing and system administration (LINUX: CentOs, Fedora, Debian, Ubuntu...)
  • Activity
    Freelancer

Recent Profile Visitors

2,409,888 profile views

cespues's Achievements

Newbie

Newbie (1/14)

  • Week One Done Rare
  • One Month Later Rare
  • One Year In Rare

Recent Badges

3

Reputation

  1. Salut Annick, je ne connais pas le français donc je passe le texte traduit de google, j'espère que tu comprends. J'ai eu la même erreur et je ne peux pas accéder aux modules, vous utilisez probablement une version php trop ancienne, essayez de mettre à jour PHP vers la version 7 et réessayez. Si vous ne pouvez pas mettre à jour php ou si cela ne résout pas votre erreur, vous pouvez essayer de désactiver le module de mise à niveau en 1 clic, ou accéder par ftp et renommer le fichier /modules/autoupgrade/upgrade/install-4.9.0.php en /modules/autoupgrade/upgrade/install-4.9.0_old.php, par exemple. De cette façon, le module sera désactivé et vous pourrez accéder au reste des modules. En ce qui concerne la deuxième erreur de base de données, il semble qu'elle indique qu'elle ne trouve pas de table dans la base de données, qui appartient au mode de paiement Stripe, si vous désactivez le module Stripe, cette erreur ne sautera plus, contactez le support du module et expliquez cette erreur que vous avez. Salutations.
  2. Cuidado en Ps 1.7, aún teniendo las formas de pago y transportistas bien configurados, es posible que no se te muestren las formas de pago. En mi caso, usaba 2 transportistas con el mismo nombre "Envios a Europa" por ejemplo, pero uno hacía envíos a España, y el otro no. Por otro lado, en las preferencias de pago, abajo de todo, cuando se asocian transportistas a formas de pago, sólamente se listaba 1 de ellos, es decir, al llamarse igual sólo me mostraba 1 de ellos (debe haber un bug que recupera los transportistas por nombre en lugar de por ID). Eso debe producir una ambigüedad, donde por un lado te permite seleccionar transportista, pero por otro lado no tiene forma de pago asociada. Solución: cambié el nombre de 1 de los transportistas, y eliminé caché de Prestashop, pero también fue necesario eliminar la caché del framework (Symfony), esta caché se encuentra en el equivalente a /public_html/var/cache/, donde encontrará las carpetas /dev y /prod. Elimina el contenido de ambas carpetas y refresca tu página matando la caché (usa incógnito si quieres asegurarte). En la configuración de Pagos>Preferencias> Restricciones por transportista deberían salir TODOS tus transportistas para asociarles las formas de pago deseadas. Con eso se me ha solucionado el problema. Saludos.
  3. Corrección: Con las anteriores modificaciones los valores en el carrito se ven bien, pero no es correcto, porque no se logra modificar el total del pedido que se envía a las formas de pago. Por lo tanto, haremos una modificación, sobre lo anterior: - no se crea modificación de la funcion getSummaryDetails() , podéis eliminarla - se crea una modificación sobre la función getOrderTotal(), llamada por la anterior, y es la que se encarga de calcula el verdadero total que se es utilizado por todas las funciones de todos los módulos., por lo tanto, el overide quedaría del siguiente modo (mucho más sencillo), el cual soluciona el problema en todos los casos (con y cin precios específicos y con y sin tasas): marco en negrita las modificaciones de la función, con comentarios. Se trata de una copia de getOrderTotal() con 4 líneas añadidas. en override/classes/Cart.php class Cart extends CartCore { public function getOrderTotal($with_taxes = true, $type = Cart::BOTH, $products = null, $id_carrier = null, $use_cache = true) { // Dependencies $address_factory = Adapter_ServiceLocator::get('Adapter_AddressFactory'); $price_calculator = Adapter_ServiceLocator::get('Adapter_ProductPriceCalculator'); $configuration = Adapter_ServiceLocator::get('Core_Business_ConfigurationInterface'); $ps_tax_address_type = $configuration->get('PS_TAX_ADDRESS_TYPE'); $ps_use_ecotax = $configuration->get('PS_USE_ECOTAX'); $ps_round_type = $configuration->get('PS_ROUND_TYPE'); $ps_ecotax_tax_rules_group_id = $configuration->get('PS_ECOTAX_TAX_RULES_GROUP_ID'); $compute_precision = $configuration->get('_PS_PRICE_COMPUTE_PRECISION_'); if (!$this->id) { return 0; } $type = (int)$type; $array_type = array( Cart::ONLY_PRODUCTS, Cart::ONLY_DISCOUNTS, Cart::BOTH, Cart::BOTH_WITHOUT_SHIPPING, Cart::ONLY_SHIPPING, Cart::ONLY_WRAPPING, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING, Cart::ONLY_PHYSICAL_PRODUCTS_WITHOUT_SHIPPING, ); // Define virtual context to prevent case where the cart is not the in the global context $virtual_context = Context::getContext()->cloneContext(); $virtual_context->cart = $this; if (!in_array($type, $array_type)) { die(Tools::displayError()); } $with_shipping = in_array($type, array(Cart::BOTH, Cart::ONLY_SHIPPING)); // if cart rules are not used if ($type == Cart::ONLY_DISCOUNTS && !CartRule::isFeatureActive()) { return 0; } // no shipping cost if is a cart with only virtuals products $virtual = $this->isVirtualCart(); if ($virtual && $type == Cart::ONLY_SHIPPING) { return 0; } if ($virtual && $type == Cart::BOTH) { $type = Cart::BOTH_WITHOUT_SHIPPING; } if ($with_shipping || $type == Cart::ONLY_DISCOUNTS) { if (is_null($products) && is_null($id_carrier)) { $shipping_fees = $this->getTotalShippingCost(null, (bool)$with_taxes); } else { $shipping_fees = $this->getPackageShippingCost((int)$id_carrier, (bool)$with_taxes, null, $products); } } else { $shipping_fees = 0; } if ($type == Cart::ONLY_SHIPPING) { return $shipping_fees; } if ($type == Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING) { $type = Cart::ONLY_PRODUCTS; } $param_product = true; if (is_null($products)) { $param_product = false; $products = $this->getProducts(); } if ($type == Cart::ONLY_PHYSICAL_PRODUCTS_WITHOUT_SHIPPING) { foreach ($products as $key => $product) { if ($product['is_virtual']) { unset($products[$key]); } } $type = Cart::ONLY_PRODUCTS; } $order_total = 0; if (Tax::excludeTaxeOption()) { $with_taxes = false; } $products_total = array(); $ecotax_total = 0; foreach ($products as $product) { // products refer to the cart details if ($virtual_context->shop->id != $product['id_shop']) { $virtual_context->shop = new Shop((int)$product['id_shop']); } if ($ps_tax_address_type == 'id_address_invoice') { $id_address = (int)$this->id_address_invoice; } else { $id_address = (int)$product['id_address_delivery']; } // Get delivery address of the product from the cart if (!$address_factory->addressExists($id_address)) { $id_address = null; } // The $null variable below is not used, // but it is necessary to pass it to getProductPrice because // it expects a reference. $null = null; $price = $price_calculator->getProductPrice( (int)$product['id_product'], $with_taxes, (int)$product['id_product_attribute'], 6, null, false, true, $product['cart_quantity'], false, (int)$this->id_customer ? (int)$this->id_customer : null, (int)$this->id, $id_address, $null, $ps_use_ecotax, true, $virtual_context ); /*CeSpues -> modificar el precio del producto si usa precio específico*/ if ($product['reduction_type'] == 'amount' && $with_taxes == true) { //en caso de que el producto tenga descuento específico y se trata del total con tasas se ejecuta este código $tax_amount = $product['rate']/100; // recuperamos el impuesto a añadir $price = $product['price_with_reduction_without_tax']+$product['price_with_reduction_without_tax']*$tax_amount; //nuevo precio: obligamos a usar la variable del precio con descuento sin tasas y le sumamos las tasas }elseif($product['reduction_type'] == 'amount' && $with_taxes == false) $price = $product['price_with_reduction_without_tax']; //en caso de no usar tasas para precio total, solamente obligamos a usar el precio del producto con descuento específico //$price = $product['price_with_reduction_without_tax']; $address = $address_factory->findOrCreate($id_address, true); if ($with_taxes) { $id_tax_rules_group = Product::getIdTaxRulesGroupByIdProduct((int)$product['id_product'], $virtual_context); $tax_calculator = TaxManagerFactory::getManager($address, $id_tax_rules_group)->getTaxCalculator(); } else { $id_tax_rules_group = 0; } if (in_array($ps_round_type, array(Order::ROUND_ITEM, Order::ROUND_LINE))) { if (!isset($products_total[$id_tax_rules_group])) { $products_total[$id_tax_rules_group] = 0; } } elseif (!isset($products_total[$id_tax_rules_group.'_'.$id_address])) { $products_total[$id_tax_rules_group.'_'.$id_address] = 0; } switch ($ps_round_type) { case Order::ROUND_TOTAL: $products_total[$id_tax_rules_group.'_'.$id_address] += $price * (int)$product['cart_quantity']; break; case Order::ROUND_LINE: $product_price = $price * $product['cart_quantity']; $products_total[$id_tax_rules_group] += Tools::ps_round($product_price, $compute_precision); break; case Order::ROUND_ITEM: default: $product_price = /*$with_taxes ? $tax_calculator->addTaxes($price) : */$price; $products_total[$id_tax_rules_group] += Tools::ps_round($product_price, $compute_precision) * (int)$product['cart_quantity']; break; } } foreach ($products_total as $key => $price) { $order_total += $price; } $order_total_products = $order_total; if ($type == Cart::ONLY_DISCOUNTS) { $order_total = 0; } // Wrapping Fees $wrapping_fees = 0; // With PS_ATCP_SHIPWRAP on the gift wrapping cost computation calls getOrderTotal with $type === Cart::ONLY_PRODUCTS, so the flag below prevents an infinite recursion. $include_gift_wrapping = (!$configuration->get('PS_ATCP_SHIPWRAP') || $type !== Cart::ONLY_PRODUCTS); if ($this->gift && $include_gift_wrapping) { $wrapping_fees = Tools::convertPrice(Tools::ps_round($this->getGiftWrappingPrice($with_taxes), $compute_precision), Currency::getCurrencyInstance((int)$this->id_currency)); } if ($type == Cart::ONLY_WRAPPING) { return $wrapping_fees; } $order_total_discount = 0; $order_shipping_discount = 0; if (!in_array($type, array(Cart::ONLY_SHIPPING, Cart::ONLY_PRODUCTS)) && CartRule::isFeatureActive()) { // First, retrieve the cart rules associated to this "getOrderTotal" if ($with_shipping || $type == Cart::ONLY_DISCOUNTS) { $cart_rules = $this->getCartRules(CartRule::FILTER_ACTION_ALL); } else { $cart_rules = $this->getCartRules(CartRule::FILTER_ACTION_REDUCTION); // Cart Rules array are merged manually in order to avoid doubles foreach ($this->getCartRules(CartRule::FILTER_ACTION_GIFT) as $tmp_cart_rule) { $flag = false; foreach ($cart_rules as $cart_rule) { if ($tmp_cart_rule['id_cart_rule'] == $cart_rule['id_cart_rule']) { $flag = true; } } if (!$flag) { $cart_rules[] = $tmp_cart_rule; } } } $id_address_delivery = 0; if (isset($products[0])) { $id_address_delivery = (is_null($products) ? $this->id_address_delivery : $products[0]['id_address_delivery']); } $package = array('id_carrier' => $id_carrier, 'id_address' => $id_address_delivery, 'products' => $products); // Then, calculate the contextual value for each one $flag = false; foreach ($cart_rules as $cart_rule) { // If the cart rule offers free shipping, add the shipping cost if (($with_shipping || $type == Cart::ONLY_DISCOUNTS) && $cart_rule['obj']->free_shipping && !$flag) { $order_shipping_discount = (float)Tools::ps_round($cart_rule['obj']->getContextualValue($with_taxes, $virtual_context, CartRule::FILTER_ACTION_SHIPPING, ($param_product ? $package : null), $use_cache), $compute_precision); $flag = true; } // If the cart rule is a free gift, then add the free gift value only if the gift is in this package if ((int)$cart_rule['obj']->gift_product) { $in_order = false; if (is_null($products)) { $in_order = true; } else { foreach ($products as $product) { if ($cart_rule['obj']->gift_product == $product['id_product'] && $cart_rule['obj']->gift_product_attribute == $product['id_product_attribute']) { $in_order = true; } } } if ($in_order) { $order_total_discount += $cart_rule['obj']->getContextualValue($with_taxes, $virtual_context, CartRule::FILTER_ACTION_GIFT, $package, $use_cache); } } // If the cart rule offers a reduction, the amount is prorated (with the products in the package) if ($cart_rule['obj']->reduction_percent > 0 || $cart_rule['obj']->reduction_amount > 0) { $order_total_discount += Tools::ps_round($cart_rule['obj']->getContextualValue($with_taxes, $virtual_context, CartRule::FILTER_ACTION_REDUCTION, $package, $use_cache), $compute_precision); } } $order_total_discount = min(Tools::ps_round($order_total_discount, 2), (float)$order_total_products) + (float)$order_shipping_discount; $order_total -= $order_total_discount; } if ($type == Cart::BOTH) { $order_total += $shipping_fees + $wrapping_fees; } if ($order_total < 0 && $type != Cart::ONLY_DISCOUNTS) { return 0; } if ($type == Cart::ONLY_DISCOUNTS) { return $order_total_discount; } return Tools::ps_round((float)$order_total, $compute_precision); } } De este modo, a parte de calcular bien los costes en el carrito, se envían los valores correctos a las formas de pago.
  4. Hola, despues de mucho tiempo parece que el problema persiste en PS 1.6.1.23, voy a explicar el problema otra vez, ya que parece que sea el mismo, y he conseguido implementar una solución. La base del problema es cuando creamos precios específicos para un producto, ya que en el carrito no se refleja el IVA correctamente, sinó que calcula el IVA del precio original del producto, sin tener en cuenta la reducción del precio específico, un ejemplo: añadimos un producto de coste original 9€ (imp. excl.) el coste de transporte son 3€ total sin impuestos: 12€ IVA: 2,52€ Total: 14,52€ --------------------------------- Hasta aquí todo normal, sin embargo, si a ese mismo producto, le creamos un precio específico con una reducción de 6€ (imp. excl), queda del siguiente modo: añadimos un producto con precio específico (-6€ imp. excl.): 3€ el coste de transporte son 3€ total sin impuestos: 6€ IVA: 2,52€ (MAL, deberia ser 1,26€) Total: 8,52€ (MAL, debería ser 7,26€) ------------------------ El total es incorrecto, y por lo tanto el IVA también lo es, ya que prestashop calcula el IVA del carrito a partir de Total con IVA restando el Total sin IVA. En otras palabras, después de depurar y printar valores en la pantlla como si no hubiera un mañana, descubrí lo que ocurre exactamente: Al tener un descuento de -6€ sin impuestos, ese el el valor que utiliza el sistema como reducción y se lo aplica al total con IVA, por lo tanto, un producto de 9€ sin IVA 21%, sería con IVA 10.89€. El sistema le resta a 10,89€ - 6€ = 4,89€ (product con IVA -> MAL) deberái restar 10,89 - 7,26 = 3,63€ (es decir debería restar 6€ + 21% = 7,26€). En conclusión, aplica el descuento sin IVA al total con IVA, cuando debería aplicar el descuento con IVA al total con IVA. Pues bien, he aquí la solución: Se trata de modificar la clase Cart.php, (/classes/cart.php), aunque por supuesto recomiendo crear su correspondiente override (override/classes/Cart.php), el ejemplo continua sobre el override, modificando concretamente la función getSummaryDetails(). A continuación dejo la clase en override con esa función modificada, la cual soluciona el problema mencionado, comentando en negrita las líneas añadidas/modificadas. en override/classes/Cart.php class Cart extends CartCore { public function getSummaryDetails($id_lang = null, $refresh = false) { $context = Context::getContext(); if (!$id_lang) { $id_lang = $context->language->id; } $delivery = new Address((int)$this->id_address_delivery); $invoice = new Address((int)$this->id_address_invoice); // New layout system with personalization fields $formatted_addresses = array( 'delivery' => AddressFormat::getFormattedLayoutData($delivery), 'invoice' => AddressFormat::getFormattedLayoutData($invoice) ); $products = $this->getProducts($refresh); $currency = new Currency($this->id_currency); $price_reduc = false; //CeSpues -> añadimos variable para controlar si algún producto del carrito tiene precio específico (reducción) $total_reduction = 0;//CeSpues -> variable para sumar las reducciones de todos los productos del carrito (en caso de que haya más de uno) foreach ($products as $key => &$product) { $product['price_without_quantity_discount'] = Product::getPriceStatic( $product['id_product'], !Product::getTaxCalculationMethod(), $product['id_product_attribute'], 6, null, false, false ); /* CeSpues -> modificamos la lógica, en caso de que haya reduccion */ if ($product['reduction_type'] == 'amount') { $reduction = (!Product::getTaxCalculationMethod() ? (float)$product['price_wt'] : (float)$product['price']) - (float)$product['price_without_quantity_discount']; $tax_amount = $product['rate']/100; // Cespues -> (guardamos el IVA de ese producto, ya que cada producto puede tener diferente IVA) $reduction_wt = $reduction + $reduction*$tax_amount; // calculamos la reducción incluyendo el IVA $reduction_extra = (int)$product["cart_quantity"]*($reduction_wt - $reduction); //Calculamos la diferencia de redducion con IVA - reduccion sin IVA y multiplicamos por cantidad de productos en carrito (esto es el IVA que faltaba añadir al descuento) $product['reduction_formatted'] = Tools::displayPrice($reduction); $price_reduc = true; // cambiamos valor a "true", para notificar posteriormente que hay algún producto con descuento $total_reduction = $total_reduction + $reduction_extra; // acumulamos todo los IVA faltantes de cada reduccion aplicada } /**/ } $base_total_tax_inc = $this->getOrderTotal(true); // Cespues -> calculamos ahora el total con impuestos incluídos $gift_products = array(); $cart_rules = $this->getCartRules(); $total_shipping = $this->getTotalShippingCost(); $total_shipping_tax_exc = $this->getTotalShippingCost(null, false); $total_products_wt = $this->getOrderTotal(true, Cart::ONLY_PRODUCTS); /* CeSpues -> si ha habido reducción en algún producto */ if($price_reduc){ $total_products_wt = $total_products_wt + $total_reduction; // modificamos el total (sólo de productos) con impuestos sumando la reduccion, que será negativa $base_total_tax_inc = $base_total_tax_inc + $total_reduction; // modificamos el total absoluto (productos + transporte), aplicando el descuento correctamente } /**/ $total_products = $this->getOrderTotal(false, Cart::ONLY_PRODUCTS); $total_discounts = $this->getOrderTotal(true, Cart::ONLY_DISCOUNTS); $total_discounts_tax_exc = $this->getOrderTotal(false, Cart::ONLY_DISCOUNTS); $base_total_tax_exc = $this->getOrderTotal(false); $total_tax = $base_total_tax_inc - $base_total_tax_exc; // Cespues -> aqui se calcula el IVA final, usando el valor correcto del total con impuestos, a partir de aquí, el resto de la función ya no cambia. if ($total_tax < 0) { $total_tax = 0; } // The cart content is altered for display foreach ($cart_rules as &$cart_rule) { // If the cart rule is automatic (wihtout any code) and include free shipping, it should not be displayed as a cart rule but only set the shipping cost to 0 if ($cart_rule['free_shipping'] && (empty($cart_rule['code']) || preg_match('/^'.CartRule::BO_ORDER_CODE_PREFIX.'[0-9]+/', $cart_rule['code']))) { $cart_rule['value_real'] -= $total_shipping; $cart_rule['value_tax_exc'] -= $total_shipping_tax_exc; $cart_rule['value_real'] = Tools::ps_round($cart_rule['value_real'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); $cart_rule['value_tax_exc'] = Tools::ps_round($cart_rule['value_tax_exc'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); if ($total_discounts > $cart_rule['value_real']) { $total_discounts -= $total_shipping; } if ($total_discounts_tax_exc > $cart_rule['value_tax_exc']) { $total_discounts_tax_exc -= $total_shipping_tax_exc; } // Update total shipping $total_shipping = 0; $total_shipping_tax_exc = 0; } if ($cart_rule['gift_product']) { foreach ($products as $key => &$product) { if (empty($product['gift']) && $product['id_product'] == $cart_rule['gift_product'] && $product['id_product_attribute'] == $cart_rule['gift_product_attribute']) { // Update total products $total_products_wt = Tools::ps_round($total_products_wt - $product['price_wt'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); $total_products = Tools::ps_round($total_products - $product['price'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); // Update total discounts $total_discounts = Tools::ps_round($total_discounts - $product['price_wt'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); $total_discounts_tax_exc = Tools::ps_round($total_discounts_tax_exc - $product['price'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); // Update cart rule value $cart_rule['value_real'] = Tools::ps_round($cart_rule['value_real'] - $product['price_wt'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); $cart_rule['value_tax_exc'] = Tools::ps_round($cart_rule['value_tax_exc'] - $product['price'], (int)$context->currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); // Update product quantity $product['total_wt'] = Tools::ps_round($product['total_wt'] - $product['price_wt'], (int)$currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); $product['total'] = Tools::ps_round($product['total'] - $product['price'], (int)$currency->decimals * _PS_PRICE_COMPUTE_PRECISION_); $product['cart_quantity']--; if (!$product['cart_quantity']) { unset($products[$key]); } // Add a new product line $gift_product = $product; $gift_product['cart_quantity'] = 1; $gift_product['price'] = 0; $gift_product['price_wt'] = 0; $gift_product['total_wt'] = 0; $gift_product['total'] = 0; $gift_product['gift'] = true; $gift_products[] = $gift_product; break; // One gift product per cart rule } } } } foreach ($cart_rules as $key => &$cart_rule) { if (((float)$cart_rule['value_real'] == 0 && (int)$cart_rule['free_shipping'] == 0)) { unset($cart_rules[$key]); } } $summary = array( 'delivery' => $delivery, 'delivery_state' => State::getNameById($delivery->id_state), 'invoice' => $invoice, 'invoice_state' => State::getNameById($invoice->id_state), 'formattedAddresses' => $formatted_addresses, 'products' => array_values($products), 'gift_products' => $gift_products, 'discounts' => array_values($cart_rules), 'is_virtual_cart' => (int)$this->isVirtualCart(), 'total_discounts' => $total_discounts, 'total_discounts_tax_exc' => $total_discounts_tax_exc, 'total_wrapping' => $this->getOrderTotal(true, Cart::ONLY_WRAPPING), 'total_wrapping_tax_exc' => $this->getOrderTotal(false, Cart::ONLY_WRAPPING), 'total_shipping' => $total_shipping, 'total_shipping_tax_exc' => $total_shipping_tax_exc, 'total_products_wt' => $total_products_wt, 'total_products' => $total_products, 'total_price' => $base_total_tax_inc, 'total_tax' => $total_tax, 'total_price_without_tax' => $base_total_tax_exc, 'is_multi_address_delivery' => $this->isMultiAddressDelivery() || ((int)Tools::getValue('multi-shipping') == 1), 'free_ship' =>!$total_shipping && !count($this->getDeliveryAddressesWithoutCarriers(true, $errors)), 'carrier' => new Carrier($this->id_carrier, $id_lang), ); $hook = Hook::exec('actionCartSummary', $summary, null, true); if (is_array($hook)) { $summary = array_merge($summary, array_shift($hook)); } return $summary; } } ------------------- Testeado y funcionando en PS 1.6.1.23, usando las opciones siguientes: - Mostrar productos sin IVA - Aplicando precios específicos con impuestos excluídos Espero que os sea de ayuda, nunca es tarde si la dicha es buena.
  5. Solucionado en PS 1.6.1.18, hice upgrade desde 1.6.1.16 a la 1.6.1.18, y repentinamente el formulario de contacto no funcionaba en ningún idioma, sin mostrar más errores que el que se comenta aquí, pero no salía nada en modo debug. Tal y como dice [email protected] se han de añadir esas líneas de código (los inputs) encima del button en el contact-form.tpl de tu tema, quedando así: <div class="submit"> <input type="text" name="url" value="" class="hidden" /> <input type="hidden" name="contactKey" value="{$contactKey}" /> <button type="submit" name="submitMessage" id="submitMessage" class="button btn btn-default button-medium"><span>{l s='Send'}<i class="icon-chevron-right right"></i></span></button> </div> No es necesario actualizar idiomas, ni sobreescribir ficheros enteros. A la pregunta de pardebits, que dice "no entiendo cómo puede pasar esto", yo se lo explico: Actualizas PS a nueva versión, pero no actualizas el tema por defecto o usas otro tema que no se actualiza con el 1-click upgrade, por lo tanto, en la actulización de PS ha cambiando un controlador del núcleo (ContactController.php), el cual tiene nueva funcionalidad, que no está reflejada en el contact-form.tpl de tu tema, por lo tanto, falla. Normal. Si quieres evitar que pase esto, debes mirar el changelog de la nueva versión de PS que va a instalar, y/o usar los overrides para mantener la funcionalidad antigua o personalizada de tus classes y controllers, sinó te la juegas a que falle algo. Desde luego esto no es culpa de PS. Gracias por la solución Pardebits!!
  6. Hola de nuevo, ya he conseguido solucionar el error. No se a qué es debido, pero el error se soluciona si eliminamos el índice que nos da error, en tu caso seria eliminar el indice id_product. para ello: - entra a phpMyAdmin o equivalente - Haz backup de la tabla PREFIX_specific_price - luego ejecuta la eliminación del indice: en tu caso sería DROP INDEX `id_product` ON PREFIX_specific_price - PREFIX es tu prefijo de tablas. - A mi me pasaba con la key id_product_2: " Duplicate entry '852-000-00...... ' for key 'id_product_2', al ejecutar DROP INDEX `id_product_2` ON ps_specific_price el problema se soluciona, ya me ducplica productos sin error, incluidas imágenes, categorias y combinaciones. - No hace falta volver a crear el índice, prestashop creará los necesarios solucionando las incompatibilidades. Hasta otra.
  7. Tengo el mismo problema, por algun lugar comentan que se pueden reparar las tablas desde phpMyAdmin, pero yo lo he hecho y no se corrige el error. Estoy investigando sobre ello. ¿Dregalo, conseguiste arreglarlo?
  8. Hola, he visto que este error sigue afectando a prestashop 1.6.0.xx, no se si lo han solucionado para la version 1.6.1, sin embargo he detectado un bug del sistema que puede estar afectando a algunos de vosotros. El pantallazo en blanco puede venir afectado por la modificación de las plantillas de emails (a mi me pasaba con mailalerts), resulta que al modificar alguna de las plantillas, en mi caso new order, el sistema sobreescribe el archivo /themes/tu_tema/mails/idioma_que_has_modificado/order_conf_product_list.txt Resulta que al modificar la platilla new order de mailalerts, a través del administrador (localización>traducciones: plantilla de emails) el sistema regenera el archivo que os comento : order_conf_product_list.txt añadiendo la contrabarra "\" para escapar unas comillas que no es necesario escapar, dejando el archivo con un error que provoca que pete el proceso de mailing y da pantallazo en blanco, dejando los pedidos sin estado, ni envio de emails a usuario ni admin, lo cual provoca una inestabilidad poco agradable. Si en este tipo de archivos encontráis esto (fijaos en la contrabarra "\"): {foreach $list as $product} {$product[\'reference\']} {$product[\'name\']} {$product[\'price\']} {$product[\'quantity\']} {$product[\'price\']} {foreach $product[\'customization\'] as $customization} {$product[\'name\']} {$customization[\'customization_text\']} {$product[\'price\']} {$product[\'customization_quantity\']} {$product[\'quantity\']} {/foreach} {/foreach} Tendrías que eliminar esa contrabarra "\", quedando el archivo del siguiente modo: {foreach $list as $product} {$product['reference']} {$product['name']} {$product['price']} {$product['quantity']} {$product['price']} {foreach $product['customization'] as $customization} {$product['name']} {$customization['customization_text']} {$product['price']} {$product['customization_quantity']} {$product['quantity']} {/foreach} {/foreach} Para solucionar esto, verificad que vuestros archivos de mails, para cada idioma activo, no contienen la contrabarra. Saludos.
×
×
  • Create New...