EVO Несложный SqlFilter по нескольким ТВ

В общем, потребовалось сделать в документах Глоссария 2 ТВ шки заполненные Id шками и фото документов из каталога с фильтрацией документов каталога по нескольким ТВ.

В итоге с неоценимой помощью SSDTyphon
был написан снпипет SqlFilter

параметры:
* &filterTV =`filter_1_parameter, перкаль|filter_2_sostav, хлопок|DescriptionName1, белый` //имя ТВ и через запятую какому значению равно, ТВшки через |.

В итоге фильтрация будет такой:

filter_1_parameter = перкаль OR DescriptionName1 = белый

Проверял на 3 ТВ, но должно работать вроде и при большем кол-ве. Оператор задаем так:
* &mode=`OR` // можно фильтр через AND, можно через OR

* &parentId=`2`// ID родителя, задается опционально
* &limit=`50`; // ограничение по количеству выводимых документов из базы
* &Docfield=`id` // что хотим получить на выходе? Одновременно можно вызывать либо tvReturnName либо Docfield
* &tvReturnName=`image` //если на выходе хотим вернуть значения ТВшки из каталога, задаем имя этой ТВ

Вывод — список документов через запятую, например, если Docfield=`id` вывод выглядит так: 15637,15638,15639,15640, если &tvReturnName=`image`: 1.jpg, 2.jpg, 3.jpg,4.jpg

<?php
/*[[SqlFilter?&Docfield=`id`&filterTV =`filter_1_parameter,перкаль|filter_2_sostav,хлопок|DescriptionName1,белый`&mode=`OR`]]
 * &tvReturnName=`image`   //какое ТВ возвращать
 * &filterTV =`filter_1_parameter,перкаль|filter_2_sostav,хлопок|DescriptionName1,белый` //имя ТВ 
 * &mode=`OR` // можно через AND, можно через OR
 * &parentId=`2`// ID родителя, задается опционально
 * &limit=`50`; // ограничение 
 * &Docfield=`id` // опционально одновременно можно вызывать либо tvReturnName либо Docfield
 * @EVAL $pt=$modx->getDocument($docid,'pagetitle'); return $modx->evalSnippets("[[SqlFilter?&Docfield=`id`&filterTV =`filter_1_parameter,{$pt['pagetitle']}|filter_2_sostav,{$pt['pagetitle']}`&mode=`OR`]]");
*/
 

if(!isset($filterTV)) $filterTV = 'filter_1_parameter,перкаль|filter_2_sostav,хлопок'; // - имя 1 тв по которой фильтровать, значение филтра
if(!isset($mode))$mode="OR";
$limit = isset($limit) ? $limit=" LIMIT ".$limit.";" : ';';
$parentId =isset($parentId) ? $parentId: false;

$request="";
$where="";
$select_fields = "SELECT ";

$content_base =  $modx->getFullTableName('site_content');
$site_tv_vals = $modx->getFullTableName('site_tmplvar_contentvalues');    
$site_tv=$modx->getFullTableName('site_tmplvars');

$query=" FROM $content_base as sc ";
$FilterArr=explode("|", $filterTV);

$num=0;
foreach($FilterArr as $param) {
    $Filter=explode(",", $param);
    $inputTVname=$Filter[0];
    $f_val = $Filter[1];
    $query.="LEFT JOIN ($site_tv as tv{$num}, $site_tv_vals as tv{$num}val) ".
            "ON tv{$num}.id=tv{$num}val.tmplvarid and tv{$num}val.contentid=sc.id and tv{$num}.name='$inputTVname' ";

    if ($num>0){$where.=" $mode ";}

    $where.="tv{$num}val.value='{$f_val}'";
    $num++;
}


if ($parentId){
    $where="(".$where.")";
    $children = $modx->getChildIds($parentId, 10);
    $where .= ' AND sc.id IN ('.implode(',', $children) . ') '; 
} 

$where="WHERE ".$where." GROUP BY sc.id"; 


