Вторник, 20 Декабрь 2011 19:14

Расширяем функциональность Virtuemart. Часть 1. Дополнительные поля.

Оцените материал
(7 голосов)

Virtuemart — замечательный и по максимуму расширенный магазин, но дополнительные поля в нем, порой, просто необходимы. Вот практические примеры их использования (щелкайте по картинкам для увеличения):

Дополнительные поля Virtuemart — flypage Дополнительные поля Virtuemart — расширенный поиск Дополнительные поля Virtuemart — админка  

В этом посте я пошагово проинструктирую о том, как сделать дополнительное поле в магазине Virtuemart, как его вывести во flypage или в обзорной странице, а так же о том, как дать возможность Виртуемарту искать товары по дополнительным полям. Стопроцентно способ будет работать в версии 1.1.9 (скачать стабильную версию Virtuemart 1.1.9 с русской локализацией на которой я сам это делал).

В первую очередь нам необходимо залезть в базу данных через phpMyAdmin, в левой колонке найти jos_vm_product (если при установке задавался другой префикс, то соответственно ищем префикс_vm_product ), нажимаем: 

 

Перед вами открывается структура jos_vm_product. Под таблицей этой структуры мы видим нечто подобное:

Собственно, мне нужно было добавить шесть новых полей, но туда можно вписать и цифру 1, тогда добавится всего одно поле. Вводим нужное количество полей, ставим галочку напротив «После» и выбираем из выпадающего списка product_desc (можно и другую, но я выбрал именно product_desc потому, что так легче запомнить), жмем ОК.

Открывается новая таблица, которую надо заполнить. Я назвал свои поля: product_m_desc — для среднего описания товара, заполняться будут с помощью визуального редактора (см. первую картинку в начале поста); product_s_price — для второй цены, заполняется вручную; product_img_folder — для фотогалереи, заполняется вручную (в третьей части этой серии постов я объясню как прикрепить фотогалерею к товару Virtuemart); product_vid_teh, product_gruzop и product_tip_kuz — для фильтрации товаров по параметрам, заполняются при помощи выпадающих списков (см. картинки в самом начале поста, во второй части этой серии постов я описал как сделать такой же фильтр).

Заполняем ячейки (как на картинке, в ячейки справа можете не лезть):

Смотрим что получилось. Должно быть что-то подобное:

 

То есть, если снова нажать на jos_vm_product, то сразу после поля product_desc должны появиться поля только что нами добавленные. Переходим к следующему этапу.

Добавим новые поля в админку. Открываем файл product.product_form.php, который лежит в папке administrator/components/com_virtuemart/html. Прежде всего нам нужно выбрать место где лучше расположить новые поля. Смотрим девственную страницу:

 

Лишаем ее девственности. Сначала разместим третье описание. Если вы пользуетесь виртуемартом скачанным с моего сайта, то находим строку 370, если нет — ищем вот это:

Показать/скрыть php код

Посмотреть код
  1. <div style="font-weight:bold;">_('PHPSHOP_PRODUCT_FORM_DESCRIPTION') ?>:</div>
  2.  
  3. <?php
  4. editorArea( 'editor1', htmlspecialchars( $db->sf("product_desc"), ENT_QUOTES ), 'product_desc', '100%', '300', '55', '25' )
  5.     ?>
 

Над эти кодом (между </table> и <div style="font-weight:bold;">)вставляем:

Показать/скрыть php код

Посмотреть код
  1. <div style="font-weight:bold;">Среднее описание товара:</div> <!-- Можете заморочиться с языками, я не стал. Сайт на русском. -->
  2.  
  3. <?php
  4. editorArea( 'editor1', htmlspecialchars( $db->sf("product_m_desc"), ENT_QUOTES ), 'product_m_desc', '100%', '300', '55', '25' )
  5.     ?>
  6. <br /><br /><br />
 

Сохраняемся, обновляем уже недевственную страницу. Должно получиться в точности как на скриншоте: 

 

