groupIt - обертка результатов.
Была задача вывод элементов от pdoResources поделить на группы и обернуть их в div.
Поиск дал приятный результат, я нашел ответ в виде спиппета groupResources(это был обычный велосипед) и переписал его на свой лад.
Пример его работы
ilyautkin, помог мне еще раз переписать скрипт с использованием чанков.
Сниппет
Поиск дал приятный результат, я нашел ответ в виде спиппета groupResources(это был обычный велосипед) и переписал его на свой лад.
Пример его работы
<div class="group">
ContentA
ContentB
ContentC
</div>
<div class="group">
ContentD
ContentE
</div>
ilyautkin, помог мне еще раз переписать скрипт с использованием чанков.
Сниппет
<?php
/**
* groupIt
*
* AUTHOR
* DimenSi, но на самом деле ilyautkin разжевал.
* sergant, спасибо за советы.
*
* DESCRIPTION
*
* groupIt делит результат вывода pdoResources на группы блоков.
*
* PROPERTIES:
*
* &groupN на какое число делить, по-умолчанию 3.
* &tplWrapper шаблон для обертки, по-умолчанию @INLINE <div>[[+wrapper]]</div>.
*
* [[groupIt? &groupN=`3` &tplWrapper=`@INLINE <div>[[+wrapper]]</div>` ]]
*/
$tplWrapper = $modx->getOption('tplWrapper', $scriptProperties, '@INLINE <div>[[+wrapper]]</div>');
$groupN = $modx->getOption('groupN', $scriptProperties, 3);
if (!isset($scriptProperties['outputSeparator'])) {
$scriptProperties['outputSeparator'] = '||';
}
$rows = $modx->runSnippet('pdoResources', $scriptProperties);
$rows = explode($scriptProperties['outputSeparator'], $rows);
$groupped = array_chunk($rows, $groupN);
$output = array();
$pdo = $modx->getService('pdoTools');
foreach ($groupped as $group) {
$wrapper = implode(PHP_EOL, $group);
$output[] = $pdo->getChunk($tplWrapper, array('wrapper' => $wrapper));
}
return implode(PHP_EOL, $output);
Я попробовал написать такой же сниппет сам. Вот, что получилось.<?php
/**
* groupIt
*
* AUTHOR
*
* dimensi
*
* DESCRIPTION
*
* groupIt делит результат вывода pdoResources на группы блоков.
*
* PROPERTIES:
*
* &wrapperOn вкл/выкл обертку, по-умолчанию 0
* &wrapperTag тег обертки, по-умолчанию div
* &wrapperClass класс обертки
* &wrapperId id обертки
* &groupN на какое число делить, по-умолчанию 3
* &groupTag тег группы, по-умолчанию div
* &groupClass класс группы
* &snippet сниппет, по-умолчанию pdoResources
*
* USAGE:
*
* [[groupIt? &wrapper=`1` &wrapperClass=`Class` &wrapperId=`id` &wrapperTag=`div`
* &groupN=`3` &groupTag=`div` &groupClass=`ClassGroup` &snippet=`pdoResources`]]
*/
$wrapperOn = $modx->getOption('wrapperOn', $scriptProperties, 0);
$wrapperTag = $modx->getOption('wrapperTag', $scriptProperties, 'div');
$wrapper = $wrapperTag;
$wrapperClass = $modx->getOption('wrapperClass', $scriptProperties);
$wrapperId = $modx->getOption('wrapperId', $scriptProperties);
$groupN = $modx->getOption('groupN', $scriptProperties, 3);
$groupTag = $modx->getOption('groupTag', $scriptProperties, 'div');
$groupClass = $modx->getOption('groupClass', $scriptProperties);
$group = $groupTag;
$snippet = $modx->getOption('snippet', $scriptProperties, 'pdoResources');
$result = '';
if (!isset($scriptProperties['outputSeparator'])) {
$scriptProperties['outputSeparator'] = '||';
}
$rows = $modx->runSnippet($snippet, $scriptProperties);
$rows = explode($scriptProperties['outputSeparator'], $rows);
if (isset($groupClass)) {
$group = "{$groupTag} class='{$groupClass}'";
}
foreach ($rows as $i => $row) {
$result .= $row;
if (($i + 1) % $groupN == 0 && ($i + 1) !== count($rows)) {
$result .= "</{$groupTag}>" . PHP_EOL . "<{$group}>";
}
}
$result = "<{$group}>\n{$result}\n</{$groupTag}>";
if ($wrapperOn == 1) {
if (isset($wrapperTag)) {
$wrapper = $wrapperTag;
}
if (isset($wrapperClass)) {
$wrapper .= " class='{$wrapperClass}' ";
}
if (isset($wrapperId)) {
$wrapper .= " id='{$wrapperId}' ";
}
$result = "<{$wrapper}>\n {$result} \n</{$wrapperTag}>";
}
return $result;
Комментарии: 25
Однозначно полезная вещь, вопрос не вижу ни в коде где указать кол-во элементов, оборачиваемых в slide
Дописал, перечитайте)
спасибо на днях заюзаю, как раз кучка слайдеров завалялась с группировкий и не знал что с ними делать)
В который раз замечаю такую несправедливую ситуацию: кол-во добавивших в избранное в разы больше, чем кол-во плюсанувших. Вот и в данном случае, пока я не поставил плюс было — 5 добавивших в избранное и 0 рейтинг. Отсюда у меня вопрос: добавив данное решение в избранное оно до сих пор не является для вас таким, за что автору можно поставить плюс?)
Павел, к сожалению такая ситуация есть, я ка-кто протупил с плюсом, но исправился
Лично я добавил заметку в избранное, чтобы не потерять — возможно в будущем данное решение и понадобится. Не «плюсовал», это плохо?
Не мне судить, плохо это или хорошо. Однако, это говорит о том, что такие люди неблагодарные. К примеру, в реальной жизни, если я что-то придумал и делюсь с человеком, а он это берёт и пользуется этим — мне приятно, однозначно. Хотя, если б он сказал спасибо, автору было бы приятнее, не находишь?
Я не хочу спорить или доказывать что-то кому-то, поэтому кроме данного примера я больше никак не смогу повлиять на твоё, и мнение схожих с тобой в этом людей.
Я не хочу спорить или доказывать что-то кому-то, поэтому кроме данного примера я больше никак не смогу повлиять на твоё, и мнение схожих с тобой в этом людей.
Это говорит только о том, что человек добавил себе заметку в закладку (избранное) и возможно никогда им не воспользуется. Поэтому называть за это людей «неблагодарными», на мой взгляд, явно «перебор».
+1.
Не мне судить, плохо это или хорошо. Однако, это говорит о том, что такие люди неблагодарные.Прикольно. Эти два предложения писал один и тот же человек? )) Павел, помню твои горячие споры про «благоДарю» и алкоголь. Ты идеалист. Но мир не черно-белый. Если человек не подходит под твое понимание добра и зла, это не значит что он плохой. Он просто другой. Тем более, что ты сам когда-то пришел к такому выводу.
Для примера скажу. Я мог бы добавить эту заметку в закладки для того, чтобы не забыть идею и использовать её в будущем, если вдруг встанет такая задача. Но плюса я бы не поставил. Человек взял чужой сниппет, старый престарый, и выложил как своё решение. Для новичка неплохо. Но выглядит оно как решение практического задания на курсах PHP первого уровня.
if ($scriptProperties['wrapper'] == 1) {
$output .= "\n<" . $scriptProperties['wrapperTag'] . " ";
};
if (isset($scriptProperties['wrapperClass']) && $scriptProperties['wrapper'] == 1) {
$output .= "class='" . $scriptProperties['wrapperClass'] . "'";
};
if ($scriptProperties['wrapper'] == 1) {
$output .= ">";
};
Для плюса нужно всё-таки что-то посерьёзнее. Уверен, автор может лучше. Тем более он знаком с pdoTools.П.С. Кстати, данную возможность можно было бы легко добавить в pdoTools. Достаточно добавить всего 2 параметра — groupLimit и tplGroup.
В общем:
1. Избранное — это как закладка в книге. Плюс/минус — это реакция на содержание. У них разная семантика.
2. С этими рейтингами разработчики начинают путать этот ресурс с соц. сетями. Осталось только ввести тут «друзей» и лайкать друг друга за фото собачки.
Эм, господин. Я же написал, что сниппет не мой, а с автором связаться не смог. Я просто выложил решение, которое нагуглил, вы же читали, что я написал? Я написал, что решение не мое, почему вы говорите, что я выложил это от своего имени… Я с пхп на вы говорю, сам бы такое написать не смог. С pdoTools тем более не знаком. Что за грубости в мой адрес…
Насчет плюсов и закладок. Я лично сам не всегда ставлю плюс, потому, что забываю, а закладки иногда вообще не использую, хоть и добавил.
Насчет плюсов и закладок. Я лично сам не всегда ставлю плюс, потому, что забываю, а закладки иногда вообще не использую, хоть и добавил.
Если в коде нет ни строчки вашего кода, то беру свои слова «выложил как свое решение» обратно. Но тогда тем более не понятно возмущение Павла отсутствием плюсов.
Что за грубости в мой адрес…Где я произнёс хоть одно слово грубости? Я дискутирую с Павлом. Про автора упомянул 1 раз. И ничего плохого я не вижу в коде начинающего программиста. Лично я помню, что сам был таким. Просто заметил, что для плюса он пока слабоват. Уверен, что тот же Павел сможет его сократить минимум раза в 3.
Про какого вы автора(меня или автора этого штуки) говорите? И откуда вы взяли, что автор знает pdoTools? Строчку с pdoResources, это я добавил. Ибо там автор использовал getResources.
Собственный сниппет выглядит уже короче и серьёзнее. Я же говорил, что автор может лучше. )
Но это ещё не предел. Если обратить внимание на любой сниппет pdoTools, то можно увидеть, что у них есть параметры tpl, в которых можно указать чанк или INLINE код. Что гораздо удобнее, чем указывать теги, классы, id и т.д. Таким образом, один параметр tpl заменяет несколько параметров. Как я уже писал выше, для данного сниппета достаточно 2 параметров. Или 3-х, если нужно указать сниппет получения результатов. Но так как в этом сообществе уже мало кто пользуется getResources, то и этот параметр можно опустить. Просто сразу вызывать pdoResources, но разумеется с проверкой его наличия.
Но это ещё не предел. Если обратить внимание на любой сниппет pdoTools, то можно увидеть, что у них есть параметры tpl, в которых можно указать чанк или INLINE код. Что гораздо удобнее, чем указывать теги, классы, id и т.д. Таким образом, один параметр tpl заменяет несколько параметров. Как я уже писал выше, для данного сниппета достаточно 2 параметров. Или 3-х, если нужно указать сниппет получения результатов. Но так как в этом сообществе уже мало кто пользуется getResources, то и этот параметр можно опустить. Просто сразу вызывать pdoResources, но разумеется с проверкой его наличия.
Ну, я так и сделал, по умолчанию у нас pdoResources. Сниппет еще раз переписан. К сожалению @INLINE, я не смогу реализовать. Я по-гуглил и оказывается, это довольно сложная тема этот @BILDINGs.
github.com/goldsky/modx-chunk-methods
github.com/goldsky/modx-chunk-methods
Вот этот сниппет достоин плюса.
Есть пара замечаний.
Непонятна вот эта конструкция
Ну и второе. Ничего сложного с биндингом нет. Достаточно глянуть в документацию. Нужно добавить одну строчку и одну изменить.
П.С. Не увидел ни одного комментария Ильи. Видимо вы с ним телепатически общаетесь.
Есть пара замечаний.
Непонятна вот эта конструкция
$outputSeparator = $modx->getOption('outputSeparator', $scriptProperties, PHP_EOL);
if (!isset($scriptProperties['outputSeparator'])) {
$scriptProperties['outputSeparator'] = '||';
}
Представь, как будет выглядеть вывод, если вызвать сниппет с параметром &outputSeparator=`||`.Ну и второе. Ничего сложного с биндингом нет. Достаточно глянуть в документацию. Нужно добавить одну строчку и одну изменить.
...
$pdoTools = $modx->getService('pdoTools');
foreach ($groupped as $group) {
$wrapper = implode(PHP_EOL, $group);
$output[] = $pdoTools->getChunk($tplWrapper, array('wrapper' => $wrapper));
}
Тогда шаблон можно указать в стиле pdoTools, к которому многие уже привыкли$tplWrapper = $modx->getOption('tplWrapper', $scriptProperties, '@INLINE <div class="group-wrapper">[[+wrapper]]</div>');
П.С. Не увидел ни одного комментария Ильи. Видимо вы с ним телепатически общаетесь.
Конечно, телепатически. С опытом появляются экстрасенсорные способности — находить баги удалённо, исправлять неработающий функционал одним своим присутствием. =)))
По первому замечанию подскажу.
$outputSeparator вообще не нужен.
А $scriptProperties['outputSeparator'] присвоить значение без условий
$outputSeparator вообще не нужен.
А $scriptProperties['outputSeparator'] присвоить значение без условий
$scriptProperties['outputSeparator'] = '||';
Ну и возврат делать такreturn implode(PHP_EOL, $output);
Ну изначально, я преследовал цель сделать и для pdoResources и getResources, но думаю, вы правы и нет смысла за таким гоняться, а просто сделать так, как в сообществе привыкли.
По первому случаю согласен, а вот при возврате лучше подставить то, что нужно пользователю. Вдруг нужно группы вывести через запятую, например…
я обычно для таких случаев использовал стандартный функционал
[[pdoResources? &sortby=`menuindex` &tpl=`client_item` &tpl_n9=`client_item_row`]]
Работает, чуть помудрить с закрытием тегов и работает)
[[pdoResources? &sortby=`menuindex` &tpl=`client_item` &tpl_n9=`client_item_row`]]
Работает, чуть помудрить с закрытием тегов и работает)
Ну, это немного жесть…
Не надо ничего мудрить. Даже отдельный шаблон не нужен. Я обычно так делаю:
Но тут человек хотел именно сам разобраться с тем, как писать сниппеты для MODX. Он получил большой опыт за небольшое время. Ну и далеко не все наткнутся где-нибудь на моё решение, а если это будет отдельный сниппет, начинающие будут им пользоваться.
<div>
[[pdoResources?
&parents=`0`
&limit=`0`
&tpl=`@INLINE <p>{$pagetitle}</p>{if $idx % 5 == 0}</div><div>{/if}`
]]
</div>
Но тут человек хотел именно сам разобраться с тем, как писать сниппеты для MODX. Он получил большой опыт за небольшое время. Ну и далеко не все наткнутся где-нибудь на моё решение, а если это будет отдельный сниппет, начинающие будут им пользоваться.
Оказывается способ решить проблему, был таким простым)
забыл про включенный в pdoTools шаблонизатор, да так лучше, спасибо)
А опыт да, нужно иногда написать пару велосипедов, чтобы понять в чем суть)
А опыт да, нужно иногда написать пару велосипедов, чтобы понять в чем суть)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.