Vamos a ver cómo añadir un nuevo formato de moneda en Prestashop. En la configuración de la moneda en Prestashop disponemos de diferentes formatos posibles para representar los precios de los artículos. El problema que tiene Prestashop (pongo como ejemplo v1.5.2.0), es que no tiene el formato que habitualmente usamos en España, que es un formato de este tipo 0.000,00 X.
Formatos disponibles en Prestashop 1.5.2.0:
Para añadir nuestro formato habitual, no vale con añadir el nuevo formato en BBDD, que sería lo normal a mi parecer, sino que tenemos que modificar varios ficheros PHP del core del Prestashop. La pega que tiene esto, es que si actualizamos a una versión más actual de Prestashop puede que perdamos dicha configuración y haya que repetir el proceso.
Hay que modificar 3 ficheros:
- classesTools.php (línea 485 aprox.)
- classesCurrency.php (línea 189 aprox.)
- jstools.js (línea 60 aprox.)
- controllersadminAdminCurrenciesController.php (línea 146 aprox.)
Las modificaciones a realizar en cada uno son:
En el fichero classesTools.php (línea 485 aprox.) vamos a añadir un nuevo formato y lo vamos a codificar como el número 6. Hay que mantener siempre en los tres fichero este número:
$price = Tools::ps_round($price, $c_decimals); switch ($c_format) { /* X 0,000.00 */ case 1: $ret = $c_char.$blank.number_format($price, $c_decimals, '.', ','); break; /* 0 000,00 X*/ case 2: $ret = number_format($price, $c_decimals, ',', ' ').$blank.$c_char; break; /* X 0.000,00 */ case 3: $ret = $c_char.$blank.number_format($price, $c_decimals, ',', '.'); break; /* 0,000.00 X */ case 4: $ret = number_format($price, $c_decimals, '.', ',').$blank.$c_char; break; /* 0 000.00 X Added for the switzerland currency */ case 5: $ret = number_format($price, $c_decimals, '.', ' ').$blank.$c_char; break; /* 0.000,00 X */ case 6: $ret = number_format($price, $c_decimals, ',', '.').$blank.$c_char; break; }
En el fichero classesCurrency.php (línea 189 aprox.) añadimos al array el ID 6, que es idéntica al ID 2. Hay que tener cuidado y no olvidarse de incluir la coma final en el ID 5:
</pre> $formats = array( 1 => array('left' => &$formated_strings['left'], 'right' => ''), 2 => array('left' => '', 'right' => &$formated_strings['right']), 3 => array('left' => &$formated_strings['left'], 'right' => ''), 4 => array('left' => '', 'right' => &$formated_strings['right']), 5 => array('left' => '', 'right' => &$formated_strings['right']), 6 => array('left' => '', 'right' => &$formated_strings['right']) ); <pre>
En el fichero jstools.js (línea 60 aprox.) modificamos la siguiente función añadiendo nuestra entrada codificada con el número 6:
function formatCurrency(price, currencyFormat, currencySign, currencyBlank) { // if you modified this function, don't forget to modify the PHP function displayPrice (in the Tools.php class) blank = ''; price = parseFloat(price.toFixed(6)); price = ps_round(price, priceDisplayPrecision); if (currencyBlank > 0) blank = ' '; if (currencyFormat == 1) return currencySign + blank + formatNumber(price, priceDisplayPrecision, ',', '.'); if (currencyFormat == 2) return (formatNumber(price, priceDisplayPrecision, ' ', ',') + blank + currencySign); if (currencyFormat == 3) return (currencySign + blank + formatNumber(price, priceDisplayPrecision, '.', ',')); if (currencyFormat == 4) return (formatNumber(price, priceDisplayPrecision, ',', '.') + blank + currencySign); if (currencyFormat == 5) return (formatNumber(price, priceDisplayPrecision, ' ', '.') + blank + currencySign); if (currencyFormat == 6) return (formatNumber(price, priceDisplayPrecision, '.', ',') + blank + currencySign); return price; }
Y por último, en el fichero controllersadminAdminCurrenciesController.php (línea 146 aprox.), volvemos a añadir una entrada más con la codificación del número 6 (no olvidarse de incluir la coma del final de la línea del key=5):
'options' => array( 'query' => array( array('key' => 1, 'name' => 'X0,000.00 ('.$this->l('as with Dollars').')'), array('key' => 2, 'name' => '0 000,00X ('.$this->l('as with Euros').')'), array('key' => 3, 'name' => 'X0.000,00'), array('key' => 4, 'name' => '0,000.00X'), array('key' => 5, 'name' => '0 000.00X'), // Added for the switzerland currency array('key' => 6, 'name' => '0.000,00X') ), 'name' => 'name', 'id' => 'key' )
Una vez modificado el código y subido al servidor, podemos comprobar que los cambios surgen efecto. Sólo falta irse a la configuración de la moneda y seleccionar el nuevo formato que hemos incluido:
y si quisiera dar el formato del peso chileno, el cual es por ejemplo: $35.700. es sin decimales. si puedes ayudarme porfafor
Hola. Si tu duda es cómo quitar los decimales, no te sabría decir a ciencia cierta, habría que probar. Yo intentaría quitar la variable $c_decimals y ponerla a nulo con comillas y la línea "price = parseFloat(price.toFixed(6));" revisarla, porque está formateando el float a 6 caracteres, pero no sabría cómo hay que ponerlo. El php no lo controlo mucho y no te puedo dar indicaciones concretas, pero tiene que estar por ahí los tiros. Un saludo.
Me funciono perfect0 estimado... la duda en donde modifico para agregarlo al fichero donde se aplican Gastos de mantenimiento en la suma total. De antemano gracias!!!
Saludos desde Chile!
Perfecto. Muchas gracias. version 1.5.3.1
Hola!! Muy interesante tu post. Yo creo que podría solucionar mi problema. El caso es que el precio de venta por unidad es en la mayor parte de productos 0,15€, y los pedidos se hacen por 100 unidades, o más. Entonces, cuando prestashop prepara las facturas, sólo toma como referencia los dos primeros decimales, y el cálculo del iva no es correcto, necesitaría que tomase como referencia 4 decimales. Esta solución que tu ofreces me podría servir?
Gracias!!
A priori te diría que sí. Consultando el modelo de datos de prestashop el campo que almacena el precio es de tipo DECIMAL (20,6). Es decir, guarda hasta 6 decimales. Por defecto sólo se muestran dos, pero siguiendo los pasos descritos en este tutorial yo creo que sí podrías mostrar los 4 que necesitas. Suerte!!!
Gracias!!!!
Buenas noches.
Muchas gracias por el aporte. A mi me ocurre lo mismo que a Miren. Querría hacer lo mismo para resolver el problema del calculo del iva, que PS lo hace artículo por artículo y la suma de cada linea no cuadra con el total.
La duda que me entra es que si ponemos la máscara con cuatro decimales...¿No saldrá en todos las paginas el precio de los productos con cuatro decimales? . Yo los cuatro decimales los necesito para los cálculos en las facturas, pero no para los precios que se muestran en la portada y en las fichas de los productos .
No te sabría decir fjguijarro. Tendrías que probarlo y ver cómo se muestra después. Los archivos TPL que muestran las páginas tienen funciones del tipo getPrice(), concretamente para mostrar el precio se usa esta instrucción value=$product->getPrice(true, $smarty.const.NULL, $priceDisplayPrecision) Imagino que te mostrará los 4 decimales, y se solucionaría poniendo ahí un 2 a pelo. Eso está en el fichero product.tpl de tu carpeta de la plantilla. Un saludo, Javier.
¡ Muchas gracias por la ayuda !
Acabo de ver que en el fichero define.inc.php hay una variable de configuración que dice: define('_PS_PRICE_DISPLAY_PRECISION_', 2); Entiendo que aunque hagas el cambio a 4 decimales, seguirán mostrándose 2 y no sería necesario tocar la plantilla. Ya me dirás. Un saludo, Javier.
Los precios en el product.tpl no se muestra x.xxx,xx€ si en homefeatured y demás modulos.
Me podría ayudar
Genial!!! no llevo demasiado con Prestashop, y veo que hay que hacer muchas cosas como ésta para dejarlo perfecto!!! ya veremos si actualizo a la nueva versión que acaba de salir!
Gracias. La verdad es que sí, a Prestashop hay que hacerle demasiadas cosas todavía para dejarlo fino fino. Todavía le queda mucho por hacer ;).
He intentado hacerlo en PS 1.6.1 y no me ha funcionado 🙁
Hola Jess, has limpiado la caché y esas cosas? Aunque en la versión 6 puede que hayan cambiado algunos ficheros, Si localizaste cada uno de los puntos e hiciste los cambios bien, puede ser que no visualices los cambios por culpa de la caché o algo. Un saludo, Javier.
Hola soy de Chile y los formatos de precios no cuadran del todo, aquí no usamos coma, pero eso no es tan relevante para leer las cifras, mi problema es que tengo productos de $1.000.000 (un millon de pesos) pero al guardar la cifra prestashop la convierte en $1.000 (mil pesos) , ¿como hacer para que se guarden todos los dígitos necesarios?
gracias de antemano
Mira la documentación oficial de Prestashop a ver si ves algo. Ahora mismo no tengo ningún prestashop donde hacer la prueba. Me he pasado a WooCommerce ;). Saludos.
Gracias Javier, ya había revisado la documentación pero no hay pistas sobre este asunto. Por el momento no exhibiré los productos de más de un millón.
saludos!
Gracias , me ha sido muy útil, yo lo he realizado sobre un prestashop 1.6 , por cierto ¿Porque has migrado a woocommerce ?
Me alegro que te haya sido de utilidad. Pues cambié Prestashop por WooCommerce por mantenibilidad y el SEO. Diseñar cualquier página o añadirle contenido nuevo es muy costoso. Y el SEO es más fácil de gestionar en WordPress. Posiciona muchísimo mejor que Prestashop para mi gusto, y las posibilidades que ofrece son brutales. Es cierto que Prestashop está más enfocado a gestionar miles de productos, y que con WooCommerce puede ser algo más tedioso, pero el SEO manda, y que WordPress ya sea un blog de por sí ayuda mucho a que consiga más visitas. Un saludo.