Теперь разместим остальные поля. Поскольку было решено вставить их под кратким описанием, ищем в коде форму краткого описания по ключевому слову product_s_desc. Должны найтись вот эти строки:

Показать/скрыть php код

Посмотреть код
  1. <td width="71%" valign="top">
  2.                 <textarea class="inputbox" name="product_s_desc" id="short_desc" cols="35" rows="6" ><?php echo $db->sf("product_s_desc"); ?></textarea>
  3.                 </td>
  4.              </tr>

Первым полем я вставлю текстовое поле для фотогалереи товара. Под закрывающим тегом </tr> вписываю поле product_img_folder:

Показать/скрыть php код

Посмотреть код
  1. <tr class="row1">
  2. <td width="29%" valign="top">
  3. <div style="text-align:right;font-weight:bold;">Папка картинок:</div>
  4. </td>
  5. <td width="71%" >
  6. <input type="text" class="inputbox" name="product_img_folder" size="30" value="<?php echo $db->sf("product_img_folder"); ?>" />
  7. </td>
  8. </tr>

И еще одно — для второй цены тем же способом.

Показать/скрыть php код

Посмотреть код
  1. <tr class="row1">
  2. <td width="29%" valign="top">
  3. <div style="text-align:right;font-weight:bold;">Вторая цена:</div>
  4. </td>
  5. <td width="71%" >
  6. <input type="text" class="inputbox" name="product_s_price" size="30" value="<?php echo $db->sf("product_s_price"); ?>" />
  7. </td>
  8. </tr>

Сохраняем, проверяем. Если не накосячили, должны появиться два дополнительных поля.

 

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

Показать/скрыть html4strict код

Посмотреть код
  1. <tr class="row1">
  2. <td width="29%" valign="top">
  3. <div style="text-align:right;font-weight:bold;">Виды техники:</div>
  4. </td>
  5. <td width="71%" >
  6. Сейчас — &quot;<?php echo $db->sf("product_vid_teh"); ?>&quot;, изменить на&nbsp;
  7. <select class="inputbox" type="text" name="product_vid_teh" size="1">
  8. <option value=' грузовики'>Грузовики</option>
  9. <option value=' самосвалы'>Самосвалы</option>
  10. <option value=' манипуляторы'>Манипуляторы</option>
  11. <option value=' тягачи'>Тягачи</option>
  12. <option value=' погрузчики'>Погрузчики</option>
  13. <option value=' спецтехника'>Спецтехника</option>
  14. </select>
  15. </td>
  16. </tr>
  17. <tr class="row1">
  18. <td width="29%" valign="top">
  19. <div style="text-align:right;font-weight:bold;">Грузоподъемность:</div>
  20. </td>
  21. <td width="71%" >
  22. Сейчас — &quot;<?php echo $db->sf("product_gruzop"); ?>&quot;, изменить на&nbsp;
  23. <select class="inputbox" type="text" name="product_gruzop" size="1">
  24. <option value=' 1500'>1500 кг</option>
  25. <option value=' 2000'>2000 кг</option>
  26. <option value=' 3500'>3500 кг</option>
  27. <option value=' 5000'>5000 кг</option>
  28. <option value=' 7000'>7000 кг</option>
  29. <option value=' 10000'>10 000 кг</option>
  30. <option value=' 15000'>50 000 кг</option>
  31. <option value='20000'>20 000 кг</option>
  32. </select>
  33. </td>
  34. </tr>
  35. <tr class="row1">
  36. <td width="29%" valign="top">
  37. <div style="text-align:right;font-weight:bold;">Тип кузова:</div>
  38. </td>
  39. <td width="71%" >
  40. Сейчас — &quot;<?php echo $db->sf("product_tip_kuz"); ?>&quot;, изменить на&nbsp;
  41. <select class="inputbox" type="text" name="product_tip_kuz" size="1">
  42. <option value=' борт'>Борт</option>
  43. <option value=' изометрический'>Изометрический</option>
  44. <option value=' рефрижератор'>Рефрижератор</option>
  45. <option value=' промтоварный'>Промтоварный</option>
  46. </select>
  47. </td>
  48. </tr>
 

