Задача: создать для Виртумарта 2 (Joomla 2.5) поисковый фильтр, учитывающий сразу несколько параметров товара.


Решение:
1) Открываем файл \administrator\components\com_virtuemart\models\product.php
Находим в методе sortSearchListQuery  следующий код:

if (!empty($this->searchcustoms)) {
	$joinCustom = TRUE;
	foreach ($this->searchcustoms as $key => $searchcustom) {
		$custom_search[] = '(pf.`virtuemart_custom_id`="' . (int)$key . '" and pf.`custom_value` like "%' . $this->_db->getEscaped ($searchcustom, TRUE) . '%")';
	}
	$where[] = " ( " . implode (' OR ', $custom_search) . " ) ";
}

и заменяем его на:

if (!empty($this->searchcustoms)){
 $joinCustom = true; 
 foreach ($this->searchcustoms as $key => $searchcustom) {
   if($searchcustom=trim($searchcustom)){
     $key=intval($key); 
     $custom_search[$key] = '(pf'.$key.'.`virtuemart_custom_id`="'.$key.'" and pf'.$key.'.`custom_value` like "' . 
                                $this->_db->getEscaped( $searchcustom, true ) . '")';
   }
 }
 if(count($custom_search)) $where[] = " ( ".implode(' AND ', $custom_search )." ) ";
 else{
   $joinCustom=false;
   $this->searchcustoms=false;
 }
}


2) ниже находим:

 

if ($this->searchcustoms) {
	$joinedTables[] = ' LEFT JOIN `#__virtuemart_product_customfields` as pf ON p.`virtuemart_product_id` = pf.`virtuemart_product_id` ';
}

 

и тоже заменяем на:

if ($this->searchcustoms) {
 foreach (array_keys($this->searchcustoms) as $key) { 
 $joinedTables .= ' LEFT JOIN `#__virtuemart_product_customfields` as pf'.$key.
                ' ON p.`virtuemart_product_id` = pf'.$key.'.`virtuemart_product_id` ';
 }
}

 

3) открываем файл \components\com_virtuemart\views\category\tmpl\default.php
Находим строку

<div class="orderby-displaynumber">

и после нее заменяем этот код:

<div class="width70 floatleft">
	<?php echo $this->orderByList['orderby']; ?>
	<?php echo $this->orderByList['manufacturer']; ?>
</div>

на этот:

<?php
/*
Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, 
это ID записи, в нашем случаи это «Размер» и «Цвет», тип поля «Атрибут корзины».
*/
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
$customfields=array(4=>0, 10=>0);
$var=JRequest::getvar('customfields', null);
foreach($customfields as $custom_id => &$value){
 if($var && !empty($var[$custom_id])) 
   $value='&customfields['.$custom_id.']='.$var[ $custom_id];
 else unset($customfields[$custom_id]);
}
$db=JFactory::getDbo();
foreach($results as $custom_id => &$result){
 $ff=$customfields;
 unset($ff[$custom_id]); 
 $ff=implode('', $ff);
 
 $title=$result;
 $result='';
 $db->setQuery('
            SELECT DISTINCT(custom_value) AS value 
            FROM #__virtuemart_product_customfields WHERE virtuemart_custom_id='.
            $custom_id); 
 $res=$db->loadObjectList();
 
 if(!is_array($res) || !count($res)) continue;
 
//Массив значений
 $a=array(0=>'Любой');
 
//Заносим данные из таблицы в массив значений
 foreach($res as $v) $a[$v->value]=$v->value; 
 
//Сортируем 
 ksort($a); 
//Получаем значение выбранного фильтра из запроса пользователя
 $value=JRequest::getvar('customfields', null);
 $value=(isset($value[$custom_id])) ? $value[$custom_id] : 0;
//Это значение помещаем в начало массива
 if($value && isset($a[$value])){ 
 $x=array( $value=>'' );
 foreach($a as $k => $v) $x[$k]=$v;
 $a=$x; 
 }else $value=0; 
//Создаем фильтр
 $result='<div><div>'.$title.'</div>'; 
 $flag=false;
 foreach($a as $k => $v){
   if((string)$k==(string)$value) $x='<div>';
   else{
     if(!$flag){
       $x='<div><div>'; 
       $flag=true;
     }else $x='<div>';
   }
   $result.=$x.'<a href="'.JRoute::_(
            'index.php?option=com_virtuemart&view=category&limitstart=0&virtuemart_category_id='.
            $this->category->virtuemart_category_id.$ff.
            (($k) ? '&customfields['.$custom_id.']='.$k : '')).'">'.$v.'</a></div>'; 
 }
 $result.='</div></div>';
}
?>
<div>
    <table border=0 cellpadding="0" cellspacing="0" style="margin:0;padding:0">
        <tr>
            <td> 
            <?php echo $this->orderByList['orderby']; ?>
            <?php echo $this->orderByList['manufacturer']; ?>
            </td>
            <td>&nbsp;<?php echo $results[4]; ?> </td>
            <td>&nbsp;<?php echo $results[10]; ?> </td>
        </tr>
    </table>
</div>

 

Никаких мыслей по поводу “Поиск товаров в Virtuemart 2 по нескольким фильтрам”