MODX pdoField — получение и вывод полей родителя (ей)
Главная » MODX Revo
MODX RevoАвтор Алексей На чтение 2 мин Просмотров 3.4к. Опубликовано Обновлено
Довольно часто требуется получить и вывести поля родителей и сегодня мы разберемся в том, как в MODX сделать это при помощи сниппета pdoField, который входит в состав компонента PdoTools. Данный сниппет в отличии от его аналогов UltimateParent и getResourceField имеет все их возможностями — выводит как любые поля указанного документа или его родителя, так и их переменные (TV параметры). Ко всему этому он может работать с документами в любых контекстах и при выборке есть можно указать доп.
Параметры
pdoField принимает основные параметры компонента pdoTools (и немного своих:
Параметр | По умолчанию | Описание |
---|---|---|
&id | Текущий документ | Идентификатор ресурса. |
&field | pagetitle | Поле ресурса. |
&top | Выбирает родителя указанного &id на уровне &top. | |
&topLevel | Выбирает родителя указанного &id на уровне &topLevel от корня контекста. | |
&default | Указывает поле ресурса, которое вернётся, если &field окажется пуст. Более быстрый аналог фильтра :default= | |
&output | Указывает строку, которая вернётся, если и | |
&toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран. |
Внимание. pdoField не поддерживает работу с чанками.
Стоит обратить внимание: Если указаны параметры &topLevel или &top, а параметр &context нет, тогда будет сделан доп. запрос в БД (чтобы определить контекст).
Примеры
Вызываем как фильтр вывода:
[[*id:pdofield=`pagetitle`]]
Так же можно указывать параметры при помощи JSON массива . Например, выбираем 2-го родителя ресурса и выводим его «pagetitle»:
[[*id:pdofield=`{"top":2,"field":"pagetitle"}`]]
или тоже самое обычным вызовом (рекомендуется, так как это удобнее и быстрее):
[[pdoField? &id=`[[*id]]` &field=`longtitle` &top=`2`]]
Тоже самое на fenom:
{'!pdoField' | snippet : [ 'id' => $_modx->resource. id, 'field' => 'longtitle', 'top' => '2' ]}
modx pdofield pdofield modx
Поделиться с друзьями
( 3 оценки, среднее 5 из 5 )
pdoField
pdoField — сниппет выводит любое поле указанного ресурса или его родителя, включая TV параметры.
Оглавление
- Параметры
- Примеры
pdoField — сниппет выводит любое поле указанного ресурса или его родителя, включая TV параметры.
Отличием от аналогов является работа с документами любых контекстов и возможность указать дополнительные параметры при выборке, что позволяет не выводить поля, например, скрытых ресурсов. Так же с помощью указания параметра &class
Параметры
Принимает общие параметры выборки и результатов pdoTools и некоторые свои:
Параметр | По умолчанию | Описание |
&id | Текущий документ | Идентификатор ресурса. |
&field | pagetitle | Поле ресурса. |
&top | Выбирает родителя указанного &id на уровне &top. | |
&topLevel | Выбирает родителя указанного &id на уровне &topLevel от корня контекста. | |
&default | Указывает поле ресурса, которое вернётся, если &field окажется пуст. Более быстрый аналог фильтра :default= . | |
&output | Указывает строку, которая вернётся, если и &default, и &field оказались пусты. | |
&toPlaceholder | Если не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран. |
Работу с чанками сниппет не поддерживает, так как возвращает значение только одного поля.
Примеры
Сниппет может быть вызван как фильтр вывода:
/* modParser */ [[*id:pdofield=`pagetitle`]] /* pdoParser */ {$_modx->resource.pagetitle} // В щаблоне {$id | resource: 'pagetitle'} // В чанке
На pdo парсере, показана альтернатива сниппету pdoField.
При этом вы можете указывать параметры JSON массивом. Например, выбор второго родителя от ресурса и вывод его «longtitle»:
/* modParser */ [[*id:pdofield=`{"top":2,"field":"longtitle"}`]]
Но лучше использовать обычный вызов — он и быстрее, и удобнее:
/* modParser */ [[pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`2` ]] /* pdoParser */ {$_modx->runSnippet('pdoField', [ 'id' => $id, 'field' => 'pagetitle', 'top' => 2 ])}
При сохранении результата сниппета в плейсхолдер &toPlaceholder:
/* modParser */ [[pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`2` &toPlaceholder=`placeholderName` ]] // Получаем результат работы сниппета из плейсхолдера [[+placeholderName]] /* pdoParser */ {$_modx->runSnippet('pdoField', [ 'id' => $id, 'field' => 'pagetitle', 'top' => 2, 'toPlaceholder' => 'placeholderName', ])} // Получаем результат работы сниппета из плейсхолдера {var $placeholderName = $_modx->getPlaceholder('placeholderName')} {$placeholderName}
Благодарность автору
Если по какой-либо причине вы хотите поблагодарить автора данного ресурса, вы можете это сделать одним из удобных для вас способов ниже.
- ЮMoney (Яндекс.Деньги)
Один из самых популярных способов поблагодарить автора, воспользоваться сервисом Яндекс.Деньги.
Время работы: 0,1068 s
Время запросов: 0,1068 s
Количество запросов: 24
Источник: cache
Авторская документация по web-разработке Web in Mind | © 2019 – 2023
Можно ли заменить Wayfinder и UltimateParent на pdoTools? — Дополнительно
carlo_13 1
Всем привет.
Я работаю над этим сайтом Modx и пытаюсь исправить боковую панель. Человек, который сделал сайт, использовал 2 плагина:
[[!Wayfinder? &startId=`[[UltimateParent? &topLevel=`3`]]` &levelClass=`nivel` &removeNewLines=`false` &selfClass=`class_active` &ignoreHidden=`0` &parentClass=`parent_active` &level=`0` &startItemTpl=`tpl_nav_gauche` ]]
Приведенный выше код работает (больше без), но начинает глючить, как только вы начинаете посещать подстраницы.
Есть ли способ сделать Ultimate Parent относительно папки?
Кроме того, приведенный выше код «хорошо написан» или мне следует переключить pdotools? Окончательный родительский плагин годами не получал никаких обновлений, поэтому я беспокоюсь.
Спасибо за помощь.
полутренированный Гарри 2
Трудно сказать, верны ли эти теги сниппета, не зная деталей того, чего вы пытаетесь достичь.
Возможно, вы можете жестко закодировать &startId
и не нуждаться в фрагменте UltimateParent .
Вы можете заменить Wayfinder на pdoMenu , но это ничего не изменит.
Кроме того, обычно нет необходимости вызывать Wayfinder без кэширования. [[Навигатор? ...]]
должно подойти.
carlo_13:
Окончательный родительский плагин годами не получал никаких обновлений, поэтому я беспокоюсь.
Это дополнение представляет собой всего один фрагмент кода, содержащий около 20 строк кода. Так что особо обновлять нечего.
1 Нравится
3
Есть ли способ сделать Ultimate Parent относительно папки?
ну, во-первых, попробуйте вызвать UltimateParent некэшированным, потому что вы называете Wayfinder некэшированным.
Можно ли заменить Wayfinder и UltimateParent на pdoTools?
Да это явно есть. Используйте для этого pdoField (часть pdotools):
https://docs.modx.com/3.x/en/extras/pdoTools/Snippets/pdoField
Думаю, это должно подойти.
[[*id:pdoField=
{«topLevel»:1,»field»:»id»} ]]
Лично я не мог придумать причин, почему бы не использовать pdoTools. Я часто использую pdoTools в подобных случаях.
pdoTools должен упростить эту задачу, так как он спроектирован так, чтобы быть взаимозаменяемым с wayfinder. используйте pdoMenu в этом случае:
https://docs.modx.com/3.x/en/extras/pdoTools#pdomenu
1 Нравится
4
Попробуйте этот:
[[pdoMenu? &tpl=`@INLINE
При необходимости используйте собственные фрагменты «&tpl» и «&tplStart».
Некоторые параметры pdoMenu отличаются, часто имеют большее значение:
Параметр «startId» называется «родители».
Параметр «ignoreHidden» называется «showHidden».
Параметр «startItemTpl» называется «tplStart».
(убедитесь, что вы добавили &displayStart=1
, если вам нужен tplStart… это, по крайней мере, не соответствует вашему вызову Wayfinder)Насколько мне известно, параметр «&removeNewLines=
false
» неизвестен pdoMenu. По умолчанию он не разделяет теги символами новой строки. Однако вы можете поместить новые строки в tpl-фрагменты, если они вам нужны.
Сравните выходные данные Wayfinder и pdoMenu, чтобы найти правильные варианты.
По умолчанию всегда используйте кеш — он ваш друг. Как уже сказал полуобученный Гарри.
Пропускать кеш только в том случае, если на это действительно есть причина.
Независимо от того, как часто я использую pdoTools, руководство всегда у меня под рукой. В данном случае:
https://docs.modx.com/3.x/en/extras/pdoTools/Snippets/pdoMenu
Еще одно: лично я предпочитаю pdoMenu вместо Wayfinder, хотя бы по каким-то другим причинам, потому что он под рукой с помощью pdoTools (который мне нравится по нескольким другим причинам). Но. Wayfinder должен — по-прежнему — делать свою работу. При условии, что тег написан правильно.
2 лайков
бобрай 5
Использование дополнений pdo… должно ускорить загрузку страниц. Если вы не ссылаетесь на какие-либо телевизоры в своих тегах, прямая замена должна работать.
1 Нравится
carlo_13 6
Привет, спасибо всем за ответы. Извините, я хотел ответить раньше, но вчера у меня сильно заболела голова.
полутренированный Гарри:Вы можете заменить Wayfinder на pdoMenu , но это ничего не изменит.
Да, я постараюсь избавиться от Ultimate Parent.
доминдийский:Еще одна вещь: лично я предпочитаю pdoMenu вместо Wayfinder, хотя бы потому, что он под рукой с pdoTools (который мне нравится по нескольким другим причинам). Но. Wayfinder должен — по-прежнему — делать свою работу. При условии, что тег написан правильно.
Большое спасибо за очень подробный ответ! Я определенно собираюсь перейти на pdotools.
Бобрай:Использование дополнений pdo… должно ускорить загрузку страниц. Если вы не ссылаетесь на какие-либо телевизоры в своих тегах, прямая замена должна работать.
Да, согласен, pdotools быстрее.
карло_13 7
Обновление:
@domindian ваш код отлично работает! Мне просто нужно было изменить значение &displayStart= 0
С ума сойти, насколько универсален pdotools.
1 Нравится
система Закрыто 8
Эта тема была автоматически закрыта через 2 дня после окончания обсуждения и отмеченного решения. Новые ответы больше не допускаются. Вы можете открыть новую тему, щелкнув значок ссылки под исходным сообщением или решением и выбрав «+ Новая тема».
ModX — Вывод в зависимости от идентификатора ресурса и родительского идентификатора
Задавать вопрос
спросил
Изменено 7 лет, 8 месяцев назад
Просмотрено 2к раз
Я пытаюсь вывести определенное метаописание в зависимости от идентификатора ресурса и родительского идентификатора с помощью ModX Revo.
Проблема в том, что фильтры Modx могут работать только с только одним специальным тегом (или id, или родительским id, или чем-то еще), например.
[[*id:is=`331`:then=``:else=``]]
В данном случае тег ID . В моей ситуации мне нужно добавить к этому условию еще одно выражение, оно должно работать так:
- , если [[*id]] равно 331, то…
- иначе, если [[*parent]] равен 321, то…
- еще…
Как это сделать без создания шаблонов или чанков? Я пробовал несколько вариантов:
Это просто не работает
[[*id:is=`331`:then=``:else=`[[*parent:is=`321`:then=``:else =``]]]]
ИЛИ
Это на 331-м ресурсе выводит два описания
[[*id:is=`331`:then=``:else=``]] [[*parent:is=`321`:then=``:else=``]]
- modx
- modx-revolution
Я бы посоветовал взглянуть на pdoField или один из других фрагментов pdoTools. Уже есть встроенные параметры для фильтрации и условий, которые вам нужны. pdoField ДОКУМЕНТЫ
Обязательно ознакомьтесь с общими свойствами pdoTools, а также со специфическими для pdoField.
Вы столкнетесь с повторяющимися описаниями, что не очень хорошо для поисковой оптимизации и, вероятно, лучших способов добраться туда, куда вы хотите. Но вопрос был не в этом.
Лучше всего написать быстрый фрагмент, в котором вы хотите вывести метатег:
[[!getMeta? &resourceid='[[*id]]' ]]
в вашем фрагменте getMeta:
getParent($id,1,'id') == 321){ $output = '...ваш метатег для смешного родителя'; }еще{ если($id == 331){ $output = '...ваш метатег...'; }еще{ $output = '...ваш альтернативный метатег...'; } } эхо $ вывод; возвращаться;
Что-то в этом роде. — вы должны создавать фрагменты для вывода любого HTML ИЛИ вы можете сохранить фрагмент в наборе свойств.