Manuel_GT Posted June 15, 2023 Share Posted June 15, 2023 (edited) Ya es la segunda vez que compruebo que Prestashop (mi versión es 1.7.8.8) trata correctamente los valores numéricos correspondientes a monedas pero no el resto. Por ejemplo, en una factura, el la tabla de desglose de impuestos pone un punto como separador decimal, en lugar de una coma con lo que un 21% de IVA se convierte en un 21.000% Otro ejemplo: En la vista de detalle de un pedido (front), en la tabla de transporte, campo "peso" resulta que un paquete de 20 kg se muestra de 20.000 kg. El problema es que estos números llegan a la plantilla ya formateados en formato cadena de texto y con las unidades añadidas, por lo que no se puede emplear nada sencillo para formatearlos correctamente en la plantilla. En el campo del peso explicado anteriormente he tenido que hacer cambios en el código de Prestashop (fichero src/Adapter/Presenter/Order/OrderDetailLazyArray.php) $orderShipping[$shippingId]['shipping_weight'] = ($shipping['weight'] > 0) ? sprintf('%d', ceil($shipping['weight'])) . ' ' . // MANOLO: cambiamos el formato %.3f (float) y ponemos %d redondeado al alza para evitar error de formato 20.000 Kg Configuration::get('PS_WEIGHT_UNIT') : '-'; Pero claro, no quiero tocar en el core de Prestashop y perder todos los cambios con cada actualización. ¿Hay alguna forma de obtener el número correctamente formateado dependiendo de la localización? ¿Se podría hacer algo en las plantillas? Edited June 15, 2023 by Manuel_GT (see edit history) Link to comment Share on other sites More sharing options...
Manuel_GT Posted June 18, 2023 Author Share Posted June 18, 2023 Después de investigar un poco, he descubierto esto (mi software es 1.7.8.8). La plantilla utiliza unas funciones para mostrar los precios de la factura definidas en el fichero "classes/pdf/PDF.php" /* For PDF we restore some functions from Smarty * they've been removed in PrestaShop 1.7 so * new themes don't use them. Although PDF haven't been * reworked so every PDF controller must extend this class. */ smartyRegisterFunction($this->smarty, 'function', 'convertPrice', ['Product', 'convertPrice'], true, $original_lazy_register); smartyRegisterFunction($this->smarty, 'function', 'convertPriceWithCurrency', ['Product', 'convertPriceWithCurrency'], true, $original_lazy_register); smartyRegisterFunction($this->smarty, 'function', 'displayWtPrice', ['Product', 'displayWtPrice'], true, $original_lazy_register); smartyRegisterFunction($this->smarty, 'function', 'displayWtPriceWithCurrency', ['Product', 'displayWtPriceWithCurrency'], true, $original_lazy_register); smartyRegisterFunction($this->smarty, 'function', 'displayPrice', ['Tools', 'displayPriceSmarty'], true, $original_lazy_register); En la plantilla se usan así <td class="right white"> {if isset($is_order_slip) && $is_order_slip}- {/if} {displayPrice currency=$order->id_currency price=$line.total_tax_excl} </td> Por tanto he probado a crear una nueva función siguiendo el formato para los números que no son precios: // MANOLO: función añadida para mostrar el número de la factura i18n correcto smartyRegisterFunction($this->smarty, 'function', 'displayNumber', ['Tools', 'displayNumber'], true, $original_lazy_register); y he alterado la plantilla para que la use en el valor que quiero formatear <td class="center white"> {displayNumber number=$line.rate} % </td> Pero no funciona. Al parecer el parámetro que la función formatNumber de Tools.php recibe es un array de un elemento: $number = ['number' => '10.00'] en lugar del número y esto provoca un error de tipo "Notice: Array to string conversion" en src/Core/Localization/Number/Formatter.php Así que en lugar de llamar a la función de Tools::displayNumber, he creado mi propia funcion Tools:displayNumberPdf /** * MANOLO: función para mostrar los números con el i18n correcto en los PDF * @param $params * @param $smarty * @return string * @throws LocalizationException */ public static function displayNumberPdf($params, &$smarty) { $context = Context::getContext(); $locale = static::getContextLocale($context); return $locale->formatNumber($params['number']); } y la defino con el resto en classes/pdf/PDF.php: // MANOLO: función añadida para mostrar el número de la factura i18n correcto smartyRegisterFunction($this->smarty, 'function', 'displayNumber', ['Tools', 'displayNumberPdf'], true, $original_lazy_register); Funciona perfectamente, aunque ahora no me salen decimales y no se si cuando los haya, serán con un "." o una "," 😞 No me gusta nada tocar el core de Prestashop pero creo que en este caso es inevitable. ¿A alguien se le ocurre otra forma de hacerlo? gracias. Link to comment Share on other sites More sharing options...
Manuel_GT Posted June 18, 2023 Author Share Posted June 18, 2023 Definitivamente la solución funciona. He probado a sumar un numero con decimales antes de formatear y lo muestra correctamente. Además lo he podido aplicar también a la otra cifra que mencionaba. El peso del paquete. En este caso en src/Adapter/Presenter/Order/OrderDetailLazyArray.php ahora pone: $orderShipping[$shippingId]['shipping_weight'] = //($shipping['weight'] > 0) ? sprintf('%d', ceil($shipping['weight'])) . ' ' . // MANOLO: cambiamos el formato %.3f (float) y ponemos %d redondeado al alza para evitar error 20.000 kg ($shipping['weight'] > 0) ? $this->locale->formatNumber($shipping['weight']) . ' ' . // MANOLO: 2ª opción. Llamamos al Locale para formatear el numero en el i18n correcto. ;-) Configuration::get('PS_WEIGHT_UNIT') : '-'; Cierro el hilo. Gracias. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now