Nik_ADA
2 сент. 2015 г., 15:46

Реализация фильтрации в shopModx

Добрый день, нужен совет или точек в каком направлении двигаться. Начал делать фильтры, расширил класс, все роде работает нормально.
При реализации фильтрования почему-то работает только с 1 параметром если выбрать 2 уже почему то не очень хочет искать. Добавил выборку по TV
$c->leftJoin('modTemplateVarResource','TVResources', 'TVResources.contentid = Product.resource_id'); $c->leftJoin('modTemplateVar','TemplateVar', 'TVResources.tmplvarid = TemplateVar.id');
ну и само условие where
foreach ($tvFilters as $value) { $key = explode("==", $value); $filter['TemplateVar.name'] = $key[0]; $filter['TVResources.value:='] = $key[1]; $c->where($filter); }
и так тоже пробовал
$filter_array = array(); foreach ($tvFilters as $value) { $key = explode("==", $value); $filter['TemplateVar.name'] = $key[0]; $filter['TVResources.value:='] = $key[1]; $filter_array[] = $filter; } $c->where($filter_array);
с 1 значением выводит если выбрать уже 2 TV поля то уже перестает работать.
Подскажите в чем у меня ошибка, в каком направлении копать.
Копать в сторону изучения SQL. Не может у тебя одно TV поле называться и 'somename_1' и 'somename_2'. А у тебя при указании двух параметров формируется запрос where tv_name = 'somename_1' AND tv_name = 'somename_2';
Запросы у меня создаются примерно такие
WHERE ( ( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 ) AND `modResource`.`parent` IN (156,178,179,180,181,182,183,184,185,186,187,188,189,190,191) AND ( ( `TemplateVar`.`name` = 'shape' AND `TVResources`.`value` = 'rectangle' ) AND ( `TemplateVar`.`name` = 'processing_edge' AND `TVResources`.`value` = '10' ) ) )
или
WHERE ( ( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 ) AND `modResource`.`parent` IN (156,178,179,180,181,182,183,184,185,186,187,188,189,190,191) AND ( `TemplateVar`.`name` = 'shape' AND `TVResources`.`value` = 'rectangle' ) AND ( `TemplateVar`.`name` = 'processing_edge' AND `TVResources`.`value` = '10' ) )
Каждое поле по отдельности, но не как не вместе
Потому и говорю «учи SQL». Ты не совсем понимаешь принципа работы базы данных. Каждая выбранная строка должна соответствовать всем указанным условиям. Возьми из всех своих строк только одну. Будет ли в ней name равняться сразу и 'shape' и 'processing_edge'? Это физически не возможно. У тебя должно быть примерно так:
WHERE ( ( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 ) AND `modResource`.`parent` IN (156,178,179,180,181,182,183,184,185,186,187,188,189,190,191) AND ( ( `TemplateVar`.`name` = 'shape' AND `TVResources`.`value` = 'rectangle' ) OR ( `TemplateVar`.`name` = 'processing_edge' AND `TVResources`.`value` = '10' ) ) )
ладно а как тогда построить запросто что бы он проверил 2 TV в одном ресурсе,
$alias = $c->getAlias(); $c->innerJoin('modTemplateVarResource', 'tv_shape', "tv_shape.contentid = {$this->classKey}.id AND tv_shape.tmplvarid = $tv_shape_id AND tv_shape.value='rectangle'"); $c->innerJoin('modTemplateVarResource', 'tv_processing_edge', "tv_processing_edge.contentid = {$this->classKey}.id AND tv_processing_edge.tmplvarid = $tv_processing_edge_id AND tv_processing_edge.value='10'");
Николай большое спасибо за помощь, все работает.

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