спасибо toliki! твой код очень помог. расширив его, можно реализовать поиск по различным атрибутам сразу. Я лишь хочу поделиться что реализовал, в расчёте, что кому-то это пригодится.
ставил на Joomla 1.7.
1. Файл form.php \components\com_jshopping\templates\default\search\form.php. Здесь реализован собственно вывод селектов различных атрибутов. <input type="hidden" name="setsearchdata" value="1">
<table class = "jshop" cellpadding = "6" cellspacing="0">
после строк вставляем код:
<tr>
<td>
<strong>
<?php print _JSHOP_ATTRIBUTVALUES ?>
</strong>
</td>
<td>
<?php print $this->list_attributvalues ?>
</td>
</tr>
<tr>
<td>
<strong>
<?php print _JSHOP_ATTRIBUTVALUES3 ?>
</strong>
</td>
<td>
<?php print $this->list_attributvalues_3 ?>
</td>
</tr>
<tr>
<td>
<strong>
<?php print _JSHOP_ATTRIBUTVALUES4 ?>
</strong>
</td>
<td>
<?php print $this->list_attributvalues_4 ?>
</td>
</tr>
2. Файл attributvalue.php components/com_jshopping/tables/attributvalue.php. Здесь реализуем собственно отсеивание информации формируемой инфы. Каждый атрибут имеет в таблице mysql свой id. Передав этот id в функцию получения значений аттрибутов, мы будем получать значения только тех аттрибутов, которые нам нужны для данного селекта. $rows[$v->value_id] = $v->name;
}
return $rows;
}else{
return $attribs;
}
}
После этих строк (проверьте скобки!) добавляем ещё одну функцию с именем "getAllAttributeValues_check".
function getAllAttributeValues_check($attr_id_check, $resulttype=0){
$db =& JFactory::getDBO();
$lang = &JSFactory::getLang();
$query = "SELECT value_id, image, `".$lang->get("name")."` as name, attr_id, value_ordering FROM `#__jshopping_attr_values` where attr_id='".$attr_id_check."' ORDER BY value_ordering, value_id";
$db->setQuery($query);
$db->setQuery($query);
$attribs = $db->loadObjectList();
if ($resulttype==2){
$rows = array();
foreach($attribs as $k=>$v){
$rows[$v->value_id] = $v;
}
return $rows;
}elseif ($resulttype==1){
$rows = array();
foreach($attribs as $k=>$v){
$rows[$v->value_id] = $v->name;
}
return $rows;
}else{
return $attribs;
}
}
Это полностью скопированная функция getAllAttributeValues, только на 1 получаемый параметр больше (собственно значение атрибутов) и дополнительную проверку в запросе mysql на наличие этого самого атрибута. Уверен, есть решение более лаконичное, чем тупо создание новой функции, но у меня ещё очень много задач по jshopping'у, и это ещё видимо, не самое сложное.
3. файл search.php \components\com_jshopping\controllers\search.php. а) Создаём дополнительные селекты (используя наше новое обращение по номеру атрибута), а также присваиваем разные имена каждому селекту, чтобы возвращались разные значения в поиск, а не только одно value_id.$list_manufacturers = JHTML::_('select.genericlist', $manufacturers, 'manufacturer_id', 'class = "inputbox" size = "1"','manufacturer_id','name' );
после кода вставляем следующий:
$first = JHTML::_('select.option', 0, 'all', 'value_id', 'name');
$_attributvalues = &JTable::getInstance('attributvalue', 'jshop');
$attributvalues = jshopAttributValue::getAllAttributeValues_check(1,2);
array_unshift($attributvalues, $first);
$list_attributvalues = JHTML::_('select.genericlist', $attributvalues, 'value_id', 'class = "inputbox" size = "1"','value_id','name' );
$first = JHTML::_('select.option', 0, 'all', 'value_id', 'name');
$_attributvalues = &JTable::getInstance('attributvalue', 'jshop');
$attributvalues = jshopAttributValue::getAllAttributeValues_check(3,2);
array_unshift($attributvalues, $first);
$list_attributvalues_3 = JHTML::_('select.genericlist', $attributvalues, 'value_id_3', 'class = "inputbox" size = "1"','value_id','name' );
$first = JHTML::_('select.option', 0, 'all', 'value_id', 'name');
$_attributvalues = &JTable::getInstance('attributvalue', 'jshop');
$attributvalues = jshopAttributValue::getAllAttributeValues_check(4,2);
array_unshift($attributvalues, $first);
$list_attributvalues_4 = JHTML::_('select.genericlist', $attributvalues, 'value_id', 'class = "inputbox" size = "1"','value_id','name' );
б) Подкючаем созданные объекты (? я хз как они называются). Группы элементов... $view->assign('list_categories', $list_categories);
после этой строчки вставляем следующий код:
$view->assign('list_manufacturers', $list_manufacturers);
$view->assign('list_attributvalues', $list_attributvalues);
$view->assign('list_attributvalues_3', $list_attributvalues_3);
$view->assign('list_attributvalues_4', $list_attributvalues_4);
в) Дополняем получение переменных из запроса. $manufacturer_id = intval($post['manufacturer_id']);
После этого кода вставляем:
$value_id = intval($post['value_id']);
$value_id_3 = intval($post['value_id_3']);
$value_id_4 = intval($post['value_id_4']);
или вставьте через реквесты, о чём говорил
г) Теперь последнее - дополнительные запросы к поиску по базе. if ($jshopConfig->hide_product_not_avaible_stock){
$where[] = " AND prod.product_quantity > 0";
}
после этого кода вставляем следующий:
if($value_id||$value_id_3||$value_id_4) {
if ($value_id ==0&&$value_id_3==0)
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_4 = '".$value_id_4."'";
}
elseif ($value_id ==0&&$value_id_4==0)
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_3 = '".$value_id_3."'";
}
elseif ($value_id_3 ==0&&$value_id_4==0)
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_1 = '".$value_id."'";
}
elseif ($value_id_3 ==0)
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_1 = '".$value_id."' AND attr.attr_4 = '".$value_id_4."' ";
}
elseif ($value_id_4 ==0)
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_1 = '".$value_id."' AND attr.attr_3 = '".$value_id_3."' ";
}
elseif ($value_id ==0)
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_3 = '".$value_id_3."' AND attr.attr_4 = '".$value_id_4."' ";
}
else
{
$from[] = " LEFT JOIN `#__jshopping_products_attr` AS attr ON prod.product_id = attr.product_id";
$where[] = " AND attr.attr_1 = '".$value_id."' AND attr.attr_3 = '".$value_id_3."' AND attr.attr_4 = '".$value_id_4."' ";
}
}
Насчёт последнего: выбирает нужный запрос в зависимости от того сколько пришло value отличных от нуля (0 == disabled): искать сразу по трём параметрам, искать сразу по двум пришедшим, искать по одному, или (если вообще не пришло ни одного значения) не добавлять поиск по атрибутам вовсе.
4.Ещё можно намутить руссик: Ru-ru.php /components/com_jshopping/lang/Ru-ru.phpвставьте где-нибудь после строки
// Searchdefine('_JSHOP_ATTRIBUTVALUES','Высота');
define('_JSHOP_ATTRIBUTVALUES3','Ширина');
define('_JSHOP_ATTRIBUTVALUES4','Тип');
а ещё лучше, конечно, оригинальное имя атрибута вывести.