MODX - Wayfinder

Waifinder - чаще используется для меню. В отличие от некоторых других "переборщиков" ресурсов, он позволяет вывести первый уровень ресурсов и все их дочерние в разных шаблонах. Т.е. явно заточен под меню. Можно вывести дочерние только текущего ресурса и т.п..

Решил я запустить как-то Wayfinder из конфигурации:

        
[[Wayfinder?
 &config=`cppv/cppvMainMenu`
]]
  
    
А в самом cfg:
        
$startId=5;            
$level=4;
$outerTpl='@CODE:<ul class="nav navbar-nav tbl f26 ffcd">[[+wf.wrapper]]ul>'; 
$rowTpl='@CODE:<li class="tblCell ">
   <a class="clWt" href="[[+wf.link]]" title="[[+wf.title]]" [[+wf.attributes]]>[[+wf.linktext]]</a>
li>';
  
    

.... и обломался. Загружались параметры по умолчанию. Пол-дня порывшись в исходниках понял, что сниппет немного кривой. Дело в том, что весь файл конфигурации просто подключается через "include", и разработчик позабыл про инициализацию параметров. Но про шадблоны не забыл. В итоге заработало при такой конфигурации. Возможно в вашей версии это уже исправлены.

        
<?php            
$scriptProperties['startId']=5;
$scriptProperties['level']=1;
$scriptProperties['selfClass'] ='current';
$outerTpl='@CODE:<ul class="nav navbar-nav tbl f26 ffcd">[[+wf.wrapper]]</ul>'; 
$rowTpl='@CODE:<li class="tblCell [[+wf.classnames]]">
   <a class="clWt" href="[[+wf.link]]" title="[[+wf.title]]" [[+wf.attributes]]>[[+wf.linktext]]</a>
</li>';
  
    

А потому что тут чистый PHP. Можно кучу всего сделать до запуска сниппета. Например, динамически создать параметры. Опять же все в одном месте. И шаблоны, и параметры. Радует, что практически все нормальные сниппеты имеют возможность запуска с конфигурацией. Еще один плюс - конфигурация это внешний файл, который можно редактировать вне MODX. Короче, мне такая опция очень сильно облегчает жизнь.

Случайно наткнулся на классную диаграмму

Сам запрос:


	$sql = "SELECT DISTINCT {$fields} 
	        FROM {$tblsc} sc 
	        LEFT JOIN {$tbldg} dg ON dg.document = sc.id 
	        WHERE sc.published=1 
	           AND sc.deleted=0 
	           AND ({$access}){$menuWhere} 
	           AND sc.id IN (".implode(',',$ids).") 
	        GROUP BY sc.id 
	        ORDER BY {$sort} {$this->_config['sortOrder']} {$sqlLimit};";

    
    
Вроде ничего особенного. И я так думал. Но есть интересные моменты. Разберем все подстановки.

$fields="sc.id, sc.menutitle, sc.pagetitle, sc.introtext, sc.menuindex, sc.published, sc.hidemenu, sc.parent, sc.isfolder, sc.description, sc.alias, sc.longtitle, sc.type,if(sc.type='reference',sc.content,'') as content, sc.template, sc.link_attributes";
{$tblsc} и {$tbldg} - это modx_site_content и modx_document_groups.

Ну тут ничего интересного, кроме оператора if в запросе. Даже не подозревал о такой возможности.
    

{$access}=($modx->isFrontend() ? "sc.privateweb=0" : "1='{$_SESSION['mgrRole']}' OR sc.privatemgr=0").(!$docgrp ? "" : " OR dg.document_group IN ({$docgrp})");

это тоже не интересно.
    

{$menuWhere}= ' AND sc.hidemenu=0'; 
        .= " AND sc.id IN ({$this->_config['includeDocs']})";
        .= " AND (sc.id NOT IN ({$this->_config['excludeDocs']}))";
        
А вот тут очень интересно. Поскольку сюда тупо подставляется конфиг, значит можно сделать так:
[[Wayfinder? &includeDocs=`select contentid from modx_site_tmplvar_contentvalues 
                  where tmplvarid=4 
                  and value between 2600 and 3000
                 `   
]]                 

Т.е. выбрать все страницы товаров с ценой между 2600 и 3000.  Ну очень круто.
Аналогично можно и для &excludeDocs.
    

{$ids} - тут собираются все потомки, решается включать ли вызывающего (&displayStart) и т.п. 
Основная выборка -  $ids = $modx->getChildIds($this->_config['id'],$depth);
Причем сначала выбираются все потомки, и только при их наличие запускается запрос.
    

{$sort}='rand()'; или =sc.'.implode(',sc.',preg_replace("/^\s/i","",explode(',',$this->_config['sortBy']))); 
                   в зависимости от параметров.
                   
{$sqlLimit}=" LIMIT 0, {$this->_config['limit']}";
 и на это нам не повлиять
 ........................ тут все where, limit и прочее ...........................
 $c->where(array('modResource.id:IN' =>  $ids)); -  т.е. в пределах ранее выбранных ресурсов.

$result = $this->modx->getCollection('modResource', $c);  
    

to be continued ...


Комментарии 0






Разрешённые теги: <b><i><br>Добавить новый комментарий: