В данной заметке будет рассмотрен вопрос создания поля для дополнительного артикула товара (т.е. текстового поля) в компоненте интернет-магазина 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} в своем шаблоне карточки товара.

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