English (United Kingdom)Russian (CIS)
Доработка VirtueMart: Раздельный вывод типов товара в категории и карточке самого товара PDF Печать E-mail
07.05.2011

Несмотря на все преимущества, которые дают нам типы товара, в VirtueMart заложена только основа для работы с ними, прорабатывать эту функцию разработчики не стали. С одной стороны это правильно - каждый делает себе так как ему нравится, с другой - некоторые базовые возможности стоило бы добавить сразу.

1. Для начала выведем параметры типа товара в шаблон категории. Для этого достаточно внести небольшие изменения в файл administrator/components/com_virtuemart/html/shop.browse.php

 
 require_once( CLASSPATH.'ps_product_type.php' );
 $ps_product_type = new ps_product_type();
 if ($product_parent_id!=0 && !$ps_product_type->product_in_product_type($db_browse->f("product_id"))) {
   $product_type = $ps_product_type->list_product_type($product_parent_id);
 }
 else {
   $product_type = $ps_product_type->list_product_type($db_browse->f("product_id"));
 }
 $products[$i]['product_type'] = $product_type;
 


После вставки этого кода, мы можем заходить в свой шаблон browse_N.php и в нужном месте выводить параметры для типа:

 
  <?php echo $product_type ?>
 


2. Следующая проблема заключается в том, что при выводе параметров, выводятся все параметры данного типа, даже пустые. Это нужно исправить.

Для этого будем давать параметру значение null, при необходимости введя его в список допустимых значений. А в файле components/com_virtuemart/themes/default/templates/common/product_type.tpl.php добавим условие:

 
  if($product_type_params["parameter_value"] != "null") {
    выводим параметр;
  }
 


3. Теперь, собственно, сделаем так, что бы можно было выбрать - какие параметры выводить в карточке товара, а какие в шаблоне категории. Для этого вставим чекбокс в админпанель редактирования параметра с названием: "Выводить параметр в шаблоне категории?". Если чекбокс будет выбран, то этот параметр будет выводиться как в карточке, так и в категории. Если нет - только в карточке.

Сначала внесем изменения в файл administrator/components/com_virtuemart/html/product.product_type_parameter_form.php. Ищем участок кода:
<tr> 
  <td width="25%" nowrap valign="top"><div align="right">
    <?php echo $VM_LANG->_('PHPSHOP_PRODUCT_TYPE_PARAMETER_FORM_MULTISELECT') ?>:</div>
  </td>
  <td width="75%" valign="top">
    <input type="checkbox" name="parameter_multiselect" value="Y" <?php if
 ($db->sf("parameter_multiselect")=="Y") echo "checked" ?>/>
  </td>
</tr>


Ниже, вставим следующий код:

 
    <tr> 
      <td width="25%" nowrap valign="top"><div align="right">
        <?php echo $VM_LANG->_('PHPSHOP_PRODUCT_TYPE_PARAMETER_INCATEGORY') ?>:</div>
      </td>
      <td width="75%" valign="top">
      <input type="checkbox" name="parameter_incategory" value="Y" <?php if ($db->sf("parameter_incategory")=="Y") echo "checked" ?>/>
      </td>
    </tr>
 
 


Добавим языковую переменную в файл administrator/components/com_virtuemart/languages/product/russian.php:

 
 'PHPSHOP_PRODUCT_TYPE_PARAMETER_INCATEGORY' => 'Выводить параметр в шаблоне категории?',
 


Теперь нам нужно создать новое поле в таблице _vm_product_type_parameter (не забываем про префикс). Идем в PHPMyAdmin и выполняем следующий запрос:

 
 ALTER TABLE `jos_vm_product_type_parameter` ADD `parameter_incategory` VARCHAR(50) NOT NULL DEFAULT 'N'
 


Следующий шаг - правка файла administrator/components/com_virtuemart/classes/ps_product_type_parameter.php. Тут необходимо дополнить функции add_parameter и update_parameter следующей строчкой:

 
 'parameter_incategory' => vmGet($d, 'parameter_incategory'),
 


И дальше передача значения нашего поля в файл product_type.tpl.php. Осуществляется она в файле administrator/components/com_virtuemart/classes/ps_product_type.php. Ищем строку:

$product_type_param[$i]["parameter_unit"] = $dba->f("parameter_unit");


И под ней сразу пишем:

 
 $product_type_param[$i]["parameter_incategory"] = $dba->f("parameter_incategory");
 


Вот, в общем то несложные действия, которые решают нашу проблему. Осталось только правильно поставить условие в шаблоне вывода параметров. Открываем файл components/com_virtuemart/themes/default/templates/common/product_type.tpl.php и где-то сверху пишем:

 
 $Call = debug_backtrace();
 $VMpage = JRequest::getVar('page', NULL);
 


Ниже выводим параметры товара. Включая наши условия должно получиться как то так:

 
      if($product_type_params["parameter_value"] != "null") {
        if($VMpage == "shop.product_details" && $Call[3]["function"] == "include") {
          ?><tr class="<?php echo $bgcolor;?>" height="18">
          <td class="product_type_l"><?php echo $product_type_params["parameter_label"]; 
 
          if ( !empty($product_type_params["tooltip"] ) ) { ?>
             <?php echo $product_type_params["tooltip"]; 
          } 
          ?>
          </td><td class="product_type_r"><?php echo $product_type_params["parameter_value"];
 
          if ( !empty($product_type_params["parameter_unit"] ) ) {
            echo " ".$product_type_params["parameter_unit"];
          } ?>
          </td></tr>
          <?php
        } else {
          if($product_type_params["parameter_incategory"] == "Y") {
            ?><tr class="<?php echo $bgcolor;?>" height="18">
            <td class="product_type_l"><?php echo $product_type_params["parameter_label"]; 
 
            if ( !empty($product_type_params["tooltip"] ) ) { ?>
               <?php echo $product_type_params["tooltip"]; 
            } 
            ?>
            </td><td class="product_type_r"><?php echo $product_type_params["parameter_value"];
 
            if ( !empty($product_type_params["parameter_unit"] ) ) {
              echo " ".$product_type_params["parameter_unit"];
            } ?>
            </td></tr>
            <?php
          }
        }
      }
 
 


Функция debug_backtrace(); добавлена на тот случай, если параметры выводятся в сопутствующих товарах или дополнительных модулях. Если не выводятся, то ее можно не использовать.




С ув. Stylish


Еще статьи: