Иногда возникает необходимость сделать дополнительное поле для товара в VirtueMart, которое будет отображаться в админке управления товаром и выводится на сайте. Опыты проводим на VirtueMart 1.1.8 .
Первым делом что нужно сделать так это зайти в БД с помощью phpMyAdmin, выбрать вашу БД. В появившемся списке найти vm_product (если при установке задавали префикс базы данных, то соответственно ищем префиксvm_product ), и нажать кнопку Структура.
После того, как откроется структура vm_product, нужно добавить наше новое поле, назовем его product_doppole. Для добавления перемещаемся вниз страницы и выбираем из выпадающего списка "После" product_sku, и жмем Ок.
Далее необходимо заполнить основные поля:
Поле: product_doppole;
Тип: VARCHAR;
Длина/значения: 64;
По умолчанию: НЕТ;
Сравнение: utf8_general_ci;
и нажать кнопу Ок.
Создав новое поле в базе, вносим изменения в файл product.product_form.php расположенный по адресу: "administrator/com_virtuemart/html/". В данный файл нужно внести следующий код:
<tr class="row1">
<td width="29%" valign="top">
<div style="text-align:right;font-weight:bold;">Дополнительное поле:</div>
</td>
<td width="71%" >
<input type="text" class="inputbox" name="product_doppole" size="60" value="<?php echo $db->sf("product_doppole"); ?>" />
</td>
</tr>
Разместить новое поле ввода было решено после краткого описания о товаре, так что код был вставлен сюда:
<tr class="row1"><td colspan="2"> </td></tr>
<tr class="row1">
<td width="29%" valign="top"><div style="text-align:right;font-weight:bold;">
<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_S_DESC')?>:</div>
</td>
<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>
ВСТАВЛЯТЬ КОД СЮДА
</table>
</td>
</tr>
</table>
Особой роли не играет где разместить новое поле ввода, так что выбор за вами, только главное вставить в правильное место. Сохраняем документ, если мы указываем название поля на кириллице, то документ сохраняем в кодировке UTF-8.
Теперь, если зайти в админку и выбрать товар, то мы увидим наше добавленное поле.
Для сохранения данных введенных в это поле, вносим изменения в файл ps_product.php по адресу: "administrator/components/com_virtuemart/classes/", а именно добавляем строчку: 'product_doppole' => vmGet($d,'product_doppole'), .
Добавить её нужно в двух местах (используйте поиск по значению "// Insert into DB") т.к. код одинаковый привожу только один участок кода. Я добавил строку после строки 'product_sku' => vmGet($d,'product_sku'), ,
// Insert into DB
$fields = array ( 'vendor_id' => $vendor_id,
'product_parent_id' => vmRequest::getInt('product_parent_id'),
'product_sku' => vmGet($d,'product_sku'),<strong>
ВСТАВЛЯТЬ СТРОКУ СЮДА
</strong>'product_name' => vmGet($d,'product_name'),
'product_desc' => vmRequest::getVar('product_desc', '', 'default', '', VMREQUEST_ALLOWHTML),
Сохраняем файл, заходим в админку и тестируем сохранение и загрузку данных нашего поля.
После проверки работоспособности внесенных изменений, редактируем файл shop_browse_queries.php, по адресу: "administrator/com_virtuemart/html/". В него добавляем `product_doppole` , после `product_sku`. Получившийся код должен выглядеть так:
?
1
2
// These are the names of all fields we fetch data from
$fieldnames = "`#__{vm}_product`.`product_id`, `product_name`, `products_per_row`, `category_browsepage`, `category_flypage`, `#__{vm}_category`.`category_id`, `product_full_image`, `product_thumb_image`, `product_s_desc`, `product_parent_id`, `product_publish`, `product_in_stock`, `product_sku`, `product_doppole`, `product_url`, `product_weight`, `product_weight_uom`, `product_length`, `product_width`, `product_height`, `product_lwh_uom`, `product_available_date`, `product_availability`, `#__{vm}_product`.`mdate`, `#__{vm}_product`.`cdate`";
Сохраняем.
Теперь изменяем файл shop.browse.php, по адресу: "administrator/com_virtuemart/html/". Добавляем строку $products[$i]['product_doppole'] = $db_browse->f("product_doppole"); , добавить её нужно сюда:
// Unset these for the next product
unset($full_image_width);
unset($full_image_height);
$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;
$products[$i]['product_price_raw'] = $product_price_raw;
$products[$i]['product_sku'] = $db_browse->f("product_sku");
ДОБАВЛЯЕМ СТРОКУ СЮДА
$products[$i]['product_weight'] = $db_browse->f("product_weight");
После сохранения, в шаблоне нужно вывести наше новое поле, так что редактируем нужные вам файлы в папке по адресу: "components/com_virtuemart/themes/default".
Я добавил отображение нового поля в карточку товара, так что отредактировал flypage.tpl.php по адресу: "components/com_virtuemart/themes/default/templates/product_details", добавив в него строку <?php echo $product_doppole ?> в нужной мне позиции.