Как добавить дополнительное поле к товару в 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 | <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 | <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 | // 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 | 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 | 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 | $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 | $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 | <?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 | $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"); |