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