Результаты одного сниппета в параметрах другого
С ModX только начинаю работать, поэтому есть некоторые непонятности…
Хочу в шаблоне последовательны вызвать 2 сниппета и в один из которых передать результаты другого. А конкретно:
[[!DetectUserRegion]]
[[getResources? &parents=`[[*id]]` &includeContent=`1` &where=`{«pagetitle:LIKE»:"[[!+DetectedRegion]]"}` &debug=`1`]]
Последовательность эта в ModX Revo не работает. Расследование мое показало, что в getResources попадает
$where = '{«pagetitle:LIKE»:"[[!+DetectedRegion]]"}'
Т.е. подстановка плейсхолдера в процессе вызова второго сниппета не происходит (как я подозреваю, плейсхолдеры подставляются в самом конце, при выводе страницы в броузер).
Главный вопрос, можно ли как-нибудь передать параметр во второй сниппет не вызывая его через runSnippet()?
Хочу в шаблоне последовательны вызвать 2 сниппета и в один из которых передать результаты другого. А конкретно:
[[!DetectUserRegion]]
[[getResources? &parents=`[[*id]]` &includeContent=`1` &where=`{«pagetitle:LIKE»:"[[!+DetectedRegion]]"}` &debug=`1`]]
Последовательность эта в ModX Revo не работает. Расследование мое показало, что в getResources попадает
$where = '{«pagetitle:LIKE»:"[[!+DetectedRegion]]"}'
Т.е. подстановка плейсхолдера в процессе вызова второго сниппета не происходит (как я подозреваю, плейсхолдеры подставляются в самом конце, при выводе страницы в броузер).
Главный вопрос, можно ли как-нибудь передать параметр во второй сниппет не вызывая его через runSnippet()?
Комментарии: 12
вызывайте сниппет без знака плюс
Еще попробуйте оба сниппета вызывать некешированными
[[getResources? &parents=`[[*id]]` &includeContent=`1` &where=`{«pagetitle:LIKE»:"[[!DetectedRegion]]"}` &debug=`1`]]
Да и кавычки у вас разные в условииЕще попробуйте оба сниппета вызывать некешированными
По задумке, DetectedRegion — это не сниппет, а плэйсхолдер, получаемый из предыдущего сниппета, поэтому он идет с плюсом.
Передать в сниппет не плейсхолдер, а результат другого сниппета напрямую я тоже пробовал — не получается.
Создал специальный сниппет:
<?php
$fl = fopen('/var/tmp/new','w');
fwrite($fl, $param);
fclose($fl);
И передаю туда
? ¶m=`[[!DetectUserRegion]]`
в результате в файл записывается именно [[!DetectUserRegion]], а не результат выполнения.
P.S. В оригинале с кавычками все Ok. Это они при посте поменялись.
Передать в сниппет не плейсхолдер, а результат другого сниппета напрямую я тоже пробовал — не получается.
Создал специальный сниппет:
<?php
$fl = fopen('/var/tmp/new','w');
fwrite($fl, $param);
fclose($fl);
И передаю туда
? ¶m=`[[!DetectUserRegion]]`
в результате в файл записывается именно [[!DetectUserRegion]], а не результат выполнения.
P.S. В оригинале с кавычками все Ok. Это они при посте поменялись.
Если второй сниппет вызывается кэшированным, а первый нет — то он будет обработан раньше первого.
Должно быть так:
Ну и в сниппете DetectUserRegion, конечно, должно быть:
Должно быть так:
[[!DetectUserRegion]]
[[!getResources?
&parents=`[[*id]]`
&includeContent=`1`
&where=`{"pagetitle:LIKE":"[[+DetectedRegion]]"}`
&debug=`1`
]]
Ну и в сниппете DetectUserRegion, конечно, должно быть:
$modx->setPlaceholder('DetectedRegion', 'Значение');
Огромное спасибо! Отключил кэширование в getResources и все заработало.
Еще не подскажите, случайно, где можно прочитать про порядок подстановки чанков, сниппетов и т.д.? Обыскал рунет, но толком ничего не нашел… :(
Еще не подскажите, случайно, где можно прочитать про порядок подстановки чанков, сниппетов и т.д.? Обыскал рунет, но толком ничего не нашел… :(
Обновим тему))
Вызываю вот так — все работает — почему? Судя из вышеприведенных постов, не должно работать…
Вызываю вот так — все работает — почему? Судя из вышеприведенных постов, не должно работать…
[[!pdoPage?
&element=`msProducts`
&includeThumbs=`360x270`
&limit=`4`
[[!sortPrice]]
]]
сниппет sortPrice:$output = '&sortby=`id` &sortdir=`desc`';
if ($_GET["sort"] == "price_up") $output = '&sortby=`Data.price` &sortdir=`asc`';
if ($_GET["sort"] == "price_down") $output = '&sortby=`Data.price` &sortdir=`desc`';
return $output;
Потому что MODX сначала разбирает вложенные теги и вставляет результат от них на место вызова.
Вот и работает, хоть и говонокод.
Вот и работает, хоть и говонокод.
А в чем *****код? нужно обосновать! скорость загрузки упадет? или повысится вероятность xss-атаки? В чем г-код???
Как минимум, нужно разобрать 2 тега вместо одного.
Как максимум, потом подобный стиль приводит к такому (сегодня только в другом месте спрашивали)
Хотя всё это можно засунуть в один свой сниппет, из которого потом выдать
То, что система позволяет что-то делать, не говорит о том, что делать так — хорошо и правильно. Но вообще, лично мне пофиг, удачи в разработке сайтов.
Как максимум, потом подобный стиль приводит к такому (сегодня только в другом месте спрашивали)
[[!pdoResources?
[[+parent:neq=``:then=`
&parents=`[[+parent]]`
&sortby=`menuindex`
`:else=`
&parents=`0`
&resources=`[[+resources]]`
&sortby=`FIELD(modResource.id, [[+resources]] )`
`]]
&showHidden=`1`
&sortdir=`ASC`
&depth=`0`
&limit=`[[+limit]]`
&tpl=`block_tag-row`
&includeTVs=`[[+image_type]],product_overview-label,content.tag`
&processTVs=`[[+image_type]],product_overview-label,content.tag`
&imageType=`[[+image_type]]`
[[!getUrlParam:neq=``:then=`&tvFilters=`content.tag===[[!getURLParam?&name=`tag`&max=`100`]]``? &name=`tag`]]
&useWeblinkUrl=`1`
]]
Хотя всё это можно засунуть в один свой сниппет, из которого потом выдать
<?php
if (!empty($_GET['tag'])) {
$scriptProperties['tvFilters'] = 'content.tag===' . preg_replace('#[^\w]#', '', $_GET['tag']),
}
// ... еще куча своей любой логики
return $modx->runSnippet('pdoResources', $scriptProperties);
И я это еще не самое страшное, что бывает. Когда смотришь чужой проект и пытаешься вникнуть, что происходит в подобном вызове — голова дымится.То, что система позволяет что-то делать, не говорит о том, что делать так — хорошо и правильно. Но вообще, лично мне пофиг, удачи в разработке сайтов.
Угу, ясно, 2 тега вместо одного, ок.
Попутно — а что это за правило —
Попутно — а что это за правило —
'#[^\w]#'
?
А если так?
В шаблоне категории:
В шаблоне категории:
[[!DetectGet]]
[[!pdoPage?
&element=`msProducts`
&sortby=`[[+DetectGetBy]]` &sortdir=`[[+DetectGetDir]]`
]]
Сниппет DetectGet://умолчальная сортировка по убыванию id
$DetectGetBy = 'id';
$DetectGetDir = 'desc';
if (!empty($_GET['sort'])) {
if ($_GET["sort"] == "price_up") { //сортировка по возрастанию цены
$DetectGetBy = 'Data.price';
$DetectGetDir = 'asc';
}
if ($_GET["sort"] == "price_down") { //сортировка по убыванию цены
$DetectGetBy = 'Data.price';
$DetectGetDir = 'desc';
}
}
$modx->setPlaceholder('DetectGetBy', $DetectGetBy);
$modx->setPlaceholder('DetectGetDir', $DetectGetDir);
не пойму, плейсхолдеры [[+DetectGetBy]] и [[+DetectGetDir]] тоже вызывать некэшированными?
чо там?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.