Передаем параметры в чанки или выжимаем все из modx::parseChunk

В MODX Revolution есть такая прикольная штука, как параметры у чанков. Т.е. вы можете создать чанк с какими-то плейсхолдерами. И при вызове чанка передать в нужный плейсхолдер значение. Т.е. выглядит это примерно так
[[$ChunkName? &name=`chunk` &mail=`parsechunk@example.com`]]

В чанке ChunkName заменяются плейсхолдеры name и mail на chunk и parsechunk@example.com соответственно.

В MODX Evolution такой возможности нет. Поэтому очень часто приходится изобретать велосипеды в виде сниппетов которые выполняют функцию parseChunk заменяя нужные значения у чанка. Из-за этого у некоторых разработчиков на сайте появляются тонны таких специализированных сниппетов. WTF? Зачем?

Создаем сниппет parseChunk


<?php
 /**
 * parseChunk
 *
 * @category  parser
 * @version   0.1
 * @license 	GNU General Public License (GPL), http://www.gnu.org/copyleft/gpl.html
 * @param string $ChunkName Имя чанка
 * @return string распарсеный чанк
 * @author Agel_Nash <Agel_Nash@xaker.ru>
 *
 * @example [!parseChunk? &ChunkName=`form` &username=`Agel_Nash`!]
 */
return isset($ChunkName) ? $modx->parseChunk($ChunkName, $modx->event->params,'[+','+]') : '';
?>


Все. Теперь если нам понадобится подставить в какой-то плейсхолдер чанка значение, то не нужно плодить 1000 сниппетов. Просто передаем этому сниппету через параметр ChunkName название чанка. А все остальные параметры у нас будут будут плейсхолдерами которые нужно заменить. Гениально:-)

51 комментарий

avatar
Как же я люблю MODX EVO и все больше убеждаюсь что правильно остановил свой выбор именно на нем
avatar
[[$QUOTE? &name=`Dmi3yy` &cms=`MODX REVO`]] =)))
avatar
Гы
В MODX Revolution есть такая прикольная штука, как параметры у чанков. Т.е. вы можете создать чанк с какими-то плейсхолдерами. И при вызове чанка передать в нужный плейсхолдер значение. Т.е. выглядит это примерно так
[[$ChunkName? &name=`chunk` &mail=`parsechunk@example.com`]]
Комментарий отредактирован 2013-02-07 17:19:18 пользователем Agel_Nash
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
avatar
Круто))

«Жопой чувствовал что можно было сделать всё проще» © кто-то там
avatar
Жопа является уникальным интерфейсом, ибо через жопу можно сделать все
© тоже кто-то.
Комментарий отредактирован 2013-02-07 17:18:12 пользователем Agel_Nash
avatar
)) Точно)
avatar
Гениально:)
avatar
Да это же офигенно, черт возьми! (Не смог сдержаться)
avatar
Тут люди спрашиваю где это реально может пригодиться. Давайте опытом поделимся что-ли? Или немного пофантазируем.
Пример 1 Блоки в сайдбаре оформлены одинакого. Шапка с заголовком и содержимое самого блока. Всего на странице 3 таких блока. Мы можем конечно под каждый блок создать отдельный чанк. Но тогда оформление частично будет пересекаться. Эта же пробелма нас ждет если мы хранить все в шаблоне будем. Поэтому есть вариант создать чанк что-то типа
[+pagetitle+][+content+]
И вызвать этот чанк с нужными параметрами несколько раз подряд

[[parseChunk? &pagetitle=`Меню` &content=`[[Wayfinder]]`]]
[[parseChunk? &pagetitle=`Последние статьи` &content=`[[DocLister]]`]]
[[parseChunk? &pagetitle=`Последние статьи` &content=`[[WebUserLogin]]`]]
Комментарий отредактирован 2013-02-07 22:11:08 пользователем Agel_Nash
avatar
Ну а если чанк простенький, типа как [+pagetitle+][+content+], то может можно вообще без создания чанка обойтись и передать его в сниппет в виде строки и там уже распарсить?
Я в php не спец, попробовал сам дописать, но не получилось, пока слишком сложно для меня на этом этапе познаний ))
Комментарий отредактирован 2013-02-08 10:13:22 пользователем tiptop
avatar
Если передавать строкой, то распарсить получится только через str_replace
avatar
Добавил в сборку)
avatar
До меня кажется начинает доходить что это за мощная штука :) Люто плюсанул всем:)
avatar
А че за куча удаленных каментов? был срач evo vs revo? 0_o
avatar
а как же без него ))
avatar
Это всё «сведетели Ревы», запаланили… )))
avatar
покайтесь ибо грядет! =)
avatar
Вы уже и такие каменты удаляете?

