Создание нового поля для товара. VirtueMart.
26 Июнь 2008
В данной заметке будет рассмотрен вопрос создания поля для дополнительного артикула товара (т.е. текстового поля) в компоненте интернет-магазина VirtueMart. Примерно таким же образом можно создать, например, поле-чекбокс или поле другого типа. В любом случае, алгоритм действий будет аналогичным.
1. Открываем phpMyAdmin, щелкаем по имени талички #__vm_product. Под таблицей с перечнем полей есть область для добавления нового поля.
![]()
Создаем новое поле типа varchar с именем product_sku2 .
![]()
Новое поле появилось в списке полей данной таблицы.
![]()
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 форму добавления товара. Любуемся на результат.
![]()
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} в своем шаблоне карточки товара.
Мотор! Снято! Всем спасибо ))





2 года назад
Самое проблемное, найти в каком файле находится нужный кусок кода. Не только в магазине, но и в других расширениях и в самой Jooml-е. Как Вы это решаете? Простым перебором или по догадке, очень уж хлопотно.
2 года назад
To Сергей: ок, сегодня постараюсь выкроить время и посмотреть. По результатам доложусь )
2 года назад
Спасибо большое! Я уже разобрался с записью в базу: файл который здесь рабочий, просто я загружал в опере а он видимо с javascript магазина не очень дружит.
Спасибо вам за отличную статью! Будет время пишите ещё, очень интересно.
1 год назад
А вот у меня не получается! После добавления товара – пишет что, отсутствует ID товара!
Помогите! В чем проблема?!
Сделал 3 раза – результат 1 и тот же! Делал ВСЕ в точности так же!
1 год назад
а как все это сделать с virtuemart 1.1.2 ???
1 год назад
Стас, Игорь, принцип создания поля и агоритм действий, описанные в статье, относятся к версии 1.0.15 VM.
В последующих версиях они тоже применимы, кардинальных изменений там не происходило. Но, добиться работоспособности не вникая в код не получится.
1 год назад
ZaiSL, принцип понятен, но в virtuemart 1.1.2 я ничего похожего на заглушки типа –
«{xxxxx}» не нашел (может не там искал…?) а знаний PHP не хватает :( если кто-то делал это для версий VM 1.1.x? пожалуста подскажите! очень нужно.
СПАСИБО
1 год назад
Спасибо всем – разобрался на свежую голову
1 год назад
Игорь – можете выложить в чем там изменения или сами файлики!?
1 год назад
в виртмарте 1.1.3 не нужно править SQL запрос. Там вставляется весь массив полей. Так что только поля добавить…
1 год назад
А как создать новое поле с помощью запроса без phpMyAdmin?
1 год назад
Огромное спасибо! Я вас прям расцеловать готов! )) Весь день провозился, а тут за 15 минут все готово!
1 год назад
Рано радовался…
Теперь при добавлении товара кидает ошибку «Ошибка: Отсутвует ID товара.» и ничего не добавляется ессно.
Что-то не так… ковыряю день уже (
То добавляется БЕЗ цены, то еще что-то глючит. Тоесть настроить удалось только отображение, а внесение изменений в базу все еще хромает (
1 год назад
что примечательно – работает редактирование! как такое может быть если обращения к базе одинаковые…
1 год назад
Пытался создать новое поле в таблице БД. При попытке выполнить следующий код:
setQuery($q);
$db->query();
?>
Появляется сообщение:
Direct Access to ps_database.php is not allowed.
Кто знает что нужно делать?
1 год назад
При попытке выполнить следующий код:
require_once(«ps_database.php»);
$db = new ps_DB;
$q = «ALTER TABLE #__{vm}_product ADD(
new_field int)»;
$db->setQuery($q);
$db->query();
Появляется сообщение:
Direct Access to ps_database.php is not allowed.
1 год назад
разобрался вроде. как всегда дело в невнимательности…
Ирина, в мануале Вы кое-что не дописали. А именно при записи в базу:
$q .= $d["product_sku2"] . «‘,’» .
Хотя конечно, оно и очевилно вполне :)
Еще раз спасибо! Извините, что нафлудил )
1 год назад
Огромное спасибо!!! Дельно написано, и главное нужно )))) На BMPE все нормально заработало. Конечно в код нужно вникать…
Еще раз благодарю!!!
1 год назад
Не работает этот метод.. или инструкция некорректная.. 3 раза проходил все шаг за шагом.. в итоге при добавлении товара выдает ошибку Отсутствует ID товара.
Если кто знает правильное решение, прошу откликнуться. Запорол проект, жду помощи
1 год назад
Подскажите если не сложно
Список товара выводиться в виде таблице.
Существует несколько под категорий без товара, по «дорого» к категории с товаром.
Так в пустых категориях отображаться шапка таблицы. Как её убрать. Или где вообще настраиваться шаблоны категории. Изменения в файлах browse_XX ни к чему не приводили. При настройке категории устанавливал конкретный файл browse_XX.
1 год назад
Все отлично работает. Но как теперь добавить эти переменные в csv? Добавила в файле ps_csv.php в $use_in_product_query – Не прокатило. Поля в csv появились, но значения не добавляются при закачке.
Я вообщето не программер…. :(
1 год назад
Метод работает, и инструкция писалась что называется «с натуры».
Просмотри комменты, многое станет понятней.
Универсальных решений нет.
1 год назад
Скажите – а как добавить теперь это в импорт CSV.
1 год назад
Там в файле ps_csv.php надо в четырех местах добавить новое поле
1 год назад
Для версии 1.1.2 – Все делается легко! Поиском ищется цель и рядом новая делается, в четырех файлах которые тут описываются. Всё ок! Спасибо за статью!
1 год назад
А что не получилось? administrator/com_virtuemart/html/product.product_form.php. administrator/com_virtuemart/clases/ps_product.php administrator/com_virtuemart/html/shop_browse_queries.php. administrator/com_virtuemart/html/shop_browse.php – Четыре файла. В них все и твориться, просто на ряду с теми, которые там есть, добовляешь новую заглушку, так же точно вставляешь в файлы обрабатывающие куски кода с новым именем заглушки и усе. У меня все работает.
1 год назад
Не в тему, конечно, извиняюсь… но может кто сталкивался с такой проблемой в virtuemart как замена в ссылках & на & . Не могу найти где ссылки формируются для вывода в модулях…
1 год назад
Здравствуйте.
К большому моему сожалению не могу найти в исходном коде перечисленных файлов строки типа «CODECOLORER_BLOCK_…» искал в файлах VM версий «ВМРЕ 1.0.15b Стабильный» и «VirtueMart 1.1.3″ для Joomla 1.0.15
Можно ли каким-либо способом получить листинг исправленных файлов?
10 месяцев назад
Очень понравилось чье-то сообщение – сначала изложил проблему, что не может разобраться как применить полученные знания для версии 1.1.2, а потом дальше сообщение – спасибо, я разобрался. И слился, не написав ни в чем разобрался, ни как это делается. Короче ему спасибо. А автору респект. Тема очень полезная, поскольку показывает принцип работы с полями в виртуамарт.
10 месяцев назад
ZaiSL, принцип понятен, но в virtuemart 1.1.2 я ничего похожего на заглушки типа –
“{xxxxx}” не нашел (может не там искал…?) а знаний PHP не хватает если кто-то делал это для версий VM 1.1.x? пожалуста подскажите! очень нужно.
СПАСИБО
Никаких заглушек для этой версии делать не надо. Просто в шаблоне – browse, например, пишете echo $переменная и все