Дополнительные параметры (свойства) товара Virtuemart
Обратился ко мне клиент с просьбой разработать функционал для добавления дополнительных свойств товара. Таких как вес, габариты, длина и т.п.
Ну, я клиенту, мол, в Virte есть такой функционал. Когда добавляем товар, можно перейти на вкладочку "Габариты и вес" и указать требуемые параметры. "Э-э-э, нет" - сказал мне клиент. "Там можно указать только жёстко заданные параметры, а что если мне нужно указать материал, из которого сделано то или иное изделие. "
Ну я, не будь дураком, предложил добавить требуемые поля в админку, также "жёстко", но клиент привёл железный аргумент. "А если," - говорит он - "я завтра захочу добавить ещё один параметр? А если вдруг какой-то станет ненужным вообще? Я может вообще завтра поменяю перечень товаров и начну продавать утиное перо. Нафига мне нужна тогда длина?"
Как, говорится, хозяин - барин. Надо - значит сделаем. Вирт установлен, чай заварен и налит, можно приступать к работе. Тем более, вчера мне привезли из Казахстана шаманские тапки Хоттабыча, вот такие:
Не оказалось под рукой фотоаппарата, поэтому щёлнул на свой древний телефон. Ну да не суть, в таких тапках работа пойдёт споро, даже бубен не потребуется. ))
Если у кого-то появятся критические замечания, предложения по улучшению кода - рад буду выслушать, принять во внимание и применить.
Теоретически всё это безобразие я видел так:
Сразу хотел бы сказать, что изначально я предложил клиенту сделать отдельный список параметров для каждой категории (на мой взгляд так было бы рациональней), однако клиент настоял на том, чтобы список был общим, а во flypage выводилось бы уже только то, что было заполнено при добавлении товара.
По структуре таблицы я решил сделать так:
Первая таблица будет содержать поля для ввода id параметра, его имени. Вторая таблица будет содержать id товара, id параметра, значение параметра. Ну что-то типа такого:
С первой таблицей всё понятно, во второй же я сейчас схематически показал, что для товара с заданы три параметра: вес (id = 1), высота (id = 2), материал (id = 3) с соответствующими значениями.
Хотел бы остановиться на том, что данный материал я писал в процессе разработки функционала и первая таблица на самом деле будет иной. Изначально в первой таблице я планировал сделать только два столбца, но но в последствии решил добавить ещё два, один из которых будет хранить метку, опубликован параметр или нет, а второй будет отвечать за сортировку, чтобы клиент мог выводить параметры в той последовательности, в которой ему необходимо.
Сначала нужно решить первый пункт задачи. Т.е. сделать функционал добавления параметров. При этом, повторюсь, нужно предусмотреть возможность выключения, удаления, редактирования и сортировки.
ЧАСТЬ ПЕРВАЯ. Реализация функционала добавления параметров, создание списка параметров.
Шаг 1. Добавляем в БД таблицу 1.
Выполняем запрос в БД. Не забываем указывать вместо jos свой префикс.
Шаг 2. Добавляем ссылку в меню админки Virtuemart.
Редактируем файл /administrator/components/com_virtuemart/header.php
В районе 283 строки, после кода:
Добавляем пункт меню:
Редактируем языковой файл /administrator/components/com_virtuemart/languages/common/russian.php
Вставляем в любое место страницы (я вставил после 432 строки) код:
Обновляем страницу вирта в админке. Должны увидеть нашу ссылку.
Шаг 3. Правим файлы.
Открываем файл /administrator/components/com_virtuemart/toolbar.php. После 80 строки:
Открываем файл /administrator/components/com_virtuemart/toolbar.virtuemart.php. После 74 строки:
Шаг 4. Добавляем новые файлы.
Сначала хотел расписать код, но тогда получится не статья, а длинная портянка. Поэтому я прилагаю данные файлы архивом.
Cкачиваете архив, распаковываете. Внутри будет папка administrator, копируете её в корень сайта, при этом добавляются новые, необходимые для работы файлы, а именно: ps_product_param.php, product.product_param_list.php и product.product_param_form.php.
Шаг 5. Прописываем функции.
В админке переходим: Компоненты -> Virtuemart -> Настройки -> Список модулей, напротив модуля Product кликаем на Список функций.
После того, как перешли на страницу функций кликаем на кнопку Новый вверху и прописываем следующие значения:
Имя функции: paramAdd
Имя класса: ps_product_param
Метод класса: add
Права на функцию: storeadmin, admin
Описание: Добавление параметра
Сохраняем параметр и добавляем новый.
Имя функции: paramDelete
Имя класса: ps_product_param
Метод класса: delete
Права на функцию: storeadmin, admin
Описание: Удаление параметра
Сохраняем параметр и добавляем новый.
Имя функции: paramUpdate
Имя класса: ps_product_param
Метод класса: update
Права на функцию: storeadmin, admin
Описание: Обновление параметра
Сохраняем параметр и добавляем новый.
Имя функции: paramReorder
Имя класса: ps_product_param
Метод класса: reorder
Права на функцию: storeadmin, admin
Описание: Сортировка параметров
Всё, первая часть задачи завершена. Проверяем работу функционала.
ЧАСТЬ ВТОРАЯ. Добавляем параметры в товар.
Шаг 1. Добавляем новую вкладку.
Как должна выглядеть страница, на которой к товару будут добавляться опции, я уже показывал выше. Сначала сделаем вкладку и, собственно, саму страницу.