if(isset($tvReturnName)) {
    $query.="INNER JOIN ($site_tv as tvreturn, $site_tv_vals as tvreturnval) ".
        "ON tvreturn.id=tvreturnval.tmplvarid and tvreturnval.contentid=sc.id and tvreturn.name='$tvReturnName' ";
    $select_fields.="tvreturnval.value";
}
elseif (isset($Docfield)) {$select_fields.="sc.{$Docfield}";}

else return'';

$request = $modx->db->query($select_fields.$query.$where.$limit);
//$result = $modx->db->makeArray($request);
$result = array();
while($v = $modx->db->getValue($request)){
        $result[] = $v;
    }


return implode(',', $result);
?>


На вопрос, почему не сделал через Ditto или CatalogView, скажу, что так было мне удобнее и все тут.
Также, тут задавался вопрос, можно ли фильтр по нескольким ТВ сделать через SQL, вроде бы ответили.

Если будут вопросы по исправлениям и модификациям: SQL был полностью сформирован SSDTyphon, т.к. я в этом не разбираюсь, поэтому если будут вопросы лучше на форуме шопкпера спрашивать.

PHP мой, но там надо не спрашивать, а править, я пока учусь))

[REVO] Графическое представление взаимосвязи объектов

Не знаю как обстоят дела у остальных, а мне постоянно приходится заглядывать в схему modx.mysql.schema.xml, когда нужно сделать выборку связанных объектов. Что-то тривиальное, наподобие $user->getMany('CreatedResources'), уже отложилось в памяти, а вот более редко используемые связи заставляют каждый раз лезть в схему или сюда. В обоих случаях источники представлены в текстовом виде, что не особо наглядно. А хотелось бы так — открыл и сразу выхватил взглядом нужный объект и его взаимоотношения с другими. Поэтому сделал себе такую шпаргалку по некоторым наиболее часто используемым объектам.
Может не только мне пригодится.

Написать модуль для MODx Evo

Работа для опытного разработчика на MODx.
Суть модуля – автоматизация рутиных процессов в компании.

В качестве тех.задания – прототип в Axure. Там же можно будет увидеть набор сущностей, основные операции с данными.

Мой Skype – svfedorof
Готов обсуждать проект сегодня и завтра. От Вас – отсутствие проблем со сроками.

[REVO] Вывод статей articles с tv-параметрами

Здравствуйте!
Вопрос такой:
1.Создал tv-параметр [[*img_for_statii]]
2.Добавил изображения к статьям
3.Переделал чанк вывода статей Article Row Chunk, т.е. добавил
<div class="img_for_statii">
  <a href="[[~[[+id]]]]">[[*img_for_statii]]</a>
  </div>

В итоге изображения не выводятся, не могу понять в чем дело

EVO/@EVAL/TVevaler/ как передать значение pagetitle для обработки в снипет в @EVAL?

Добрый день, использую @EVAL(+TVevaler хотя это наверное не принципиально), вызов снипета такой:
@EVAL return $modx->evalSnippets("[[SqlFilter?&Docfield=`id`&filterTV =`filter_1_parameter,$_GET['pagetitle']|filter_2_sostav,$_GET['pagetitle']`&mode=`OR`]]");

Подскажите, как передать в снипет значение поля ['pagetitle'] меняющееся в зависимости от документа где ТВшка с этой привязкой? (в коде вместо поля $_GET['pagetitle'])

[REVO] Гуру, помогите с выводом тайтла родительской страницы

Мне нужно простое решение вывода тайтла родительской страницы.

Проблемы с FROM_UNIXTIME в where

Пишу сниплет, для выборки нужно следующее условие FROM_UNIXTIME(`publishedon`,"%Y") = year, для этого делаю
$query->where(array(' FROM_UNIXTIME(`publishedon`,"%Y") :=' => 2011,));
Но sql запрос не работает. Посмотрев на создаваемый запрос

SELECT `modResource`.`id` AS `modResource_id`, `modResource`.`type` AS `modResource_type FROM `site_content` AS `modResource` WHERE `modResource`.`FROM_UNIXTIME(`publishedon`,"%Y")` = '2011'   


Можно заметить, что перед FROM_UNIXTIME было добавлено modResource как это лечить?