Как добавить дополнительное поле к товару в VirtueMart 1.1.6

16.06.2012
Тривиальная работа «добавить поле к товару» в VirtueMart 1.1.6 обернулась неожиданной проблемой!

Но все по порядку. Начнем с самого начала:

Задача: Добавить поле «наличие» (availability) которое может принимать значение «Да или «Нет».
Поле должно изменяться в панели администрирования.
А отображаться в карточке товара и в листе товаров (около каждого).

Шаг 1. Создание поля в базе данных MYSQL.
В базе данных магазина находим таблицу _vm_product и добавляем в нее поле availability (TinyInt 2)
По желанию можно сделать:

UPDATE `ИмяТаблицы` SET availability  = 1

- т.к. обычно большее количество товаров есть в наличии.

Шаг 2. Добавление поля в панели администрации (в виде выпадающего списка -select).

В файле /administrator/components/com_virtuemart/html/product.product_form.php находим

1
2
3
4
    <td width="71%"  valign="top">
        <textarea class="inputbox" name="product_s_desc" id="short_desc" cols="35" rows="6" ><?php echo $db->sf("product_s_desc"); ?></textarea>
    </td>
</tr>

И после добавляем:

1
2
3
4
5
6
7
8
9
10
11
<tr class="row1">
    <td width="29%" valign="top">
        <div style="text-align:right;font-weight:bold;">В наличии:</div>
    </td>
    <td width="71%"  valign="top">
        <select size="1" name="availability">
            <option <? echo $db->sf("availability")?'selected=selected':'';?> value="1">Да</option>
            <option <? echo $db->sf("availability")?'':'selected=selected';?> value="0">Нет</option>
        </select>
    </td>
</tr>

Шаг 3. Связь с БД
Откройте файл /administrator/components/com_virtuemart/classes/ps_product.php и найдите:

1
2
// Insert into DB
$fields = array ( 'vendor_id' => $vendor_id,

Дальше должен идти список полей, добавляем свое поле:

1
'availability' => vmGet($d,'availability'), //$d['availability'] //vmRequest::getInt('availability')

У меня сработал именно вариант vmGet($d,'availability') , но оставил и другие варианты (возможно понадобятся если будет другой тип данных)

Хочу обратить внимание, что прописать дополнительное поле нужно два раза, в функции add и в функции update

Теперь нужно найти два запроса:

1
2
3
if ( $category_id ) {
    $q  = "SELECT DISTINCT product_sku,real_{vm}_product.product_id,product_name,product_s_desc,product_thumb_image, product_full_image, product_in_stock, product_url, availability FROM real_{vm}_product, real_{vm}_product_category_xref, real_{vm}_category WHERE \n";

и

1
2
else {
    $q  = "SELECT DISTINCT product_sku,product_id,product_name,product_s_desc,product_thumb_image, product_full_image, product_in_stock, product_url, availability FROM real_{vm}_product WHERE ";

В оба запроса нужно добавить новое поле ", availability"

Ищем код:

1
2
3
4
$recent[$k]['product_s_desc'] = $db->f("product_s_desc");
    if($recent[$k]['product_s_desc']=="" && !empty($prod_id_p)) {
        $recent[$k]['product_s_desc'] = $dbp->f("product_s_desc");
    }

И после него добавляем:

1
2
3
4
$recent[$k]['availability'] = $db->f("availability");
    if($recent[$k]['availability']=="" && !empty($prod_id_p)) {
        $recent[$k]['availability'] = $dbp->f("availability");
    }

Шаг 4. Выводим результат на странице товара.


Нужно отредактировать файлы, лежащие в папке:
/components/com_virtuemart/themes/default/templates/product_details/
flypage.tpl.php – основной файл
flypage-ask.tpl.php в этой папке могут быть дополнительные файлы сделанные специально для магазина.


В этих файлах будет доступна новая переменная, совпадающая с именем нового поля, в данном примере это $availability.
Эту переменную можно выдать в любом подходящем месте:

1
<?php echo $availability?>

Я же отключил вывод корзины если товара нет в наличии, для этого я заменил:
1
<span style="font-style: italic;"></span><?php echo $addtocart ?><span style="font-style: italic;"></span>

На
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  if ($availability)
  {
?>
    <b>Товар есть в наличии</b>
    <span style="font-style: italic;"></span><?php echo $addtocart ?><span style="font-style: italic;"></span>
<?php
  }
  else
  {
?>
    <span style="font-style: italic;"></span><b style="color:red">Товара нет в наличии</b><span style="font-style: italic;"></span>
<?php
  }
?>

 Шаг 5. Выводим результат в списке категории.

Вот на этом шаге и возникла проблема!


Оказалось, что в файле:
/components/com_virtuemart/themes/default/templates/browse/browse_1.php
переменная $availability не подцепилась и вставление кода вывода из прошлого примера не работает.

Не могу точно сказать с какой версии компонента появляется эта проблема, но в VirtueMart 1.1.6 нужно поправить еще один файл:
/administrator/components/com_virtuemart/html/shop_browse_queries.php


Нужно найти:

1
2
3
4
5
$products[$i]['product_name'] = shopMakeHtmlSafe( $product_name );
$products[$i]['product_s_desc'] = $product_s_desc;
$products[$i]['product_details'] = $product_details;
$products[$i]['product_rating'] = $product_rating;
$products[$i]['product_price'] = $product_price;

И после добавить
1
$products[$i]['availability'] = $db_browse->f("availability");


Категории: VirtueMart 1.X
Яндекс.Метрика