Ожидаемый результат:

 Если все так и выглядит, закрываем файл от греха подальше. Больше он не понадобится. Зато понадобится файл ps_product.php, лежащий в administrator/components/com_virtuemart/classes. Ищем комментарий // Insert into DB, он в этом файле попадется два раза. Вписывать код тоже будем два раза (одно и то же):

Показать/скрыть php код

Посмотреть код
  1. 'product_m_desc' => vmRequest::getVar('product_m_desc', '', 'default', '', VMREQUEST_ALLOWHTML), 
  2. 'product_s_price' => vmGet($d,'product_s_price'), 
  3. 'product_img_folder' => vmGet($d,'product_img_folder'), 
  4. 'product_vid_teh' => vmGet($d,'product_vid_teh'), 
  5. 'product_gruzop' => vmGet($d,'product_gruzop'), 
  6. 'product_tip_kuz' => vmGet($d,'product_tip_kuz'),

Проверяем на работоспособность. Заходим в админку, выбираем любой товар или добавляем новый, заполняем все поля, сохраняем товар. Если ошибки допущены небыли, после сохранения, все данные останутся в полях. Мой пример:

 

После проверки работоспособности внесенных изменений, редактируем файл shop_browse_queries.php, который лежит в administrator/components/com_virtuemart/html. Вводим в поиск по файлу // These are the names of all fields we fetch data from, видим код

Показать/скрыть php код

Посмотреть код
$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_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`";
 

Думать долго не надо. Просто прописываем свои ячейки:

Показать/скрыть php код

Посмотреть код
$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_m_desc`, `product_s_price`, `product_img_folder`, `product_vid_teh`, `product_gruzop`, `product_tip_kuz`, `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/components/com_virtuemart/html, открываем файл shop.browse.php, если нужно выводить поле в категории (мне это не надо было, поэтому напишу здесь не свои названия полей, а абстрактные):

Показать/скрыть php код

Посмотреть код
$products[$i]['product_vashe_pole'] = $db_browse->f("product_vashe_pole");

Вставляем сюда: 

Показать/скрыть php код

Посмотреть код
  1. // Unset these for the next product
  2. unset($full_image_width);
  3. unset($full_image_height);
  4. $products[$i]['product_name'] = shopMakeHtmlSafe( $product_name );
  5. $products[$i]['product_s_desc'] = $product_s_desc;
  6. $products[$i]['product_details'] = $product_details;
  7. $products[$i]['product_rating'] = $product_rating;
  8. $products[$i]['product_price'] = $product_price;
  9. $products[$i]['product_price_raw'] = $product_price_raw;
  10. $products[$i]['product_sku'] = $db_browse->f("product_sku");
  11. $products[$i]['product_weight'] = $db_browse->f("product_weight");
 

А чтобы вывести поле на страницу товара, как у меня на скриншоте, достаточно вписать в flypage.tpl.php (components/com_virtuemart/themes/default/templates/product_details) в том месте, которое понравится, код  <?php echo $product_vashe_pole ?>.

Теперь организуем поиск по этим полям. Для этого снова открываем файл shop_browse_queries.php, ищем foreach( $keywordArr as $searchstring ). Мне нужно организовать поиск лишь по некоторым полям из добавленных. Под строкой

Показать/скрыть php код

Посмотреть код
$sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%') ";

Вставляю поля по которым будет вестись поиск, в итоге все должно выглядеть вот так:

Показать/скрыть php код

Посмотреть код
  1. foreach( $keywordArr as $searchstring ) {
  2. $sq .= "\n (`#__{vm}_product`.`product_name` LIKE '%$searchstring%' OR ";
  3. $sq .= "\n `#__{vm}_product`.`product_sku` LIKE '%$searchstring%' OR ";
  4. $sq .= "\n `#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR ";
  5. $sq .= "\n `#__{vm}_product`.`product_m_desc` LIKE '%$searchstring%' OR ";
  6. $sq .= "\n `#__{vm}_product`.`product_vid_teh` LIKE '%$searchstring%' OR ";
  7. $sq .= "\n `#__{vm}_product`.`product_gruzop` LIKE '%$searchstring%' OR ";
  8. $sq .= "\n `#__{vm}_product`.`product_tip_kuz` LIKE '%$searchstring%' OR ";
  9. $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%') "

