Устраняем проблему с удалением тегов в prestashop

Рассмотрим работу с этим модулем (blocktags версия 1.3.1) для свежей на данный момент версии prestashop 1.6.1.15. Создадим теги для одного из товара:
Посмотрим результат в таблицах БД:
Содержимое таблицы ps_tag:
Содержимое таблицы ps_tag_count:
Содержимое таблицы ps_product_tag:
Всё отлично работает, вот результат работы блока тегов во фронт офисе:
Теперь удалим один их тегов через форму списка тегов:
И посмотрим, что происходит в таблицах БД:
Изменилось содержимое только таблицы ps_tag:
В остальных вышеперечисленных таблицах изменений не произошло. Причем удаление тегов через карточку товара происходит без проблем. Вот результат работы блока тегов во фронт офисе в случае удаления тегов через форму списка тегов:
Можно предположить, что функционал удаления тегов через форму списка тегов просто забыли написать. Таким образом, происходит незаметное замусоривание таблиц ps_tag_count и ps_product_tag, если товаров с тегами очень много и удаление происходит через форму списка тегов.
Вылечить это просто, добавив в AdminTagsController.php такие строки:
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 |
/** * Delete multiple items * * @return bool true if success */ protected function processBulkDelete() { if (is_array($this->boxes) && !empty($this->boxes)) { foreach ($this->boxes as $id) { Db::getInstance()->execute('DELETE pt FROM `'._DB_PREFIX_.'tag_count` pt WHERE pt.`id_tag` = '.(int)$id); Db::getInstance()->execute('DELETE pt FROM `'._DB_PREFIX_.'product_tag` pt WHERE pt.`id_tag` = '.(int)$id); } } return parent::processBulkDelete(); } /** * Object Delete * * @return ObjectModel|false * @throws PrestaShopException */ public function processDelete() { if (Validate::isLoadedObject($object = $this->loadObject())) { Db::getInstance()->execute('DELETE pt FROM `'._DB_PREFIX_.'tag_count` pt WHERE pt.`id_tag` = '.(int)$object->id); Db::getInstance()->execute('DELETE pt FROM `'._DB_PREFIX_.'product_tag` pt WHERE pt.`id_tag` = '.(int)$object->id); } return parent::processDelete(); } |
Функции, при обращении к ним из списка тегов, удаляют выделенные строки из БД. Сделать это лучше же конечно через Override папку. Как результат, всё работает как и должно. Для того, чтобы изменения вступили в силу нужно чистить кеш.
Файл AdminTagsController.php упакован в архив, который можете скачать здесь:
[download id=»1387″]