Создание дополнительного поля в Virtuemart в разделе информации о товаре.
Опубликовано: 16 Июнь 2013
Если у Вас есть интернет магазин, работающий на базе связки joomla 1.5.XX и Virtuemart 1.1.X и Вы плотно работаете над ним, то иногда может возникнуть ситуация, когда необходимо добавить в информацию о товаре какие-то дополнительные поля, чекбоксы и другие управляющие элементы формы. А так же вывести новую информацию в шаблоне на лицевой панели сайта (в карточке товара, например). В этой статье речь пойдет именно об указанных выше версиях системы joomla и virtuemart, и я постараюсь максимально подробно описать процесс добавления новых полей в информацию о товаре. Сам по себе этот процесс не представляет собой ничего сложного, главное действовать последовательно "шаг-за-шагом".
Видеодемонстрация создания дополнительного поля.
Далее, вся та же информация в виде статьи. Из нее же Вы можете копировать строки кода, если перед Вами стоит какая-то примерно такая же задача, как и на видео.
Новое поле в базе данных.
Прежде чем редактировать файлы системы, необходимо подготовить заранее базу данных таким образом, чтобы в ней образовалось свободное место для записи новой дополнительной информации о товаре. Для этого Вам необходимо перейти в интерфейс phpMyAdmin базы данных Вашего сайта. И внутри Вашей базы, найти таблицу #_##_product, где # - это префикс базы данных joomla, а ## - префикс таблиц базы данных магазина virtuemart. Если Вы при установке и настройке системы их не изменяли и они у Вас стоят по умолчанию, то скорее всего Ваша таблица называется jos_vm_product.
Кликните по прямоугольнику обведенному зеленым.
Эта таблица содержит большую часть всей информации о товарах, которые занесены в каталог Вашего магазина и именно в этой таблице необходимо создать новое поле, информацию которого мы будем выводить потом на лицевой стороне сайта для посетителей интернет-магазина. Не будем рассматривать значения уже имеющихся полей, сразу перейдем к созданию нового.
Для этого Вам необходимо перейти во вкладках вверху в раздел «структура» («structure», если у Вас панель не переведена на русский).
и в открывшйся вновь панели в самом низу выбрать «добавить 1 поле в конец таблицы» (обычно оно уже стоит в таких значениях по умолчанию) и нажать «пошел» (или «go»). Если Вам нужно добавить несколько полей, то вместо единицы впишите нужное Вам значение.
и Вам откроется примерно следующая форма:
Где:
Field – имя поля. Укажите название нового поля, используя при этом латиницу и нижнее подчеркивание. Название может быть произвольным, но главное - уникальным в списке уже существующих полей в данной таблице.
Type – тип данных записываемых в данное поле. Здесь Вам нужно выбрать: если Вы в качестве новой информации планируете записывать целые числа (например: какой-то номер, количество, цифровой код и т.д.) то используйте тип «int» - целые числа. Если предполагается записывать десятичные числа – то лучше использовать тип «float». Если же Вы планируете записывать в это поле какую-то текстовую информацию ограниченной длины, включающую очень разные символы от латиницы, цифр, кириллицы до спецсимволов – то используйте тип «varchar». Если длина вводимого текста может быть вообще произвольной – используйте «text». Если Вы хотите записывать дату, то выберите что-то из подраздела с типом данных «date». Это такие краткие рекомендации, более подробно Вы можете почитать о типах данных здесь.
Length/Values – длина строки данных. Здесь Вам нужно указать максимальную длину вводимых данных в символах. Например, если Вы планируете записывать туда числа, и понимаете что больше 99999 не будет, то укажите длину 5 (то есть пять символов), если это будут какие-то имена файлов или коды, и вы понимаете что их длина не превысит скажем 50 символов – поставьте 50.Если это будет просто какой-то ключ, присылаемый от будущего чекбокса, значения которого «0» или «1» и другого не будет - то поставьте значение «1», то есть длина строки равна одному символу. И так далее…
Default – значение по умолчанию. Здесь Вы можете указать, если необходимо, какое-то значение по умолчанию, которое потом можно будет изменить в админке Вашего магазина. Если Вы в в поле «type» (двумя шагами выше) указывали тип данных «date» и хотите чтобы по умолчанию выставлялась дата создания товара, то в поле «Default» выберите «current_timestamp». Если хотите чтобы по уомолчанию была пустая строка можете оставить «none» или «NULL». Если выберите «As define» то в поле чуть ниже Вы можете ввести то значение по умолчанию какое Вам необходимо.
Collation – кодировка строки. Выберите «utf8_general_ci». Или другую кодировку, в которой записана Ваша база данных.
Attributes – обычно трогать нет необходимости. Но если Вы хотите чтобы в поле вставлялась дата создания товара, и чтобы она обновлялась при каждом изменении информации о товаре, выберите «on update CURRENT_TIMESTAMP» (это сработает если выше Вы указали тип данных DATE).
Null – если в поле «Default» Вы выбирали «NULL», то здесь поставьте галочку.
Все остальные поля – пропускаем и нажимаем «сохранить» (или «save»). После этого информация о новом поле появится в структуре таблицы #_##_product.
Теперь мы можем перейти к редактированию непосредственно файлов системы магазина.
Добавление нового элемента формы.
Поскольку в данной статье предполагается создание дополнительных полей информации именно о конкретном товаре, то естесственно это самое дополнительное поле следует создавать в разделе «товары», кликнув по заголовку какого-либо товара в панели. Тогда откроется большая форма, с большим количеством полей, вкладок, чекбоксов – через которые в базу данных вводится вся информация о товаре.
Допустим передо мной стоит задача: сделать поле, в которое я буду вводить ID видео с сервиса YouTube, так чтобы в карточке товара в нужном месте появлялось необходимое видео. Для этого я создам новое дополнительное поле во вкладке «изображение товара» (или «Product Images»)
Однако, Вы можете выбрать для себя любое другое удобное место.
Для этого необходимо в файловой системе сайта перейти к файлу: administrator/com_virtuemart/html/product.product_form.php. Для того чтобы вставить поле в нужное мне место, необходимо после строк:
<?php $tabs->endTab(); $tabs->startTab( $images_label, "images-page"); $ps_html->writableIndicator( array( IMAGEPATH."product", IMAGEPATH."product/resized") ); ?>
Добавить примерно следующее (применительно к «моей» задаче):
<table class="adminform" > <tr> <td> <h3>Видеопрезентация товара (YouTube):</h3> <p style="display:inline;">Введите ID-видео с сервиса YouTube:</p> <input type="text" name="youtubeID" style="width:200px;"/> </td> </tr> </table>
Сохраните файл и убедитесь, что соответствующее поле появилось там, где это требовалось. В моем случае это выглядит примерно так:
Если Вы убедились, что новое поле находится именно там, где Вам необходимо, то теперь нужно добавленный код доработать таким образом, чтобы при открытии формы, в данное поле выводилось то значение, которое уже имеется в базе данных. Это нужно для удобства работы и для того, чтобы введенное значение не затиралось при следующем сохранении информации о товаре (иначе по умолчанию будет открываться пустое поле и при сохранении в базу данных будет отправляться на запись «» - пустая строка). А именно, мы сделаем обращение к базе данных на получение содержимого поля созданного на прошлом шаге, и в зависимости от того что оно содержит осуществим вывод. Тогда итоговый код для вставки будет таков:
<?php // запрос к базе данных к полю youtubeID $youtubeID = $db->sf("youtubeID"); ?> <table class="adminform" > <tr> <td> <h3>Видеопрезентация товара (YouTube):</h3> <p style="display:inline;">Введите ID-видео с сервиса YouTube:</p>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="youtubeID" value="<?php echo $youtubeID;?>" style="width:200px;"/> </td> </tr> </table>
Можете даже для уверенности провести эксперимент: найти в базе данных строку данного товара, и в Ваше новое поле ввести какие-то данные и сохранить. После обновления страницы этого же товара в админке – введенное значение должно отобразиться в Вашем новом дополнительном поле. Но, это делать не обязательно.
Запись введенных данных в таблицу базы данных.
Теперь необходимо наладить запись тех значений, которые Вы будете вводить в новое поле в базу данных. Это делается достаточно быстро и просто. Вам нужно найти файл:
administrator/components/com_virtuemart/classes/ps_product.php
И воспользуйтесь в Вашем редакторе, в котором открываете файл, поиском – ищите строку «Insert into DB». Результат поиска выдаст два одинаковых места в документе:
// Insert into DB $fields = array ( 'vendor_id' => $vendor_id, 'product_sku' => vmGet($d,'product_sku'), 'product_name' => vmGet($d,'product_name'), 'product_desc' => vmRequest::getVar('product_desc', '', 'default', '', VMREQUEST_ALLOWHTML), 'product_s_desc' => vmRequest::getVar('product_s_desc', '', 'default', '', VMREQUEST_ALLOWHTML), 'product_thumb_image' => vmGet($d,'product_thumb_image'), 'product_full_image' => vmGet($d,'product_full_image'), 'product_publish' => $d['product_publish'], 'product_weight' => vmRequest::getFloat('product_weight'), 'product_weight_uom' => vmGet($d,'product_weight_uom'), 'product_length' => vmRequest::getFloat('product_length'), 'product_width' => vmRequest::getFloat('product_width'), 'product_height' => vmRequest::getFloat('product_height'), 'product_lwh_uom' => vmGet($d,'product_lwh_uom'), 'product_unit' => vmGet($d,'product_unit'), 'product_packaging' => (($d["product_box"] << 16) | ($d["product_packaging"]&0xFFFF)), 'product_url' => vmGet($d,'product_url'), 'product_in_stock' => vmRequest::getInt('product_in_stock'), 'attribute' => ps_product_attribute::formatAttributeX(), 'custom_attribute' => vmGet($d,'product_custom_attribute'), 'product_available_date' => $d['product_available_date_timestamp'], 'product_availability' => vmGet($d,'product_availability'), 'product_special' => $d['product_special'], 'child_options' => $d['child_options'], 'quantity_options' => $d['quantity_options'], 'product_discount_id' => vmRequest::getInt('product_discount_id'), 'mdate' => $timestamp, 'product_tax_id' => vmRequest::getInt('product_tax_id'), 'child_option_ids' => vmGet($d,'included_product_id'), 'product_order_levels' => $d['order_levels'] );
И где-нибудь посередине ОБОИХ участков вставьте код (только соответствующие имена измените на свои, здесь вставляю код под свою задачу):
'youtubeID' => vmGet($d, 'youtubeID'),
После чего сохраните документ. Можете проверить: отктройте любой товар магазина в админке и введите в новое поле какое-то значение, нажмите «Сохранить» – оно должно сохраниться в базе данных.
Подготовка вывода на лицевой панели.
Итак, мы подготовили новое поле в таблице базы данных, создали новый элемент формы и осуществили запись данных из него в базу. Теперь нужно подготовить и осуществить вывод введенной информации на лицевой панели сайта. Так как информация относится к конкретному товару непосредственно, то выводить будем в карточке товара. Но, для начала подготовим вывод записи.
Для начала, найдите файл: administrator/com_virtuemart/html/shop_browse_queries.php и найдите в этом файле строку комментария - «Prepare the SQL Queries». И в строку переменной $fieldnames куда-нибудь в середину вставьте `youtubeID` (имя поля вставьте Ваше). Должно получиться что-то вроде:
/** Prepare the SQL Queries * */ // These are the names of all fields we fetch data from $fieldnames = "`#__{vm}_product`.`product_id`, `youtubeID` , `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_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`";
И сохрание внесенные изменения.
После чего, перейдите к файлу: administrator/com_virtuemart/html/shop.browse.php, найдите в нем строку «Unset these for the next product» и вставьте в блок кода после нее следующую запись (имена поля и переменной вставьте свои):
$products[$i]['youtubeID'] = $youtubeID;
В итого у Вас должно получиться примерно следующее:
// Unset these for the next product unset($full_image_width); unset($full_image_height); $products[$i]['youtubeID'] = $youtubeID; $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"); $products[$i]['product_weight_uom'] = $db_browse->f("product_weight_uom"); $products[$i]['product_length'] = $db_browse->f("product_length"); $products[$i]['product_width'] = $db_browse->f("product_width"); $products[$i]['product_height'] = $db_browse->f("product_height"); $products[$i]['product_lwh_uom'] = $db_browse->f("product_lwh_uom"); $products[$i]['product_in_stock'] = $db_browse->f("product_in_stock"); $products[$i]['product_available_date'] = $VM_LANG->convert( vmFormatDate($db_browse->f("product_available_date"), $VM_LANG->_('DATE_FORMAT_LC') )); $products[$i]['product_availability'] = $db_browse->f("product_availability"); $products[$i]['cdate'] = $VM_LANG->convert( vmFormatDate($db_browse->f("cdate"), $VM_LANG->_('DATE_FORMAT_LC') )); $products[$i]['mdate'] = $VM_LANG->convert( vmFormatDate($db_browse->f("mdate"), $VM_LANG->_('DATE_FORMAT_LC') )); $products[$i]['product_url'] = $db_browse->f("product_url");
Сохраните изменения.
Вывод на лицевой панели в карточке товара.
Собственно, остался последний шаг. Вам нужно определить с помощью какого файла выводится карточка товара, по умолчанию это flypage.tpl.php, но на всякий случай посмотрите это в настройках вашего магазина.
В моем случае это значение по умолчанию, значит нужно перейти в файл шаблона карточки товара: components/com_virtuemart/themes/default/templates/product_details/flypage.tpl.php. И в этом файле, в нужном Вам месте, необходимо ввести конструкцию (используйте при этом имя Вашей переменной):
<?php echo $youtubeID; ?>
Так как в моем случае стоит задача вставки видео от YouTube, то я в необходимом мне месте вставлю код блока вставки плеера и уже внутри него выведу значение моего нового поля. Сам плеер будет выводиться только в том случае, если значение поля «youtubeID» данного товара в базе данных не равно «NULL». В итоге, в моем случае получится код примерно следующий:
<?php if ($youtubeID !== NULL) {?> <object width="560" height="315"><param name="movie" value="http://www.youtube.com/v/<?php echo $youtubeID; ?>?version=3&amp;hl=ru_RU&amp;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/<?php echo $youtubeID; ?>?version=3&amp;hl=ru_RU&amp;rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object> <?php }?>
В результате если запись в новом поле не равна NULL, то выводится код вставки плеера от YouTube, и делается попытка подгрузить видео, если ID введен без ошибок – то можно смотреть видео.
Это был мой частный пример, но я уверен, что Вы сможете применить изрядную долю своего творчества и придумать еще не мало других полезных реализаций возможности выводить дополнительную информацию о товаре в вашем магазине. Ведь можно таким же образом выводить и фотогалереи, и вкладки для удобства навигации, и многое другое…
Дерзайте!
Если информация этой статьи будет интересна и полезна Вашему кругу друзей и знакомых, то Вы можете опубликовать ссылку - тогда им проще будет ее найти. Они Вам будут благодарны:).