Сразу покажу пример, чтобы было понятно:
Пример вызова в 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, так что не судите строго, ну и конечно-же буду рад замечаниям и исправлениям.