Затем ищем case "desc", так же после строки с полным описанием вписываем

Показать/скрыть php код

Посмотреть код
case "desc": 
$sq .= "\n (`#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR "; 
$sq .= "\n `#__{vm}_product`.`product_m_desc` LIKE '%$searchstring%' OR "; 
$sq .= "\n `#__{vm}_product`.`product_vid_teh` LIKE '%$searchstring%' OR "; 
$sq .= "\n `#__{vm}_product`.`product_gruzop` LIKE '%$searchstring%' OR "; 
$sq .= "\n `#__{vm}_product`.`product_tip_kuz` LIKE '%$searchstring%' OR "; 
$sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%') ";

Чуть ниже найдите код:

Показать/скрыть php код

Посмотреть код
  1. default: 
  2. $sq .= "\n (`#__{vm}_product`.`product_name` LIKE '%$searchstring%' OR ";

Показать/скрыть php код

Посмотреть код
  1. $sq .= "\n `#__{vm}_product`.`product_m_desc` LIKE '%$searchstring%' OR ";
  2. $sq .= "\n `#__{vm}_product`.`product_vid_teh` LIKE '%$searchstring%' OR ";
  3. $sq .= "\n `#__{vm}_product`.`product_gruzop` LIKE '%$searchstring%' OR ";
  4. $sq .= "\n `#__{vm}_product`.`product_tip_kuz` LIKE '%$searchstring%' OR ";

Далее ищем if ( $category_id ) в файле administrator/components/com_virtuemart/classes/ps_product.php, добавляем туда значения новых полей, результат:

Показать/скрыть php код

