Блог Веб-разработчика.

Если у Вас есть интернет магазин, работающий на базе связки 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>&nbsp;&nbsp;&nbsp;&nbsp;<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>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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"]&amp;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;amp;hl=ru_RU&amp;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;amp;hl=ru_RU&amp;amp;rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object>
        <?php }?>

В результате если запись в новом поле не равна NULL, то выводится код вставки плеера от YouTube, и делается попытка подгрузить видео, если ID введен без ошибок – то можно смотреть видео.

Это был мой частный пример, но я уверен, что Вы сможете применить изрядную долю своего творчества и придумать еще не мало других полезных реализаций возможности выводить дополнительную информацию о товаре в вашем магазине. Ведь можно таким же образом выводить и фотогалереи, и вкладки для удобства навигации, и многое другое…

Дерзайте!

Если информация этой статьи будет интересна и полезна Вашему кругу друзей и знакомых, то Вы можете опубликовать ссылку - тогда им проще будет ее найти. Они Вам будут благодарны:).

Комментарии к статье:


Всеволод Чупрыгин © webengineer.pro 2014. Все права защищены.
Копирование материалов сайта разрешено только с указанием имени автора (Всеволод Чупрыгин) и прямой индексируемой ссылки на источник на сайте www.WebEngineer.pro.
ИП Чупрыгин Всеволод Андреевич, ИНН: 333410747832, ОГРН: 311333426300044
http://vkontakte.ru/chuprygin_va, Google +

.
Проверить аттестат
Мы принимаем Webmoney Мы принимаем практически все платежи через Robokassa Мы принимаем Яндекс.Деньги Мы принимаем платежи через QIWI. Мы принимаем платежи через привязанные к QIWI карты VISA/Mastercard.