ВНИМАНИЕ!!! ЭТО СТАРАЯ ВЕРСИЯ САЙТА.
ДЛЯ ПОЛУЧЕНИЯ АКТУАЛЬНОЙ ИНФОРМАЦИИ
ПЕРЕЙДИТЕ НА WWW.DIDGO.RU
Дополнительные параметры (свойства) товара Virtuemart |
Обратился ко мне клиент с просьбой разработать функционал для добавления дополнительных свойств товара. Таких как вес, габариты, длина и т.п. Ну, я клиенту, мол, в Virte есть такой функционал. Когда добавляем товар, можно перейти на вкладочку "Габариты и вес" и указать требуемые параметры. "Э-э-э, нет" - сказал мне клиент. "Там можно указать только жёстко заданные параметры, а что если мне нужно указать материал, из которого сделано то или иное изделие?.." Ну я, не будь дураком, предложил добавить требуемые поля в админку, также "жёстко", но клиент привёл железный аргумент. "А если," - говорит он - "я завтра захочу добавить ещё один параметр? А если вдруг какой-то станет ненужным вообще? Я может вообще завтра поменяю перечень товаров и начну продавать утиное перо. Нафига мне нужна тогда длина?" Как, говорится, хозяин - барин. Надо - значит сделаем. Вирт установлен, чай заварен и налит, можно приступать к работе. Тем более, вчера мне привезли из Казахстана шаманские тапки Хоттабыча, вот такие: Не оказалось под рукой фотоаппарата, поэтому щёлнул на свой древний телефон. Ну да не суть, в таких тапках работа пойдёт споро, даже бубен не потребуется. )) Если у кого-то появятся критические замечания, предложения по улучшению кода - рад буду выслушать, принять во внимание и применить. Теоретически всё это безобразие я видел так:
Сразу хотел бы сказать, что изначально я предложил клиенту сделать отдельный список параметров для каждой категории (на мой взгляд так было бы рациональней), однако клиент настоял на том, чтобы список был общим, а во flypage выводилось бы уже только то, что было заполнено при добавлении товара. По структуре таблицы я решил сделать так: Первая таблица будет содержать поля для ввода id параметра, его имени. Вторая таблица будет содержать id товара, id параметра, значение параметра. Ну что-то типа такого: С первой таблицей всё понятно, во второй же я сейчас схематически показал, что для товара с id = 135 заданы три параметра: вес (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. Добавляем новую вкладку. Как должна выглядеть страница, на которой к товару будут добавляться опции, я уже показывал выше. Сначала сделаем вкладку и, собственно, саму страницу. Открываем файл /administrator/components/com_virtuemart/languages/product/russian.php. В любое место вставляем код: Я вставлял после 36 сроки. Далее открываем файл /administrator/components/com_virtuemart/html/product.product_form.php. После 100 строки: Вставляем код: После 373-375 строк: Вставляем код: Теперь заходим в любой товар и видим появившуюся вкладку:
Шаг 2. Добавим таблицу в БД MySQL. Выполняем в запрос в БД, не забываем менять префикс jos на свой:
Шаг 3. Допишем функции. Сначала допишем функцию add, чтобы параметры сохранялись при добавлении нового товара. Открываем файл /administrator/components/com_virtuemart/classes/ps_product.php После 370-372 срок: Добавим наш код: Можете проверить. Создать новый продукт и внести параметры. Замечу, что параметры сохранятся, но редактироваться не будут, так как нужно дописать функцию update. Тут я немного завис. На прошлом этапе мы прописали код для добавления параметров. Проще было бы добавлять в БД сразу все параметры, даже те, которые не заполнены при добавлении товара и хранить тупо в NULL. Допустим для одного товара мы будем использовать параметры вес и длина, а для другого - ширина и высота. Писать в базу придётся всё равно все параметры и для первого и для второго товара. Я терпеть не могу, когда в базе хранится то, что, возможно, никогда и использоваться-то не будет. Поэтому решил пойти по чуть более сложному, но более правильному, на мой взгляд, пути. Мы будем писать в базу не всё подряд, а только те параметры, которые были заполнены при добавлении / редактировании товара. Но тогда придётся делать несколько проверок:
В этом же файле после строк 557-560: Допишем свой код. Всё, можно проверить работоспособность. Остался один момент. Когда товар удаляется, нам нужно стереть из базы все параметры, заданные для этого товара, поэтому в этом же файле, после 846-849 строк: Допишем свой код:
ЧАСТЬ ТРЕТЬЯ. Вывод параметров в карточке товара.
Тут всё просто. В используемый flypage вставляем код: Параметры вывелись. Оформляем как угодно через CSS. Всё, работа закончена. |
Вы можете отблагодарить автора:
WMR - R166832041362
WMZ - Z314865156270
QIWI - 9638061071
Яндекс деньги - 41001228750313
Комментарии
"Forbidden
You don't have permission to access /http://localhost/vadim/administrator/index.php on this server." проверил снова все ли там где нада, все ок...
Подтверждаю, инструкция полностью работоспособна!
Все, мой косяк, ошибся в коде((( Теперь все работает, огромное спасибо! Реально очень полезная доработка!
Вот она по какой-то причине не работает( Т.е. при создании новой позиции те поля которые я заполнил сохраняются, а вот если я пытаюсь что-то изменить - то ничего не происходит, только через phpmyadmin( сделал все согласно инструкции...
Функция update реализована и описана в 3 шаге данной инструкции.