Посмотреть код
 if ( $category_id ) { 
$q = "SELECT DISTINCT product_sku,#__{vm}_product.product_id,product_name,product_s_desc,product_m_desc,product_s_price,product_img_folder,product_vid_teh,product_gruzop,product_tip_kuz,product_thumb_image, product_full_image, product_in_stock, product_url FROM #__{vm}_product, #__{vm}_product_category_xref, #__{vm}_category WHERE \n";
 

И еще раз: 

Показать/скрыть php код

Посмотреть код
else { 
$q = "SELECT DISTINCT product_sku,product_id,product_name,product_s_desc,product_m_desc,product_s_price,product_img_folder,product_vid_teh,product_gruzop,product_tip_kuz,product_thumb_image, product_full_image, product_in_stock, product_url FROM #__{vm}_product WHERE "; 
 

Находим код if (_SHOW_PRICES == '1'), вставляем свои значения:

Показать/скрыть php код

Посмотреть код
  1. $featured_products[$i]['product_m_desc'] = $db->f("product_m_desc"); 
  2. $featured_products[$i]['product_vid_teh'] = $db->f("product_vid_teh"); 
  3. $featured_products[$i]['product_gruzop'] = $db->f("product_gruzop");
  4. $featured_products[$i]['product_tip_kuz'] = $db->f("product_tip_kuz");
 

Ищем код 

Показать/скрыть php код

Посмотреть код
$q = "SELECT product_name,category_name, c.category_flypage,product_s_desc,product_thumb_image ";

Вставляем свои значения:

Показать/скрыть php код

Посмотреть код
 $q = "SELECT product_name,category_name, c.category_flypage,product_s_desc,product_m_desc,product_s_price,product_img_folder,product_vid_teh,product_gruzop,product_tip_kuz,product_thumb_image "; 
 

Вводим в поиск $recent[$k], добавляем сюда свои поля. Результат:

Показать/скрыть php код

Посмотреть код
$recent[$k]['product_m_desc'] = $db->f("product_m_desc"); 
 if($recent[$k]['product_m_desc']=="" && !empty($prod_id_p)) { 
 $recent[$k]['product_m_desc'] = $dbp->f("product_m_desc"); 
 } 
$recent[$k]['product_gruzop'] = $db->f("product_gruzop"); 
 if($recent[$k]['product_gruzop']=="" && !empty($prod_id_p)) { 
 $recent[$k]['product_gruzop'] = $dbp->f("product_gruzop"); 
 } 
$recent[$k]['product_tip_kuz'] = $db->f("product_tip_kuz"); 
 if($recent[$k]['product_tip_kuz']=="" && !empty($prod_id_p)) { 
 $recent[$k]['product_tip_kuz'] = $dbp->f("product_tip_kuz"); 
 } 
 $recent[$k]['product_vid_teh'] = $db->f("product_vid_teh"); 
 if($recent[$k]['product_vid_teh']=="" && !empty($prod_id_p)) { 
 $recent[$k]['product_vid_teh'] = $dbp->f("product_vid_teh"); 
 }
 

Прочитано 16579 раз
Твитнуть

Комментарии   

 
Essie
0 #27 Essie 19.11.2014 05:07
Attractive component of content. I just stumbled upon your website and in accession capital to claim that I acquire in fact loved account
your weblog posts. Anyway I will be subscribing for your augment or even I success you get
admission to persistently fast.

Visit my site - whatsapp spy tool: http://whatsappspydownload.wordpress.com
Цитировать
 
 
Diego
0 #26 Diego 03.11.2014 00:39
Saludos! Serias tan amable de decir que el tipo dde plataforma con la que trabajas?
Estoy considerando empezar mi propio web muyy pronto, pero me esta portando muchisimo tiempo hacer unaa eleccion entre BlogEngine/Word press/B2evoluti on/Blogger y Drupal.

La razon hago la pregunta es debido a qque tu diseño y
estilo me resulta distintivo que la gran parte de pagina webs y yo
estoy rebuscando pata hacer algo al 100% exclusivo.
P.D Mis disculpas estar fuera de topico pero debia de preguntar!


Revisa y ademas visita mi websiteXD grand theft auto 4 cheats xbox 360
youtube: http://socialnetwork.stock-options-picks.com/blogs/viewstory/1210111
Цитировать
 
 
Shay
0 #25 Shay 25.10.2014 18:30
My programmer is trying to convince me to move to .net from PHP.
I have always disliked the idea because of the expenses.
But he's tryiong none the less. I've been using
Movable-type on a number of websites for about a year and am nervous about switching
to another platform. I have heard fantastic things about blogengine.net.
Is there a way I can import all my wordpress content into it?
Any help would be greatly appreciated!

my homepage ... แต่งรูปลงเฟส: http://support.clicktoconvert.com/entries/52766990-Discover-How-To-Learn-Adobe-Photoshop-Online-And-On-Your-Own
Цитировать
 
 
Beatriz
0 #24 Beatriz 04.07.2014 23:08
Every weekend i used to pay a quick visit this web site, as i want
enjoyment, as this this web site conations truly nice funny stuff too.


Feel free to surf to my web page :: need: http://www.google.com
Цитировать
 
 
Mac
0 #23 Mac 22.06.2014 15:11
It's not my firѕt time tto pay a quick visit tɦis website,
і am visiting tɦis web site dailly аnd taҟe nice faϲts fromm ɦere everyday.


Check οut my web blog; Read Jan Berkowitz
Info: http://www.janberkowitz.zoomshare.com/
Цитировать
 
 
Maddison
0 #22 Maddison 09.06.2014 19:23
It's not my first time to go to see this website, i am visiting
this site dailly and obtain good data from here every day.


Visit my web-site: typing service: http://www.fiverr.com/typingservice
Цитировать
 
 
Leokadio
0 #21 Leokadio 04.07.2013 12:11
Отличный материал, оч. помог.

Подскажите, а как в представлении категории в виде таблицы (файл browse_listtabl e.tpl.php , путь: /components/com _virtuemart/the mes/default/tem plates/browse/i ncludes )

Вывести стоимость в соответствующей ячейке?

там код выводит стоимость:
if( _SHOW_PRICES && $auth['show_pri ces'] ) {
$data[$row][] = $product['product_price'];
}
мне надо вторую и третюю стоимость под первой вывести:
$product['produ ct_s_price']; и $product['product_o_price'];

т.е. на сайте 3 цены: розница, опт и для дилеров.
На странице товара все вывелось, а вот в таблицу никак.
Цитировать
 
 
Артем
0 #20 Артем 25.04.2013 14:05
как я понимаю, проблема решена уже?
Цитировать
 
 
Dariya
0 #19 Dariya 23.04.2013 10:38
Цитирую Артем:
какой версии виртуемарт?

1.1.6.Мне помогли разобраться, оказалось, где-то пропущена скобка.Но теперь другая проблема : при нажатии на картинку категории нет фото с товарами.На всякий случай вот сайт http://moda-exclusive.kz/index.php?option=com_virtuemart&Itemid=71
Цитировать
 
 
Артем
0 #18 Артем 22.04.2013 20:04
какой версии виртуемарт?
Цитировать
 
 
Dariya
0 #17 Dariya 22.04.2013 14:48
Цитирую Dariya:
Здравствуйте. Вроде сделала как написано, ног при нажатии на любое фото на сайте выдает ошибки
Parse error: syntax error, unexpected T_IF in /home/intersho/ public_html/adm inistrator/comp onents/com_virt uemart/html/sho p_browse_querie s.php on line 104

Теперь еще выдает ошибку
Parse error: syntax error, unexpected $end in /home/intersho/ public_html/adm inistrator/comp onents/com_virt uemart/html/sho p_browse_querie s.php on line 365
Цитировать
 
 
Dariya
0 #16 Dariya 22.04.2013 14:26
Здравствуйте. Вроде сделала как написано, ног при нажатии на любое фото на сайте выдает ошибки
Parse error: syntax error, unexpected T_IF in /home/intersho/ public_html/adm inistrator/comp onents/com_virt uemart/html/sho p_browse_querie s.php on line 104
Цитировать
 
 
Ярослав2
0 #15 Ярослав2 09.04.2013 10:41
После внесения изменений в файл ps_product.php, перестают изменяться характеристики товара, что самое характерное, данные которые были в девственное форме до внесения изменений в файл ps_product.php в первой // Insert into DB изменяются, новые характеристики нет, после внесения изменений во вторую // Insert into DB перестают меняться данные, которые до этого изменялись. В чем может быть проблема? Дайте пожалуйста ответ по данному вопросу. Очень нужно!
Цитировать
 
 
Aртем
0 #14 Aртем 14.11.2012 18:00
Сайт был атакован недоброжелателя ми, взломан и практически полностью удален.

Возможно, при восстановлении что-то потерялось
Цитировать
 
 
Алексей
0 #13 Алексей 13.11.2012 14:30
"скачать стабильную версию Virtuemart 1.1.9 с русской локализацией" - файла нет!!!
Цитировать
 

Добавить комментарий

Защитный код
Обновить

joomla 1.7

Не получаются доработки?

Становитесь партнером студии Millor! Быстро и недорого эти ребята помогут решить практически любую проблему.

Хотите подзаработать?

Если да, то вам сюда! Партнерская программа студии MyWebSite. Получи 20% за каждого клиента! Работаем по всей России и СНГ!

Рекламное место свободно.