We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 33563
    • 17 Posts
    Сразу покажу пример, чтобы было понятно:

    Пример вызова в Ditto:
    [!Ditto? &startID=`42` &tpl=`tpl` &extenders=`andFilter` &andFilterTv=`color:зелёный,красный;size:L,XL,XXL` !]
    — здесь color и size это TV документов, а дитто вернёт документы где все красные и зелёные вещи размеров L, XL и XXL.

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

    Код экстендера (/assets/snippets/ditto/extenders/andFilter.extender.inc.php):
    <?php
    // ---------------------------------------------------
    // Group: Filters
    // The filter works with TV settings that have multiple values, checking for compliance with each
    //**************************
    // zk — http://nopreset.ru
    //**************************
    // Example call Ditto:
    // [!Ditto? &startID=`42` &tpl=`tpl` &extenders=`andFilter` &andFilterTv=`color:green,red;size:L,XL,XXL` !] 
    // — will return documents where all the red and green things the size L, XL and XXL ;)
    // ---------------------------------------------------
    
    // If no fieldname value has been supplied, don't do anything else
    if ($andFilterTv === false) {
    	return false;	
    }
    
    global $tvsarray;
    $tmparray = explode ( ';', $andFilterTv);
    foreach ( $tmparray as $tmpvalue ) {
    		$tmpexplode = explode ( ':', $tmpvalue );
    		$tvsarray[] = $tmpexplode;
    		$filtertvs .= (empty($filtertvs)?"":",") . $tmpexplode[0];
    		}
    	
    
    
    $filters["custom"]["andFilter"] = array( $filtertvs, "andFilter"); 
      
    if (!function_exists("andFilter")) {
      function andFilter($resource) {
    	global $modx,$tvsarray;
    	$good = true;
    	foreach ( $tvsarray as $tv ) {
    		$values = explode( ',', $tv[1] );
    		if ( array_search($resource[$tv[0]], $values) !== false  ) {	  
    			$good = $good && true;
    		} else {
    			$good = $good && false;
    		}
    	}
    	
    	if ($good) { return 1; } else { return 0; }
    	
      }
    }
    ?>
    


    Ещё есть небольшой код для программного формирования фильтров, я их передаю через массив в GET с такими же названиями как TV.
    (Но у дитто есть баг с массивами, так что или фиксить дитто, или исправить на POST):
    //$array_param = array ( 'tv1', 'tv2' .. )
    function andFilterTvGet ( $array_param ) {
    
    foreach ( $array_param as $param ) {
        if (!is_array($_GET[$param])) continue;
        $andfilter .= (empty($andfilter)?"":";") . $param . ':';
        $params = '';
        foreach ($_GET[$param] as $value) {
            $param_g = htmlspecialchars($value);
            if ( !empty($param_g) ) $params .= (empty($params)?"":",") . $param_g; 
        }
        $andfilter .= $params;
     }
    
    return $andfilter;
    
    }
    


    З.Ы. Я делаю всего лишь свой первый сайт на modx, так что не судите строго, ну и конечно-же буду рад замечаниям и исправлениям.
      • 20050
      • 67 Posts
      Воспользовался программой.
      Спасибо, очень удобный скрипт.
        [!ditto? !][!ditto? !][!ditto &margaritto=`yes`!]
        • 33563
        • 17 Posts
        Спасибо, всегда приятно когда твоя работа кому-то идёт впрок!
          • 15286
          • 79 Posts
          Ещё есть небольшой код для программного формирования фильтров

          Может ли кто-нибудь подсказать, как сформировать фильтры?
            • 39417
            • 11 Posts
            Походу нужно вызывать
            andFilterTvPOST (tv1,tv2);
            

            [ed. note: doc777 last edited this post 11 years, 11 months ago.]
              • 47127
              • 7 Posts
              Подскажите, пожалуйста, как применить такой фильтр для цены: от и до?
                • 39417
                • 11 Posts
                Есть БАГ, проблема - когда в карточке выбраны оба параметра и мы их задали в поиске через фильтр, то результат выведет пусто!

                Пример: до http://take.ms/e8SW5 после http://take.ms/vDTLG

                p.s. Пробовал писать так http://take.ms/hBMJ3 - не помогает
                  • 47127
                  • 7 Posts
                  От использования andFilter у меня появилось две проблемы:

                  1. В значениях фильтра есть запятые: «Информационные технологии, интернет, телеком». Потом при передаче методом get или post, эти запятые трансформируются в символ "%2C" и соответственно уже ничего не фильтруется, т.к. одно не равно другому. Как это решить?

                  2. Мне нужна пагинация и фильтрация одновременно. Но получается, что если делать некэшируемый вывод дитто [!Ditto?… !], то не работает пагинация, а если кэшируемый [[Ditto?… ]], то не работает фильтрация.

                  вызов:
                  [!Ditto? &tpl=`vacan-list` &sortBy=`pub_date` &sortDir=`DESC` &dateSource = `pub_date` &dateFormat=`%d.%m.%Y` &display=`14` &paginate=`1` &extenders=`andFilter` &andFilterTv=`[!dittofilter!]` &noResults=`Извините, по Вашему запросу ничего не найдено.`!]

                  сниппет dittofilter:
                  <?php
                  global $modx;
                  $output="";
                  if ($_GET['sfera']){
                          $sfera=$_GET['sfera'];
                          $output.='sfera:'.$sfera.';';
                  }
                  if ($_GET['region']){
                          $region=$_GET['region'];
                          $output.='region:'.$region.';';
                  }
                  $output.='` &filter=`';
                  
                  if ($_GET['zpOt']){
                          $zpOt=$_GET['zpOt'];
                          $output.='zpDo,'.$zpOt.',3|';
                  }
                  if ($_GET['zpDo']){
                          $zpDo=$_GET['zpDo'];
                          $output.='zpOt,'.$zpDo.',4';
                  }
                  $output.='`';
                  return $output;
                  ?>


                  Помогите, пожалуйста!
                    • 16278
                    • 928 Posts
                    если делать некэшируемый вывод дитто [!Ditto?… !], то не работает пагинация
                    значит, вы используете плагин PHx? Какие у вас версии MODX и PHx? Мне показалось, что потребность использовать кэшируемый вызов Ditto вместе с некэшируемой страницой при установке плагина PHx исчезла с последней версией плагина.
                    ??? KP
                      • 39417
                      • 11 Posts
                      решение: вызывать Ditto внутри своего скрипта

                      пример
                      $docid = (isset($docid) && (int)$docid>0) ? (int)$docid : $modx->documentIdentifier;	// &docid=`[*id*]` 
                      $p['parents'] = $docid;
                      $p['tpl'] = 'cat_tpl';
                      $p['display'] = 'all';
                      // и так далее
                      $html = $modx->runSnippet('Ditto', $p); 
                      return $html;