Post Top Ad

Your Ad Spot

miércoles, 26 de agosto de 2020

Haga que los campos de productos sean multilingües en PrestaShop y ThirtyBees

En este tutorial aprenderemos cómo hacer que los campos de productos sean traducibles en PrestaShop 1.6 y veremos cómo aplicar el método al campo "precio por ...".

Introducción

Es posible que haya encontrado la necesidad de traducir el campo de precio por unidad en su PrestaShop o Thirtybees, pero se estrelló contra la limitación del software, ya que es una propiedad de un solo idioma. Cualquier campo de producto puede hacerse en varios idiomas con una simple modificación, así que veamos cómo hacerlo usando el de Unity como ejemplo en este tutorial.

Paso 1: agregar la nueva columna de la base de datos

Para que el campo sea traducible, tenemos que agregarlo a la tabla product_lang en la base de datos. No solo, sino que también tenemos que borrar la misma columna en las tablas product y product_shop, para evitar conflictos al recuperar valores de la base de datos. ¡Agreguémoslo primero!
Usando phpMyAdmin o Adminer, ubique la tabla * prefix * product_lang en su base de datos y agregue una nueva columna como VARCHAR , de 24 caracteres. Una vez hecho esto, se verá así:
multilang_field_db
A continuación, eliminemos las sobras: abra la tabla de productos * prefijo * y suelte la columna de la unidad primero, y luego en la tabla product_shop .
¡Hemos terminado! Sin embargo, simplemente rompimos la clase Producto y tenemos que compensarlo haciéndole saber de dónde obtener los nuevos valores.

Paso 2: editar la clase de producto

Tenemos una nueva columna en la base de datos, pero en este punto la clase Producto todavía la ignoraría. Para que busque y guarde en la tabla correcta, debemos decirle que la propiedad que queremos traducir es un campo multilenguaje. Para hacerlo, debemos cambiar su definición.
Abra Product.php , ubicado en la carpeta classes / .
Desplácese hacia abajo hasta encontrar la siguiente línea, parte de la propiedad $ definition :
1
'unity'                     => ['type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isString'],
Para hacer cualquier campo traducible, simplemente podemos agregar 'lang' => verdadero de la siguiente manera
1
'unity'                     => ['type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isString', 'lang' => true],
Tenga en cuenta que, como siempre, se recomienda encarecidamente utilizar una anulación, en lugar de editar los archivos principales.

Paso 3: editar el back office

El controlador

Esta es la parte más complicada, ya que tendremos que editar tanto el controlador de administración de los productos como la plantilla correcta. Para nuestro ejemplo, la plantilla es precios.tpl , pero será diferente si el campo que desea traducir está en otra pestaña.
Comencemos con el controlador. La plantilla de precios no nos ofrece ninguna opción para traducir campos y, por lo tanto, pierde la indispensable variable $ languages.
Abra AdminProductsController , ubicado en controllers / admin
Estamos interesados ​​en el método llamado initFormPrices , por lo que una vez que lo encuentre, simplemente puede clonarlo para anularlo o continuar editando el núcleo.
Justo después de asignar $ data, al comienzo de la función, pero antes de $ product = $ obj , agregue lo siguiente
1
2
3
4
5
6
7
8
if (!$this->default_form_language) {
    $this->getLanguages();
}
$data->assign(array(
    'languages'=> $this->_languages,
    'id_lang' => $this->context->language->id,
    'default_form_language' => $this->default_form_language,
));
Explicación : Nada demasiado complejo aquí, primero estamos verificando si los idiomas están cargados y, si no, asignándolos al controlador. Luego, simplemente asignamos esa propiedad de clase a la plantilla, junto con algunas otras necesarias. Tenga en cuenta que no usamos una asignación inteligente común, sino la variable $ data.

La plantilla

¡Es hora de hacer visibles nuestros cambios en el back office! Para el campo de unidad, abramos * carpeta de administración * / themes / default / template / controllers / products / Prices.tpl
Busque la entrada con id unity, que se verá más o menos como lo siguiente:
1
<input id="unity" name="unity" type="text" value="{$product->unity|htmlentitiesUTF8}"  maxlength="255" onkeyup="if (isArrowKey(event)) return ;unitySecond();" onchange="unitySecond();"/>
En lugar de esta entrada, utilizaremos una plantilla útil que PrestaShop pone a nuestra disposición. Reemplace lo anterior con el siguiente código:
1
2
3
4
5
{include file="controllers/products/input_text_lang.tpl"
languages=$languages
input_class="{$class_input_ajax}{if !$product->id || Configuration::get('PS_FORCE_FRIENDLY_PRODUCT')}copy2friendlyUrl{/if} updateCurrentText"
input_value=$product->unity
input_name="unity"}
Guarde y actualice, y verá el nuevo campo, traducible, que aparece en la tabla de precios del back office. Es hora de probarlo y ver si se está guardando correctamente.
Podemos dar un paso más y traducir la vista previa a continuación también:
1
<span id="unity_second">{$product->unity}</span>
a
1
<span id="unity_second">{$product->unity.{$id_lang}}</span>
En este punto, podemos seguir adelante y probar el Front Office. Si todo se ha hecho correctamente, tan pronto como cambie de idioma, la clase debería elegir automáticamente la traducción correcta para el campo. ¡Ordenado!

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas