Фильтрация ресурсов по значению переменной шаблона с помощью MODx Wayfinder

У меня есть сайт, который использует Wayfinder для отображения последних 3 записей из блога статей. Теперь я хочу учитывать только те записи блога, которые помечены Highlights.

Мой исходный вызов Wayfinder выглядит так, ничего особенного:

[[!Wayfinder? &startId=`296` &level=`1`
    &outerTpl=`emptyTpl`
    &innerTpl=``
    &rowTpl=`thumbnails_formatter`
    &ignoreHidden=`1`
    &sortBy=`menuindex`
    &sortOrder=`DESC`
    &limit=`3`
    &cacheResults=`0`
]]

поскольку теги статей управляются через articlestags TV, я подумал, что &where может помочь, но пока не повезло:

&where=`[{"articlestags:LIKE":"%Highlights%"}]`

ничего не дает. В качестве проверки работоспособности я попробовал [{"pagetitle:LIKE":"%something%"}], и это сработало. Очевидно, проблема в том, что articlestags не является столбцом modx_site_content, но я не уверен, как поставить подзапрос.

SELECT contentid
FROM modx_site_tmplvar_contentvalues
WHERE tmplvarid=17
  AND value LIKE '%Highlights%'

Дал мне правильные идентификаторы в приглашении sql, но добавление его к вызову Wayfinder снова дало пустой результат:

&where=`["id IN (SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE tmplvarid=17 AND value LIKE '%Highlights%')"]`

Любые идеи о том, как этого добиться? Я хотел бы остаться с Wayfinder для согласованности, но приветствуются и другие решения.


person Silly Freak    schedule 08.08.2014    source источник


Ответы (4)


Вы можете просто использовать pdomenu (часть pdoTools) вместо Wayfinder

[[!PdoMenu? 
    &startId=`296` 
    &level=`1`
    &outerTpl=`emptyTpl`
    &innerTpl=``
    &rowTpl=`thumbnails_formatter`
    &ignoreHidden=`1`
    &sortBy=`menuindex`
    &sortOrder=`DESC`
    &limit=`3`
    &cacheResults=`0`

    &includeTVs=`articlestags`
    &where=`[{"TVarticlestags.value:LIKE":"%filter%"}]`

]]
person Vasis    schedule 09.08.2014
comment
Спасибо за предложение! Я предпочитаю не устанавливать дополнительные плагины прямо сейчас, но это кажется довольно универсальным. Однако на дополнительной странице показано 9 лайков и 56 дизлайков. У вас есть идеи, почему это может быть? - person Silly Freak; 09.08.2014
comment
Это не плагины, это просто несколько полезных фрагментов. Большая часть документации на русском, поэтому столько дизлайков, но если посмотреть исходники ( github. com/bezumkin/pdoTools ) и понять, как это работает, им очень сложно помочь вам в разработке - person Vasis; 09.08.2014
comment
ах, неудача терминологии! Я имел в виду плагин, как в чем-то, установленном через диспетчер пакетов, я вижу языковой барьер, безусловно, проблема. Я буду помнить о pdoTools, если у меня снова возникнут проблемы с запросами в будущем! - person Silly Freak; 10.08.2014

Взгляните на некоторые из файлов конфигурации [core/components/wayfinder/configs] — я не пробовал, но похоже, что вы можете запустить свой запрос на выборку прямо в конфигурации и передать массив tmplvarid в переменную $where. .

person Sean Kimball    schedule 09.08.2014
comment
если я правильно понял, то, что вы предлагаете, похоже на &where='["id IN [[!runMyQuery]]"]' (обратные кавычки заменены), просто запрос выполняется в config.php вместо snippet.php, и где также устанавливается в конфигурации, а не в путевом устройстве вызов? - person Silly Freak; 09.08.2014
comment
Почти точно, но без дополнительных фрагментов и т. д. На самом деле, вы можете просто получить массив modResource, используя значения TV в качестве критериев, хотя я не уверен, что вам придется присоединяться к таблицам TV vars в критериях как хорошо [я не уверен, что они являются частью объекта modResource ~ вам нужно проверить] - person Sean Kimball; 09.08.2014

Небольшая игра привела меня к решению: мне нужно было указать имя класса (а не имя таблицы) при обращении к идентификатору:

&where=`["modResource.id IN (SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE tmplvarid=17 AND value LIKE '%Highlights%')"]`

небольшой тест показал, что даже простой

&where=`["id = 123"]`

не работает без modResource..

Взгляд на wayfinder.class.php показывает следующую строку, которая кажется «виновником»:

$c->select($this->modx->getSelectColumns('modResource','modResource'));

Этот метод использует псевдонимы для выбранных столбцов — соответствующий код находится в xpdoobject.class.php. Первый параметр — это имя класса, второй — псевдоним таблицы. В результате запрос выбирает id AS modResource.id и так далее.


EDIT: окончательная версия моего запроса:

&where=`["modResource.id IN (
    SELECT val.contentid
    FROM modx_site_tmplvars AS tv
    JOIN modx_site_tmplvar_contentvalues AS val
     ON tv.id = val.tmplvarid
    WHERE tv.name = 'articlestags' AND (
        val.value = 'Highlights'
     OR val.value LIKE 'Highlights,%'
     OR val.value LIKE '%,Highlights'
     OR val.value LIKE '%,Highlights,%'
    )
)"]`

Я не утверждаю, что этот запрос особенно эффективен (кажется, я припоминаю, что условия ИЛИ плохие). Кроме того, MODx не будет работать с этим, если символы новой строки не удалены. Тем не менее, я предпочитаю публиковать запрос в хорошо отформатированном виде.

person Silly Freak    schedule 09.08.2014

Я использовал сниппет в качестве параметра для includeDocs путеводителя. В моем случае это было полезно, потому что мне нужны были разные ресурсы в меню в зависимости от браузера пользователя (мобильного или рабочего стола).

[[!Wayfinder? 
    &startId=`4`
    &level=`1`
    &includeDocs=`[[!menu_docs?&startId=`4`]]`
    &outerTpl=`home_menu_outer`
    &rowTpl=`menu_row`
]] 

а затем фрагмент меню_docs

<?php
if (empty ($startId))
    return;

if (!isMobileDevice())
    return;


$query = $modx->newQuery('modResource');
$query->innerJoin('modTemplateVarResource','TemplateVarResources');
$query->where(array(
    'TemplateVarResources.tmplvarid' => 3,
    'TemplateVarResources.value:LIKE' => 'yes',
    'modResource.parent' => $startId,
    'modResource.deleted' => 0,
    'modResource.published' => 1,
    'modResource.hidemenu' => 0
));
$resources = $modx->getCollection('modResource', $query);

$ouput = array();
foreach ($resources as $resource)
    $output[] = $resource->get('id');

return implode (',', $output);
person electroid    schedule 03.08.2015