В свободное от программирования время я занимаюсь созданием демонстрационного сайта, который будет посвящён компоненту 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 создана огромная база шаблонов.
Вопрос, безусловно, философский и если у вас есть желание его обсудить, милости прошу в мою группу по ссылке ниже:
С уважением, Владимир Егоров
Войти через Яндекс
