MODX pdoField — получение и вывод полей родителя (ей)

Главная » MODX Revo

MODX Revo

Автор Алексей На чтение 2 мин Просмотров 3.4к. Опубликовано Обновлено

Довольно часто требуется получить и вывести поля родителей и сегодня мы разберемся в том, как в MODX сделать это при помощи сниппета pdoField, который входит в состав компонента PdoTools. Данный сниппет в отличии от его аналогов UltimateParent и getResourceField имеет все их возможностями — выводит как любые поля указанного документа или его родителя, так и их переменные (TV параметры). Ко всему этому он может работать с документами в любых контекстах и при выборке есть можно указать доп.

параметры, это позволяет к примеру: можно у скрытых ресурсов не выводить поля. А, если указать параметр &class, то возможно получить любое поле объекта Модекс. И pdoField можно вызывать как фильтр вывода.

Параметры

pdoField принимает основные параметры компонента pdoTools (и немного своих:

ПараметрПо умолчаниюОписание
&idТекущий документИдентификатор ресурса.
&fieldpagetitleПоле ресурса.
&top
Выбирает родителя указанного &id на уровне &top.
&topLevelВыбирает родителя указанного &id на уровне &topLevel от корня контекста.
&defaultУказывает поле ресурса, которое вернётся, если &field окажется пуст. Более быстрый аналог фильтра :default=
&outputУказывает строку, которая вернётся, если и 
&default
, и &field оказались пусты.
&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

можно получить поле любого объекта MODx. Может быть вызван как фильтр вывода.

Параметры

Принимает общие параметры выборки и результатов pdoTools и некоторые свои:

ПараметрПо умолчаниюОписание
&idТекущий документИдентификатор ресурса.
&fieldpagetitleПоле ресурса.
&topВыбирает родителя указанного &id на уровне &top.
&topLevel
Выбирает родителя указанного &id на уровне &topLevel от корня контекста.
&defaultУказывает поле ресурса, которое вернётся, если &field окажется пуст. Более быстрый аналог фильтра :default=.
&outputУказывает строку, которая вернётся, если и &default, и &field оказались пусты.
&toPlaceholderЕсли не пусто, сниппет сохранит все данные в плейсхолдер с этим именем, вместо вывода не экран.

Если указаны &top или &topLevel, а &context нет, то для его определения будет сделан дополнительный запрос в базу данных.

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

Примеры

Сниппет может быть вызван как фильтр вывода:

/* 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? Окончательный родительский плагин годами не получал никаких обновлений, поэтому я беспокоюсь.

Спасибо за помощь.

полутренированный Гарри

4 апреля 2023 г., 14:12 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 [[+wrapper]]< /li>`
&tplStart=`@INLINE  [[+обертка]]`
&parents=`[[*id:pdoField=`{"topLevel":1,"field":"id"}`]]`
&showHidden=`0`
&displayStart=`1`
&уровень=`0`
&levelClass=`уровень`
&selfClass=`class_active`
&parentClass=`parent_active`
]]
 

При необходимости используйте собственные фрагменты «&tpl» и «&tplStart».

Некоторые параметры pdoMenu отличаются, часто имеют большее значение:

Сравните выходные данные 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 ИЛИ вы можете сохранить фрагмент в наборе свойств.