Устранение проблем с атрибутом alt в prestashop 1.5.x

Вот так выглядит отображение изображения в карточке товара:
Редактирование изображений товара в админ панели выглядит следующим образом:
Редактирование изображений товара в админ панели prestashop 1.4.x выглядит следующим образом:
Есть несколько способов решения проблемы:
A. Заменить переменную, которая выводит alt для картинок (legend) другими переменными, к примеру: наименованием товара (name), кратким описанием товара (description_short) или какими попадутся.
Используя этот способ, нужно заменить все переменные legend в шаблонах темы, используемых модулей на понравившуюся вам переменную товара. К примеру, находим в карточке товара:
{$image.legend|htmlspecialchars} - переменная описания картинки
И меняем ее на:
{$product->name|escape:'htmlall':'UTF-8'} - переменная названия товара
Этот способ подойдет, если товар уже есть в магазине, и менять большое количество описаний картинок сложно и трудоемко.
Б. Исправить баг и решить проблему изменения описания картинок товара напрямую из админ панели в карточке товара.
В базе данных стандартного prestashop 1.5.x уже есть поле для хранения описания изображения в таблице ps_image_lang, называется оно legend, однако оно не используется. Поэтому описания будут загружать именно туда:
Для этого понадобятся два файла:
1. domen\admin_ka\themes\default\template\controllers\products\images.tpl — шаблон вывода изображений в админ панели карточки товара.
2. domen\controllers\admin\AdminProductsController.php — контроллер управления карточкой товара.
Первый файл отвечает за интерфейс отображения и загрузки картинок. Добавим в него нужное текстовое поле alt, которое будет, выводится возле каждой картинки и редактироваться пользователем.
Находим 67 строку в файле images.tpl и вставляем шапку поля таблицы:
<th>{l s='Alt'}</th>
Находим 98 строку и вставляем содержание для таблицы:
<td class="center cover"><input type="text" name="alt_image" id="alt_image_id" disabled="disabled" /></td>
На 100 строке добавим, кнопку действия — редактирования описания изображения, перед кнопкой удаления изображения:
<a href="#" class="edit_product_image" > <img src="../img/admin/edit.gif" alt="{l s='Edit alt of this image'}" title="{l s='Edit description'}" /> </a>
Форма готова, и выглядит следующим образом:
Осталось обработать действия пользователя. Находим 138 строку после функции обработки линий изображений:
imageLine({$image->id}, "{$image->getExistingImgPath()}", {$image->position}, "{if $image->cover}enabled{else}forbbiden{/if}", assoc);
и после нее вставляем функцию заполнения описаний изображений при загрузке страницы:
doAdminAjax({ "action":"fillProductImageEdit", "id_image":{$image->id}, "token" : "{$token}", "tab" : "AdminProducts", "ajax" : 1 }, dataRes );
Она будет выдавать результат запроса к контроллеру в функцию dataRes() — заполнения текстовых полей описаний изображения.
Сразу перед функцией afterDeleteProductImage, строка 221, создаем обработку нажатия на кнопку редактирования описания изображения и функцию заполнения:
$('.edit_product_image').die().live('click', function(e) { e.preventDefault(); id = $(this).parent().parent().attr('id'); if ($(this).hasClass("edit_alt")){ $(this).removeClass('edit_alt'); $(this).find("img").attr("src", "../img/admin/enabled.gif"); $("#alt_"+id).removeAttr("disabled"); } else { $(this).addClass('edit_alt'); $(this).find("img").attr("src", "../img/admin/edit.gif"); $("#alt_"+id).attr("disabled","disabled"); doAdminAjax({ "action":"editProductImage", "id_image":id, "text_alt" : $("#alt_"+id).val(), "token" : "{/literal}{$token}{literal}", "tab" : "AdminProducts", "ajax" : 1 }); } }); /** * legend function */ function dataRes(data) { data = $.parseJSON(data); if (data) $("#alt_"+data.id_image).val(data.legend); }
Обработка действий из интерфейса выполняется двумя функциями в контроллере AdminProductsController.php, вставим их туда:
public function ajaxProcessEditProductImage() { $res = true; $id_lang = (int)Context::getContext()->language->id; /* Edit product image */ $res &amp;amp;amp;amp;= Db::getInstance()->execute(' UPDATE <code>'._DB_PREFIX_.'image_lang</code> il SET il.<code>legend</code> = "'.Tools::getValue('text_alt').'" WHERE il.<code>id_image</code> = '.(int)Tools::getValue('id_image').' and il.<code>id_lang</code> = '.$id_lang); if (!$res) $this->jsonError(Tools::displayError('An error occurred while attempting to edit the product image.')); } public function ajaxProcessFillProductImageEdit() { $id_lang = (int)Context::getContext()->language->id; /* Fill text field */ $result = Db::getInstance()->executeS(' SELECT DISTINCT il.<code>id_image</code>, il.<code>legend</code> FROM<code>'._DB_PREFIX_.'image_lang</code> il WHERE il.<code>id_image</code> = '.(int)Tools::getValue('id_image').' and il.<code>id_lang</code> = '.$id_lang); die(Tools::jsonEncode($result[0])); }
Полученный результат представлен на рисунках:
И вывод описания alt картинки:
Как уже говорилось, поле legend в таблице ps_image_lang есть и оно не используется, поэтому создавать дополнительное поле не нужно. Код тестировался на версии prestashop 1.5.4.1. Скачать файлы одним архивом.
Сделал все в точности как описано, а в адмике все работает, кроме Каталог-Товары. Пишет «Произошла ошибка. Сервер не может отобразить страничку». Жаль, классная статейка…
Ошибка у меня именно в AdminProductsController.php
В первом все появляется, а после именения AdminProductsController.php страница товара ломается. Может там что-то там еще нужно писать для не понимающих в программировании (для меня)?
Там в архиве в файле AdminProductsController.php две функции, их нужно скопировать и вставить в ваш AdminProductsController.php, ничего сложного
Да, именно так я и сделал. И после такого изменения файла страница товаров в админке становится недоступной.
Очевидно, что в AdminProductsController.php вы нарушаете целостность, неправильно вставляете, проверьте вставить нужно только:
public function ajaxProcessEditProductImage()
{
$res = true;
$id_lang = (int)Context::getContext()->language->id;
/* Edit product image */
$res &= Db::getInstance()->execute(‘
UPDATE
'._DB_PREFIX_.'image_lang
ilSET il.
legend
= «‘.Tools::getValue(‘text_alt’).'» WHERE il.id_image
= ‘.(int)Tools::getValue(‘id_image’).’ and il.id_lang
= ‘.$id_lang);if (!$res)
$this->jsonError(Tools::displayError(‘An error occurred while attempting to edit the product image.’));
}
public function ajaxProcessFillProductImageEdit()
{
$id_lang = (int)Context::getContext()->language->id;
/* Fill text field */
$result = Db::getInstance()->executeS(‘
SELECT DISTINCT il.
id_image
, il.legend
FROM'._DB_PREFIX_.'image_lang
ilWHERE
il.
id_image
= ‘.(int)Tools::getValue(‘id_image’).’and il.
id_lang
= ‘.$id_lang);die(Tools::jsonEncode($result[0]));
}
Проверил на престе 1.5.2.0 и код тоже работает
На 1.5.5.0 проверено, работает.
Здравствуйте!
Скажите пожалуйста конкретней, в какое место AdminProductsController.php
вставлять
public function ajaxProcessEditProductImage()
{
$res = true;
$id_lang = (int)Context::getContext()->language->id;
/* Edit product image */
$res &= Db::getInstance()->execute(‘
UPDATE
’._DB_PREFIX_.’image_lang
ilSET il.
legend
= «‘.Tools::getValue(‘text_alt’).’» WHERE il.id_image
= ‘.(int)Tools::getValue(‘id_image’).’ and il.id_lang
= ‘.$id_lang);if (!$res)
$this->jsonError(Tools::displayError(‘An error occurred while attempting to edit the product image.’));
}
public function ajaxProcessFillProductImageEdit()
{
$id_lang = (int)Context::getContext()->language->id;
/* Fill text field */
$result = Db::getInstance()->executeS(‘
SELECT DISTINCT il.
id_image
, il.legend
FROM’._DB_PREFIX_.’image_lang
ilWHERE
il.
id_image
= ‘.(int)Tools::getValue(‘id_image’).’and il.
id_lang
= ‘.$id_lang);die(Tools::jsonEncode($result[0]));
}
у меня ничего не выходит…часть исправлений отлично работают, но при вставке последнего кода, страница редактирования товара не отображается..
Заранее благодарю за помощь!
В любое место, без разницы
пробовал по разному, в итоге страница перестает отображаться, при удалении кода, все восстанавливается.
Значит вставляете неправильно, в вставке кода тоже есть свои тонкости.
Подскажите пожалуйста, как это сделать правильно. Я просто копирую код и вставляю в файл.
Причем проблема только с AdminProductsController.php
изменения с первой ступенью исправлений прошли «на ура»
Эта статья больше как бы для программистов, чтобы показать как можно исправить недоработку в престе. Если у вас не получается что то сделать из этой статьи, то обращайтесь. За финансовую поддержку я принимаю заказы.
Ну я разобрался, сейчас все отображается как указано в инструкции, но окно ввода описания картинки неактивно, а кнопка редактирования активна, но не результативна, идет загрузка и в итоге ничего не происходит…
Какие тонкости в вставке кода в AdminProductsController.php ? Или это секрет?! У всех одна и та-же проблема…
Когда вставляете последний код в AdminProductsController.php, нужно взять код из архива, который можно скачать под статьей. Единственное у меня надпись под картинкой без белой обводки получается((
Разобралась, надо еще картинку fancybox_sprite.png отредактировать.)) Всем удачи.
Для последних версий престы 1.5.х этот патч уже не актуален, так как разработчики внесли изменения в коробочную версию.
Seems to work visualy but i cant write in the text(alt) feeld ,,keep showing a «loading…» gif and then nothing happens!!
i checked the image.tpl file and all the added lines was there.
i can still add new fotos and set/chose foto to be first.
i can still delete a foto.
the button(pencil) «edit» does not work
im using prestashop 1,5,4,1
hope you can help
what might be wrong
Как это можно сделать на 1.5.6.2?
А что в 1.5.6.2 нет поддержки alt у картинки товара?
нет поля для заполнения «Легенда» у загружаемого изображения
А как такую систему реализовать в версии 1.6+
В ней прописывается имя для всех изображений, а хотелось бы иметь возможность прописать имя для каждого в ручную
Там редактировать нельзя.
Но можно написать при загрузке для каждого изображения.
Жаль. Но спасибо за ответ!
для prestashop 1.4.4 работает? есть вообще таблетка для этой версии?
Это таблетка для версии 1.5.х
очень жаль 🙁
спасибо.