В свободное от программирования время я занимаюсь созданием демонстрационного сайта, который будет посвящён компоненту Virtuemart и Joomla 5. Как выяснилось, задача эта непростая, поскольку в существующем виде Virtuemart несколько не доработан. И, судя по всему, доработан никогда не будет.
Я уже писал на своем сайте об ошибках, с которыми может столкнуться владелец сайта после установки Virtuemart на Joomla 5.
Прочитать о них можно здесь и здесь.
Сегодня же я хочу поведать ещё об одной, которая появляется в момент редактирования категории.
Текст ошибки звучит, примерно так:
vmError: vmTable store insertObject #__virtuemart_category_categories Duplicate entry '2'...
После «Duplicate entry» будет идти id вашей редактируемой категории.
Когда и почему появляется эта ошибка?
Для получения данной ошибки необходимо после сохранения категории указать новую родительскую категорию и опять нажать на кнопку «Сохранить».
Ошибка появляется потому, что при изменении родительской категории в момент сохранения Virtuemart пытается в таблице virtuemart_category_categories создать запись с уже существующим ключом.
Чтобы сие не происходило, перед добавлением новой записи мы должны удалить старую.
Сделать это мы должны в файле модели категории, который расположен здесь:
administrator/components/com_virtuemart/models/category.php
Переходим на 795 строчку и дописываем код удаления старой записи. Должно получиться так:
if(!empty($data['virtuemart_category_id'])){ // Удаляем предыдущее значение $db = Factory::getContainer()->get('DatabaseDriver'); $query = $db->getQuery(true); $conditions = array( $db->quoteName('category_child_id') . ' = '.$data['virtuemart_category_id'], ); $query->delete($db->quoteName('#__virtuemart_category_categories')); $query->where($conditions); $db->setQuery($query); $db->execute(); // Завершили удаление $xdata['category_child_id'] = (int)$data['virtuemart_category_id']; $xdata['category_parent_id'] = empty($data['category_parent_id'])? 0:(int)$data['category_parent_id']; $xdata['ordering'] = empty($data['ordering'])? 0: (int)$data['ordering']; $tableXref = $this->getTable('category_categories'); $tableXref->bindChecknStore($xdata); }
Не забываем в начале файла подключить класс Factory командой:
use Joomla\CMS\Factory;
В противном случае вы получите ошибку.
Возвращаемся в административную панель, меняем родителя у нашей категории и нажимаем на кнопку «Сохранить».
О, чудо! Ошибки больше нет!
Заключение
Пытливый читатель спросит меня:
Зачем нужен компонент, который требуется постоянно исправлять?
Вероятно, затем, что он бесплатный и даже под Joomla 5 для Virtuemart создана огромная база шаблонов.
Вопрос, безусловно, философский и если у вас есть желание его обсудить, милости прошу в мою группу по ссылке ниже:
С уважением, Владимир Егоров