Por algún motivo no es posible editar los títulos de las imágenes en versiones anteriores a la 1.6.1.0, cosa que limita un aspecto Seo tan importante como es gestionar la información del título de las imágenes. Como hay muchas tiendas que están en versiones 1.6.0.14 o anteriores y no se pueden permitir actualizar (por muchos motivos) siguiendo unos pasos se puede conseguir hacerlo.
En 1.6.1.0 y adelante, se puede editar aunque no es la forma ideal, ya que tienes que ir una por una. Así que este tutorial es también válido para estas versiones ya que permite hacerlo de una forma mas amigable.
De hecho esta “receta” se aplico hace un tiempo a una 1.6.0.9, versión que ya lleva algún tiempo por ahí con muy buenos resultados. Ahora se ha replicado de igual forma a una 1.6.0.14 y 1.6.1.4 para testear este tuto.
Posiblemente estos pasos sirvan también para las 1.5
Modificar plantilla images.tpl
Se trata de modificar la plantilla de imágenes del backoffice
Se copia el original de
adminbackoffice\themes\default\template\controllers\products\images.tpl
a la carpeta override
override\controllers\admin\templates\products\images.tpl
Buscamos en el fichero images.tpl
<td>legend</td>
y lo substituimos por la edición multilenguaje:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<td> <div class="col-lg-12"> {foreach from=$languages item=language} {if $languages|count > 1} <div class="translatable-field row lang-{$language.id_lang}"> <div class="col-lg-10"> {/if} <input type="text" id="prod_img[idprodimg][{$language.id_lang}]" {if isset($input_class)}class="{$input_class}"{/if} name="prod_img[idprodimg][{$language.id_lang}]" value="listImg_value_{$language.id_lang}" disabled="disabled" {*egp mod creamos este campo plantilla deshabilitado para que luego no se envíe. Al copiar ya se habilitara*} /> {if $languages|count > 1} </div> <div class="col-lg-2"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" tabindex="-1"> {$language.iso_code} <span class="caret"></span> </button> <ul class="dropdown-menu"> {foreach from=$languages item=language} <li> <a href="javascript:hideOtherLanguage({$language.id_lang});">{$language.name}</a> </li> {/foreach} </ul> </div> </div> {/if} {/foreach} </div> </td> |
Cambiamos la función js imageLine, tanto la función como la llamada.
La función imageLine original es algo así
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function imageLine(id, path, position, cover, shops, legend) { line = $("#lineType").html(); line = line.replace(/image_id/g, id); line = line.replace(/(\/)?[a-z]{0,2}-default/g, function($0, $1){ return $1 ? $1 + path : $0; }); line = line.replace(/image_path/g, path); line = line.replace(/image_position/g, position); line = line.replace(/legend/g, legend); line = line.replace(/icon-check-empty/g, cover); line = line.replace(/<tbody>/gi, ""); line = line.replace(/<\/tbody>/gi, ""); if (shops != false) { $.each(shops, function(key, value){ if (value == 1) line = line.replace('id="' + key + '' + id + '"','id="' + key + '' + id + '" checked=checked'); }); |
Se substituye por
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
function imageLine(id, path, position, cover, shops, legendJsonArray,cargaInicial) { line = $("#lineType").html(); line = line.replace(/image_id/g, id); line = line.replace(/(\/)?[a-z]{0,2}-default/g, function($0, $1){ return $1 ? $1 + path : $0; }); line = line.replace(/image_path/g, path); line = line.replace(/\.jpg"\s/g, '.jpg?time=' + new Date().getTime() + '" '); line = line.replace(/image_position/g, position); //line = line.replace(/legend/g, legend); egp mod legendas editables..Ahora nos llega un array en json if (typeof cargaInicial != 'undefined'){ //se construye la tabla dinámicamente al cargar la página. Ahora nos llega el array entero legendJsonArray = $.parseJSON(legendJsonArray); }else{//venimos de subir una imagen (ajax.tpl del uploader) legend=legendJsonArray; legendJsonArray={}; legendInput=$('input[name^=legend]'); $.each(legendInput, function(i, input) { lang_id_arr=input['name'].split('_'); legendJsonArray[lang_id_arr[1]]=input['value'];//cogemos los valores del input titulo }); } $.each(legendJsonArray, function(i, item) { search='listImg_value_'+i; replace=item; line = line.replace(search, replace); line = line.replace(/idprodimg/g, id); line = line.replace('disabled="disabled"', ''); //lo habilitamos. }); line = line.replace(/icon-check-empty/g, cover); line = line.replace(/<tbody>/gi, ""); line = line.replace(/<\/tbody>/gi, ""); if (shops != false) { $.each(shops, function(key, value){ if (value == 1) line = line.replace('id="' + key + '' + id + '"','id="' + key + '' + id + '" checked=checked'); }); } $("#imageList").append(line); } |
Luego la llamada pasa de
1 |
imageLine({$image->id}, "{$image->getExistingImgPath()}", {$image->position}, "{if $image->cover}icon-check-sign{else}icon-check-empty{/if}", assoc, "{$image->legend[$default_language]|@addcslashes:'\"'}"); |
a ser
1 |
imageLine({$image->id}, "{$image->getExistingImgPath()}", {$image->position}, "{if $image->cover}icon-check-sign{else}icon-check-empty{/if}", assoc, "{$image->legend|@json_encode|@addcslashes:'\"'}", true); |
Es decir añadimos todo el array de leyendas de la imagen en lugar de sólo la default $image->legend[$default_language], a parte de indicarle con un nuevo parametro que estamos llamandolo desde la carga inicial de la página. Esto es para distinguir de otra llamada que se puede realizar al subir una nueva imagen.
De esta forma tenemos la parte frontal solucionada
Ahora falta que el controlador haga algo con esta información que se ha editado en la parte frontal
Añadir funcionalidad al controlador AdminProductsController
Sobrescribimos el controlador AdminProductsController en override\controllers\admin\AdminProductsController.php.
Simplemente la función processUpdate() llama al padre y recoge la nueva información para modificarla directamente en base de datos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class AdminProductsController extends AdminProductsControllerCore { /*egp mod sobrescrito para poder modificar los títulos de las imágenes*/ public function processUpdate() { $product=parent::processUpdate(); if (empty($this->errors)){ if($prod_img_arr=$_POST['prod_img']){ foreach ($prod_img_arr as $id_image=>$prod_img){ foreach ($prod_img as $id_lang=>$value_legend){ Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'image_lang` SET `legend` ="'.$value_legend.'" WHERE `id_image` = '.(int)$id_image.' AND `id_lang`='.(int)$id_lang); } } } } return $product; } } |
No olvidarse de borrar cache\class_index.php para que la sobrescritura tenga efecto.