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

Устранение проблем с атрибутом alt в prestashop 1.5.x
В появившейся новой линейке prestashop 1.5.x. разработчики, по всей видимости, отказались от использования тега alt для картинок как это было сделано в prestashop 1.4.x. В результате картинки товаров в магазине выставляются без описания, что естественно не есть хорошо для SEO, и выдачи в целом от поисковых систем.


Вот так выглядит отображение изображения в карточке товара:

Пример вывода картинки без описания в prestashop 1.5.x

Редактирование изображений товара в админ панели выглядит следующим образом:

Пример редактирования изображений в админпанели в prestashop 1.5.x

Редактирование изображений товара в админ панели prestashop 1.4.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, однако оно не используется. Поэтому описания будут загружать именно туда:

Неиспользуемые поля legend в базе данных prestashop 1.5.x

Для этого понадобятся два файла:

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>

Форма готова, и выглядит следующим образом:

Форма редактирования alt в prestashop 1.5.x

Осталось обработать действия пользователя. Находим 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;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 в prestashop 1.5.x

И вывод описания alt картинки:

Вывод alt в prestashop 1.5.x

Как уже говорилось, поле legend в таблице ps_image_lang есть и оно не используется, поэтому создавать дополнительное поле не нужно. Код тестировался на версии prestashop 1.5.4.1. Скачать файлы одним архивом.


Также Вы можете оставить комментарий:

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

  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 il
            SET 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 il
            WHERE
            il.id_image = ‘.(int)Tools::getValue(‘id_image’).’
            and il.id_lang = ‘.$id_lang);
            die(Tools::jsonEncode($result[0]));
            }

  2. Проверил на престе 1.5.2.0 и код тоже работает

  3. Triton63:

    На 1.5.5.0 проверено, работает.

  4. Кирилл:

    Здравствуйте!
    Скажите пожалуйста конкретней, в какое место 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 il
    SET 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 il
    WHERE
    il.id_image = ‘.(int)Tools::getValue(‘id_image’).’
    and il.id_lang = ‘.$id_lang);
    die(Tools::jsonEncode($result[0]));
    }

    у меня ничего не выходит…часть исправлений отлично работают, но при вставке последнего кода, страница редактирования товара не отображается..
    Заранее благодарю за помощь!

    • В любое место, без разницы

      • Кирилл:

        пробовал по разному, в итоге страница перестает отображаться, при удалении кода, все восстанавливается.

        • Значит вставляете неправильно, в вставке кода тоже есть свои тонкости.

          • Кирилл:

            Подскажите пожалуйста, как это сделать правильно. Я просто копирую код и вставляю в файл.

  5. Кирилл:

    Причем проблема только с AdminProductsController.php
    изменения с первой ступенью исправлений прошли “на ура”

    • Эта статья больше как бы для программистов, чтобы показать как можно исправить недоработку в престе. Если у вас не получается что то сделать из этой статьи, то обращайтесь. За финансовую поддержку я принимаю заказы.

      • Кирилл:

        Ну я разобрался, сейчас все отображается как указано в инструкции, но окно ввода описания картинки неактивно, а кнопка редактирования активна, но не результативна, идет загрузка и в итоге ничего не происходит…

  6. Игорь:

    Какие тонкости в вставке кода в AdminProductsController.php ? Или это секрет?! У всех одна и та-же проблема…

    • Алеся:

      Когда вставляете последний код в AdminProductsController.php, нужно взять код из архива, который можно скачать под статьей. Единственное у меня надпись под картинкой без белой обводки получается((

      • Алеся:

        Разобралась, надо еще картинку fancybox_sprite.png отредактировать.)) Всем удачи.

  7. Для последних версий престы 1.5.х этот патч уже не актуален, так как разработчики внесли изменения в коробочную версию.

  8. Michael:

    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

  9. User:

    Как это можно сделать на 1.5.6.2?

  10. 13thVoodoo:

    А как такую систему реализовать в версии 1.6+
    В ней прописывается имя для всех изображений, а хотелось бы иметь возможность прописать имя для каждого в ручную

  11. Михаил:

    для prestashop 1.4.4 работает? есть вообще таблетка для этой версии?

Оставить комментарий

пять + 4 =