Почитать другие заметки или статьи

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

Вопрос, безусловно, философский и если у вас есть желание его обсудить, милости прошу в мою группу по ссылке ниже:

https://vk.com/sitogon

С уважением, Владимир Егоров