Не вижу смысла здесь больше появляться тогда.
avatar
Пытаюсь передать чанк в AjaxSearch, не получается.
Что-то делаю не так или такой возможности нет?

[!AjaxSearch?
	&landingPage=`[*id*]`
	&tplInput=`[[parseChunk? &ChunkName=`search_input_tpl` &submit=`Отправить`]]`
	
	&ajaxSearch=`0`
	&showResults=`1`
	&showIntro=`1`	
	&addJscript=`0` 
!]
avatar
tplInput принимает имя чанка. В вашем же случае передается его содержимое.
avatar
Спасибо за ответ, сделал через CODE
[!AjaxSearch?
	&landingPage=`[*id*]`
	&tplInput=`@CODE: [[parseChunk? &ChunkName=`search_input_tpl` &submit=`Отправить`]]`
!]
Комментарий отредактирован 2013-02-15 07:50:27 пользователем style-nes
комментарий был удален
avatar
Есть аналог, кстати.
avatar
Добрый день!
Вот в этой задаче кто ни будь может подсказать как передать параметр в if?
avatar
Главная проблема этого велосипеда, в том что не работают вложенные сниппеты. То есть нужно еще научить его определять и исполнять их))
Комментарий отредактирован 2016-01-07 16:39:54 пользователем devPastet
avatar
include_once(MODX_BASE_PATH."assets/snippets/DocLister/snippet.DLTemplate.php");
return isset($ChunkName) ? DLTemplate::getInstance($modx)->parseChunk($ChunkName, $modx->event->params, true) : '';
avatar
Но ведь тут нужно что бы был установлен DocLister, а им пользуются не все))). Не проще сделать чтобы все это дело работало через runSnippet?
Комментарий отредактирован 2016-01-08 10:38:58 пользователем devPastet
avatar
Но ведь тут нужно что бы был установлен DocLister, а им пользуются не все)))
Ответ в первом вашем сообщении — ВЕЛОСИПЕД

Не проще сделать чтобы все это дело работало через runSnippet?
Научите?
avatar
А если прогнать это все предварительно через

$modx->parseDocumentSource($source)


предварительно сохранив, чтоб не потерялся

$modx->documentOutput


Т.е. что-то такое:
$output = '';
$chunk = isset($ChunkName) ? $modx->getChunk($ChunkName) : '';
if (!empty($chunk)) {
    $tmp = $modx->documentOutput;
    $output = $modx->parseDocumentSource($chunk);
    $output = $modx->parseText($output, $modx->event->params,'[+','+]');
    $modx->documentOutput = $tmp;
}
return $output;


я б сам конечно так не делал (т.к. отношусь к тем, кто использует DocLister), но для запрашиваемых целей вполне бы сгодилось такое решение (хотя, возможно, всплывут в нем другие подводные камни).
avatar
А где тут runSnippet?
avatar
Где и все остальное — где-то внутри
$modx->parseDocumentSource

:D
avatar
Ну в таком случае вышеупомянутый код — урезанная версия метода parseChunk из класса DLTemplate. И это попахивает еще большим велосипедом.
Комментарий отредактирован 2016-01-08 14:56:15 пользователем Agel_Nash
avatar
Что вы все воспринимаете, как оскорбление? Я даже и не хотел Вас ни коим образом задеть. Сейчас кстати хотел проверить все это дело, и оказалось что вложенные сниппеты то работают)) Чанк в итоге ведь все равно предается парсеру modx. И даже ни через что прогонять не требуется.
avatar
Что вы все воспринимаете, как оскорбление?
Вам стоит передохнуть, а то уже мерещится всякое.
avatar
Скорей всего))
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.