Создание нового поля для товара. VirtueMart.

В данной заметке будет рассмотрен вопрос создания поля для дополнительного артикула товара (т.е. текстового поля) в компоненте интернет-магазина VirtueMart. Примерно таким же образом можно создать, например, поле-чекбокс или поле другого типа. В любом случае, алгоритм действий будет аналогичным.
1. Открываем phpMyAdmin, щелкаем по имени талички #__vm_product. Под таблицей с перечнем полей есть область для добавления нового поля.
1
Создаем новое поле типа varchar с именем product_sku2 .
21

Новое поле появилось в списке полей данной таблицы.
3

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 форму добавления товара. Любуемся на результат.
4
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} в своем шаблоне карточки товара.

Мотор! Снято! Всем спасибо ))

Отзывов (3) на

Создание нового поля для товара. VirtueMart.

  • Иван |

    Самое проблемное, найти в каком файле находится нужный кусок кода. Не только в магазине, но и в других расширениях и в самой Jooml-е. Как Вы это решаете? Простым перебором или по догадке, очень уж хлопотно.

  • ZaiSL |

    To Сергей: ок, сегодня постараюсь выкроить время и посмотреть. По результатам доложусь )

  • Сергей |

    Спасибо большое! Я уже разобрался с записью в базу: файл который здесь рабочий, просто я загружал в опере а он видимо с javascript магазина не очень дружит.
    Спасибо вам за отличную статью! Будет время пишите ещё, очень интересно.

У вас есть мнение? Оставьте свой отзыв:

Имя *
Почта *
сайт