@rudants
Front-end разработчик

Как сделать фильтрацию товаров?

Есть выборка нужных значений:
<?php
//Присваивание значения в поле, показывающее максимально большую цену
    $modx->setPlaceholder('priceMaxValue', getPriceMaxValue());
    //Вовзращает самое большое значение из всех существующих в таблице (максимальная цена)
    function getPriceMaxValue(){
        global $modx;
        $filter = array("tmplvarid" => 5);
        $priceMaxValueArray = $modx->GetCollection("modTemplateVarResource", $filter);
        $maxValueResultArray = array();

        foreach($priceMaxValueArray as $k=>$v){
            $res = preg_replace('/[^0-9]/', '', $v->get("value"));
            array_push($maxValueResultArray, $res);
        }
        return max($maxValueResultArray);
    }
    //Фильтры по ценам
    function getCatPrice(){
        $catPrice = $_GET["catPrice"];
        $catPriceArray = array();
        global $modx;

        for($i=0; $i<count($catPrice); $i++){
            $filter = array("tmplvarid" => 21, "value" => $catPrice[$i]);
            $tvs = $modx->getCollection("modTemplateVarResource", $filter);

            foreach($tvs as $k=>$v){
                $id = $v->get("contentid");
                array_push($catPriceArray, $id);
            }
        }
        return $catPriceArray;
    }
    //Фильтр по диапазону цен
    function getRangePrice(){
        $priceMinValue = $_GET["priceMinValue"];
        $priceMaxValue = $_GET["priceMaxValue"];
        global $modx;

        $filter = array("tmplvarid" => 5);
        $tvs = $modx->getCollection("modTemplateVarResource", $filter);
        $rangePriceArray = array();

        foreach ($tvs as $k=>$v){
            if($v->get("value") >= $priceMinValue && $v->get("value") <= $priceMaxValue){
                $res = $v->get("contentid");
                array_push($rangePriceArray, $res);
            }
        }
        return $rangePriceArray;
    }
    //Фильтр по категории "На праздник"
    function getCatHoliday(){
        $catHoliday = $_GET["catHoliday"];
        global $modx;

        $filter = array("tmplvarid" => 19, "value" => $catHoliday);
        $tvs = $modx->getCollection("modTemplateVarResource", $filter);
        $catHolidayArray = array();

        foreach($tvs as $k=>$v){
            $res = $v->get("contentid");
            array_push($catHolidayArray, $res);
        }
        return $catHolidayArray;
    }
    //Фильтр по категории "Подарки"
    function getCatGifts(){
        $catGifts = $_GET["catGifts"];
        global $modx;
        
        $catGiftsArray = array();
        for($i=0;$i<count($catGifts);$i++){
            $filter = array("tmplvarid" => 18, "value" => $catGifts[$i]);
            $tvs = $modx->getCollection("modTemplateVarResource", $filter);
            
            foreach($tvs as $k=>$v){
                $res = $v->get("contentid");
                array_push($catGiftsArray, $res);
            }
        }
        return $catGiftsArray;
    }
    
    if($_GET["filter_submit"]){
        $globalArray = array();
        if($_GET["catPrice"]){
            $globalArray = array_merge($globalArray, getCatPrice());
        }
        if($_GET["priceMinValue"] && $_GET["priceMaxValue"]){
            $globalArray = array_merge($globalArray, getRangePrice());
        }
        if($_GET["catHoliday"]){
            $globalArray = array_merge($globalArray, getCatHoliday());
        }
        if($_GET["catGifts"]){
            $globalArray = array_merge($globalArray, getCatGifts());
        }
        $globalArray = array_unique($globalArray);
        $lastArray = implode(",", $globalArray);
        $modx->setPlaceholder('queryResult', $lastArray);
    }


На выходе получаю GET-простыню такого вида:
catalog/?priceMinValue=1&priceMaxValue=77555&catHoliday=%238+марта%23&filter_submit=Отсортировать

Которая, конечно же, ничего не выводит. Он не понимает эти get-значения для фильтрации.

Хочется выводить выбранные ресурсы через сниппеты getResources\getPage.
Подскажите, пожалуйста, как реализовать задуманное.
  • Вопрос задан
  • 384 просмотра
Решения вопроса 1
Эмм, используешь getCollection и одновременно хочешь прогнать через getResources, мало логики.
если по твоему плану, тебе надо в этом сниппете запустить еще getResources и прогнать через него массив который ты набиваешь в функциях
$output = $modx->runSnippet('getPage',array(
   'element' => 'getResources',
   'resources' => $array // id
));
return $output;

лучше полученные с GET параметры подставить tvFilters не набивать лишний раз через getCollection
$output = $modx->runSnippet('getPage',array(
   'element' => 'getResources',
   'parent' => 0,
   'tvFilters' =>  ''//  условие
));
return $output;

а вообще для таких фильтраций лучше использовать getProducts, а еще лучше pdoResources/pdoPage а еще лучше воспользоваться готовым сниппетом tagmanager2 он работает с GET парамами
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы