26
Создание нового поля для товара. VirtueMart.
Рубрика: Joomla!В данной заметке будет рассмотрен вопрос создания поля для дополнительного артикула товара (т.е. текстового поля) в компоненте интернет-магазина VirtueMart. Примерно таким же образом можно создать, например, поле-чекбокс или поле другого типа. В любом случае, алгоритм действий будет аналогичным.
1. Открываем phpMyAdmin, щелкаем по имени талички #__vm_product. Под таблицей с перечнем полей есть область для добавления нового поля.
![]()
Создаем новое поле типа varchar с именем product_sku2 .
![]()
Новое поле появилось в списке полей данной таблицы.
![]()
2. Переходим к редактированию файла administrator/com_virtuemart/html/product.product_form.php. Этот файл содержит форму добавления/редактирования товара. Сюда нам необходимо добавить новое поле ввода для ввода значения “product_sku2″.
Находим строчку, где расположено поле для ввода артикула (product_sku). Вот такой участок кода:
1 2 3 4 5 6 7 | <tr> <td width="21%" ><div style="text-align:right;font-weight:bold;"><?php echo $VM_LANG->_PHPSHOP_PRODUCT_FORM_SKU ?>:</div> </td> <td width="79%" height="2"> <input type="text" class="inputbox" name="product_sku" value="<?php echo shopMakeHtmlSafe( $db->sf("product_sku") ); ?>" size="32" maxlength="64" /> </td> </tr> |
Копируем код и вставляем ниже. Заменяем текстовую переменную на “Еще один артикул”, а имя текстового поля на product_sku2. Должно получиться примерно так:
1 2 3 4 5 6 7 | <tr> <td width="21%" ><div style="text-align:right;font-weight:bold;"><?php echo 'Еще один артикул' ?>:</div> </td> <td width="79%" height="2"> <input type="text" class="inputbox" name="product_sku2" value="<?php echo shopMakeHtmlSafe( $db->sf("product_sku2") ); ?>" size="32" maxlength="64" /> </td> </tr> |
Сохраняем изменения. Открываем в админке VirueMart форму добавления товара. Любуемся на результат.
![]()
3. Открываем файл administrator/com_virtuemart/clases/ps_product.php
Здесь нас интересуют две функции. Первая - добавление нового товара.
Ищем участок кода, содержащий “function add“. Недалеко от начала функции, после следующего участка кода:
1 2 3 4 5 6 | $timestamp = time(); $db = new ps_DB; if (empty($d["product_publish"])) { $d["product_publish"] = "N"; } |
добавляем
1 | $product_sku2=$_POST["product_sku2"]; |
Теперь пишем значение в базу. Чуть ниже места, где мы добавили предыдущую строчку начинается большой блок вставки данных в таблицу. Добавляем product_sku2 сразу после product_sku:
1 2 3 4 5 6 7 8 9 | $q = "INSERT INTO #__{vm}_product (vendor_id,product_parent_id,product_sku,product_sku2"; $q .= "product_name,product_desc,product_s_desc,"; .............................................. .............................................. $q .= "VALUES ('"; $q .= $d['vendor_id'] . "','" . $d["product_parent_id"] . "','"; $q .= $d["product_sku"] . "','" . $d["product_name"] . "','" . $d["product_name"] . "','"; .............................................. .............................................. |
Далее, переходим к функции, отвечающей за изменение данных о товарах: function update.
Также добавлем
1 | $product_sku2=$_POST["product_sku2"]; |
и ниже, где происходит обращение к БД:
1 2 3 4 5 | $q = "UPDATE #__{vm}_product SET "; $q .= "product_sku='" . $d["product_sku"] . "',"; $q .= "product_sku2='" . $d["product_sku2"] . "',"; $q .= "vendor_id='" . $d["vendor_id"] . "',"; ............................................................ |
4. Теперь попросим VirtueMart включить данные из нашего новорожденного поля в выборку при обращении к странице просмотра товаров в категории или при просмотре карточки товара. Для этого открываем файл administrator/com_virtuemart/html/shop_browse_queries.php.
Находим в перечсилении полей для выборки (то, что записано в $fieldnames = “”, в самом начале файла) `product_sku` и после запятой добавляем `product_sku2`.
5. Сейчас самое время создать “заглушку” для шаблона категории. Для этого открываем файл administrator/com_virtuemart/html/shop_browse.php и ищем блок, начинающийся такими комментариями:
1 | /*** Now fill the template |
Находим:
1 | $product_cell = str_replace( "{product_sku}", $db_browse->f("product_sku"), $product_cell ); |
Этой строчкой формируется “заглушка” для отображения артикула товара, который мы используем в шаблоне в виде: {product_sku}.
Добавляем заглушку для нашего нового поля:
1 | $product_cell = str_replace( "{product_sku2}", $db_browse->f("product_sku2"), $product_cell ); |
6. Открываем шаблон категории (по умолчанию browse_1.php) и добавляем {product_sku2} в нужное место.
7. Для добавления “заглушки” в шаблон полного описания товара:
- открываем файл administrator/com_virtuemart/html/shop.product_details.php, почти в самом конце файла после:
1 | $template = str_replace( "{product_sku}", $db_product->f("product_sku"), $template ); |
добавляем:
1 | $template = str_replace( "{product_sku2}", $db_product->f("product_sku2"), $template ); |
и используем {product_sku2} в своем шаблоне карточки товара.
Мотор! Снято! Всем спасибо ))





Самое проблемное, найти в каком файле находится нужный кусок кода. Не только в магазине, но и в других расширениях и в самой Jooml-е. Как Вы это решаете? Простым перебором или по догадке, очень уж хлопотно.
To Сергей: ок, сегодня постараюсь выкроить время и посмотреть. По результатам доложусь )
Спасибо большое! Я уже разобрался с записью в базу: файл который здесь рабочий, просто я загружал в опере а он видимо с javascript магазина не очень дружит.
Спасибо вам за отличную статью! Будет время пишите ещё, очень интересно.