@-привязка, пример использования

Дано

папка, содержащая несколько дочерних документов, например карточки клиентов.

Задача

сделать доп. параметр в виде выпадающего списка (drop-down list), пунктами которого будут все документы из нашей папки клиентов.

Решение

Создадим новый доп. параметр, зададим ему тип "Drop-down list" (в принципе, это может быть любой другой тип). В поле "Возможные значения" (которое помечено символом "бочки", чем обычно обозначают БД) вводим следующую строку:

@SELECT pagetitle FROM modx_site_content WHERE parent = иднашейпапки

В этом случае привязка @SELECT сделает элементами списка строки, полученные из таблицы modx_site_content с условием того, что их поле "parent" равно ид нашей родительской папки. Это все! Теперь в значениях нашего доп. параметра будут находиться заголовки (как мы и указали в привязке - pagetitle) документов-карточек клиентов.

Примечание: такие запросы с @-привязкой могут вводиться и в другие поля, помеченные иконкой "бочки", например "Значение по умолчанию".

с 1 по 10 из 18 | Далее | Последние
new comment 07.04.2007, 08:35:26

Также можно вывести список дочерних документов с помощью php-кода в привязке @EVAL. Это лучше делать, если нам нужно выбирать значение параметра по заголовку а хранить в базе ид.

Если бы мы писали список значений параметра вручную, это выглядело бы так: значение1==1||значение2==2|| и т. д.

Чтобы сгенерировать такой список динамически, используем привязку:

@EVAL $children = $modx->getDocumentChildren(44); foreach($children as $child) {$output .= $child['pagetitle']."==".$child['id']."||"; } return $output;

new comment 12.04.2007, 18:03:38

entsun, великое тебе спасибо :) никогда не пользовался этими конструкциями, ибо в корне не понимал их назначения, хотя вдумчиво читал и пытался разобраться в документации :) Может реально облегчить жизнь в некоторых случаях.

new comment 13.04.2007, 04:33:43

2Igor О да, надеюсь хватит написать полную документацию по @-привязкам, ибо это серьезный инструмент для создания "максимально автоматизированных" сайтов (где заменив какой либо-элемент, данные о нем изменятся во всех зависимых элементах).

new comment 26.04.2007, 10:49:42

как сделать, чтобы в шаблоне выводилось выпадающее меню, сделанное вышеуказанным способом?

new comment 10.09.2007, 14:35:30

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

@EVAL function getItems($p, $l=0){ global $modx; $c=$modx->getDocumentChildren($p); foreach($c as $k) {$out.=str_pad("",$l*2,".",STR_PAD_RIGHT)." ".$k['pagetitle']."==".$k['<a class="autolink_link" href="http://modx.ru/docs/glossary/#id" title="Посмотреть значение термина в глоссарии">id</a>']."||"; $out.=getItems($k['<a class="autolink_link" href="http://modx.ru/docs/glossary/#id" title="Посмотреть значение термина в глоссарии">id</a>'],$l+1);} return $out;} return getItems(54);

//54 - <a class="autolink_link" href="http://modx.ru/docs/glossary/#id" title="Посмотреть значение термина в глоссарии">id</a> родительского документа.

P.S. Два дня как знаком с системой modx, чувствую становлюсь ее преданным поклонником! Спасибо разработчикам!

new comment 10.09.2007, 14:38:40

Чистый код: <code>@EVAL function getItems($p, $l=0){ global $modx; $c=$modx->getDocumentChildren($p); foreach($c as $k) {$out.=str_pad("",$l*2,".",STR_PAD_RIGHT)." ".$k['pagetitle']."==".$k['id']."||"; $out.=getItems($k['id'],$l+1);} return $out;} return getItems(54); </code> 54 - id родительского документа.

new comment 11.09.2007, 10:27:49

2Urique: Вау! Огромное спасибо за такой код, я только сел ломать голову как мне сделать многоуровневый список и вот! Ваш код сработал как часы тут же:) Спасибо!

new comment 04.10.2007, 14:11:15

Рад, что мой код помог вам! В заключение привожу пример окончательного варианта с использованием сниппета.

Теперь сама привязка будет иметь вид: @EVAL return $modx->runSnippet("DropDownTree",array('doc'=>54));

Код сниппета DropDownTree: if(!function_exists("getItems")) { function getItems($p=0, $l=0) { global $modx,$modx_charset; ($modx_charset=='UTF-8') ? $nbsp=chr(0xC2).chr(0xA0) : $nbsp=chr(0xA0); $c=$modx->getDocumentChildren($p); foreach($c as $k) { $out.=str_repeat($nbsp,$l*5).$k['pagetitle']."==".$k['id']."||"; $out.=getItems($k['id'],$l+1); } return $out; } } return getItems($doc);

new comment 24.01.2008, 15:34:18

а вот если нужно выводить документы в алфавитном порядке - можно использовать этот код

@EVAL function getItems($p, $l=0){global $modx;$c=$modx->getAllChildren($p);$sort_arr = array();foreach($c AS $uniqid => $row){foreach($row AS $key=>$value){$sort_arr[$key][$uniqid] = $value;}} if (count($c)!=0) {array_multisort($sort_arr['pagetitle'], SORT_ASC, $c);}foreach ($c as $k){$out.=str_pad("",$l*2,".",STR_PAD_RIGHT)." ".$k['pagetitle']."==".$k['id']."||"; $out.=getItems($k['id'],$l+1);}return $out;}return getItems(4818);

new comment 25.02.2008, 17:05:06

Еще одно небольшое дополнение: если у вас в меню есть очень длинные пункты, то вывод дропдауна не очень удобен - расширяет браузер. С помощью функции substr($var,0,100) можно сделать вывод более читабельным - нужно заменить $k['pagetitle'] на substr($k['pagetitle'],0,100), где вместо "100" подставить нужное число символов.

с 1 по 10 из 18 | Далее | Последние

Добавить комментарий

Для форматирования используйте синтаксис Markdown. Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Код безопасности: