MODX Revolution об’єкти MODX

Цей пост містить короткий вступ до xPDO. Воно представляє базові методи, які використовуються в різних об'єктах MODX Revolution. Багато описаних тут методів – це xPDO методи, але оскільки об'єкт $modx є спадкоємцем $xpdo об'єкта, всі методи доступні через $modx->methodName().

Поточний ресурс/ Поточний користувач

Поточні ресурс та користувач доступні прямо з наступних змінних MODX класу:

Поля об'єктів доступні через кожен метод об'єкта get() (або getContent() для поля контенту ресурсу):

Знаходження інших об'єктів

Посилання на всі об'єкти MODX можуть бути отримані, використовуючи метод $modx->getObject(). Ви можете "отримати" об'єкт MODX ось так:

Або отримати об'єкт за його ID номером:

Для отримання посилання на чанк, наприклад, потрібно використовувати:

Чанк також можна отримати за його ID, що навіть швидше. Цей спосіб також надійніший, оскільки ім'я чанка може змінитися, а ось його ID ніколи:

Використання ID спрацює з будь-яким типом об'єкта.

Ось інший спосіб зробити це саме:

Ви можете також знайти ресурс за його id, alias, menu title, та/або будь-якому з полів з таблиці нижче. Якщо ви хочете, щоб масив документів відповідав вашому критерію, ви можете використовувати getCollection() замість getObject():

Пам'ятайте, що getCollection() не повертає масив пхп. Він повертає масив об'єктів. Якщо ви хочете оперувати з полями об'єктів, як з масивом пхп, то ви повинні використовувати метод toArray():

Ви також можете використовувати метод об'єкта get(), щоб отримати окреме поле:

З getObject() ви також можете використовувати запит як ваш критерій для getCollection() або getMany():

Тільки якщо ви ходите отримати об'єкти пов'язані зєдиним об'єктом можна використовувати метод getMany(). Маючи на увазі, що ви використовували getObject() для отримання посилання на ресурс або шаблон, ви можете отримати їх ТБ так:

Подібним чином ви можете отримати спадкоємців:

getObject() і getOne() повертає null якщо запитаний об'єкт не знайдено, в той же час getMany() і getCollection() повертають порожній масив, якщо немає відповідності заданому критерію.

Індивідуальні ресурси (документи, веб-посилання, внутрішні посилання та статичні ресурси) можуть бути отримані так:

Але також ви можете шукати їх окремо:

Отримання системних налаштувань

Системні налаштування можуть бути отримані в сніпеті методом getOption():

Отримання полів об'єкта за допомогою $object->get()

Після того, як ви отримали об'єкт використовуючи getObject(), getCollection(), або getMany(), ви можете використовувати $object->get() метод для отримання будь-якого поля на його ім'я:

Поточний документ завжди доступний через:

Ви можете отримати будь-яке з цих полів, використовуючи метод get():

Як і в MODX Evolution, будь-який тег сніпета замінюється значенням роботи сніпета, що повертається. Тому якщо ви хочете вивести поле отриманого об'єкта, то в кінці вашого сніпета помістіть рядок:

Коли використовуєте get('content') у ресурсі, ви отримаєте сире значення вмісту поля контент ресурсу. Без будь-яких оброблених тегів у контенті.

Використання $object->getOne() та $object->getMany() з об'єктами

Якщо об'єкт має об'єкти, які пов'язані з ним у схемі MODX, вони можуть бути отримані через методи getOne() або getMany(). Ресурси, наприклад, мають пов'язані з ними Parent, Children, Template, CreatedBy, EditedBy та ін. (див. Таблицю нижче). Поки що функціяget() отримуватиме вміст окремого поля ресурсу об'єкта, функція getOne() отримуватиме цілий об'єкт. Метод getMany() видасть масив об'єктів. Ключем для знання того, який метод вам потрібний є те, що вам потрібний більше одного об'єкта. У такому разі вам потрібний getMany(). Ресурс, наприклад, має лише одного з батьків, тому ви отримаєте його за допомогою getOne('Parent'). Той же ресурс може мати безліч змінних шаблонів у собі, тому для отримання їх вам потрібно використовувати getMany('TemplateVars').

Для отримання ID ресурсу-батька:

Для отримання батька самого як MODX об'єкта:

Так само для отримання об'єкта користувач для користувача, який створив ресурс:

Або для поточного ресурсу:

Користувач містить лише ID, ім'я користувача та хеш пароля користувача. Для отримання більшого вам потрібно використовувати об'єкт modUserProfile, асоційований з цим користувачем:

Після того, як ви отримали профіль, ви можете використовувати його за допомогою методу get() для отримання будь-якого поля ресурсу:

Для отримання дітей документа, відсортованих по полю Title:

Змінні шаблон

Отримання опрацьованих значень змінної шаблону з поточного документа (або будь-якого документа, на який ви посилаєтеся) просто зробити за допомогою цього методу (зверніть увагу, що в обох викликах літери 'V' в getTVValue() є великими):

Отримання значення змінної шаблону в іншому документі є складним, тому що оброблене значення змінної шаблону може відрізнятися в різних документах. В результаті ви повинні отримати об'єкт ресурсу, використовуючи метод вище або використовуючи специфічні методи змінних шаблону і пересилати ID документа. Допустимо $id – це IDдокумента (не ТБ):

Використання toArray() з getChunk()

MODX робить простим відділення відображення даних. Одним із дійсно підходящих способів зробити це – це помістити заповнювачі (плейсхолдери) у чанк і далі надіслати (передати) поля об'єкта у виклику в getChunk(). Скажімо, наприклад, що ви хочете вивести деякі поля ресурсу використовуючи сніппет користувача. Якщо ви створите Tpl чанк із заповнювачами для полів, які ви хочете показати, то ви можете вивести їх у MODX Revolution за допомогою лише кількох рядків коду.

Метод toArray() працює з будь-яким об'єктом MODX, але в основному використовується з ресурсами та користувачами. Він створює асоціативний PHP масив із полів об'єкта. Цей масив може бути використаний як другий аргумент для $modx->getChunk() для заміни будь-яких заповнювачів у чанці на відповідні значення. Цей приклад показує, як дуже ефективно вивести поля ресурсу. Уявіть, що ви хочете показати поля ресурсу MyDocument і це ваш ShowResource Tpl-чанк:

Якщо ви розмістите наступний тег Сніппет на сторінці, то він виведе поля ресурсу. Ось код самого Сніппет:

Modx замінює всі заповнювачі в Tpl-чанці на значення масиву $fields, що містить кожне поле ресурсу. Трохи швидша, але менш популярна версія сніпета має лише два рядки:

Якщо ви хочете вивести поля поточного ресурсу, сніпет стане компактнішим:

Набір параметрів

Набір параметрів – це MODX об'єкт, який містить асоціативний масив ключів та значень (схожих із Системними налаштуваннями). Набір параметрів може бути прикріплений до елементів на вкладці Властивості елемента (доступні під час редагування елемента в Менеджері) або з Інструментів - Набір параметрівОсновне меню Менеджера. Елемент може мати більше одного набору параметрів, прикріплених до нього, і набір параметрів може бути прикріплений більше, ніж до одного елемента. Прикріплення набору параметрів робить його доступним до елемента, це робиться так:

Прикріплений до сніпету Набір параметрів відіграє роль набору параметрів сніпету (колишніх параметрів). Для чанка або іншого елемента значення в наборі параметрів будуть замінені тегами плейсхолдера в чанці, який використовує ключ від набору параметрів. Наприклад, чанк "MyChunk" з набором параметрів "MyProperties" виглядатиме так:

Якщо є параметр "make" зі значенням "Ford," плейсхолдер буде замінений на Ford у чанці, що відображається.

Коли ви викликаєте сніпет з набором параметрів у тегу:

Значення у вибраному наборі параметрів перезапишуть значення Набір параметрів за замовчуванням сніпету та параметра відправляться в тег сніпету (&property1 та &property2) і перезапишуть значення на значення названого набору параметрів. Звичайно, це справедливо для параметрів з однаковими іменами Це ж відбувається з іншими елементами з прикріпленими наборами параметрів. Значення Набір параметрів перезапишуть будь-які параметри за промовчанням з тими самими іменами.

Отримання обробленого висновку Об'єкта

У деяких випадках вам можливо знадобиться сніпета для отримання обробленого виведення чанка або іншого сніпета. Є дві функції runSnippet() і getChunk(), які, як і раніше, доступні в Revolution. У цьому прикладі для сніпетів $props – це масив, який містить параметри сніпету:

Коли ви виконуєте сніпет за допомогою runSnippet('SnippetName') у коді, то будуть використані параметри за замовчуванням. Якщо ви надсилаєте Набір параметрів, використовуючиrunSnippet('SnippetName',$properties), то обидва – Властивості за замовчуванням і надіслані разом зі сніпет тегом будуть доступні в сніпеті. Надіслані зі сніпет тегом параметри перезапишуть параметри за промовчанням з тим же ім'ям.

Плейсхолдер теги в чанці будуть замінені на значення прикріпленого набору параметрів, але як ці плейсхолдери будуть оброблені при використанні getChunk() у сніпеті? Відповідь – це другий аргумент у getChunk(), який містить масив параметрів. Так як безліч наборів параметрів може мати те саме ім'я, то вам потрібно знайти потрібне ім'я:

Ви повинні розуміти різницю між Набором параметрів та Набором параметрів за промовчанням, які доступні у вкладці Властивості елементів. Ці параметри за промовчанням технічно не є набором параметрів. Насправді вони є еквівалентом параметрів Набору параметрів. Метод getProperties() отримає параметри будь-якого з них:

Коли чанк отримують за допомогою методу getChunk() Властивості за замовчуванням будуть доступні для тегів плейсхолдерів у чанці і будуть перезаписані будь-яким параметровим з тим самим ім'ям, що знаходиться у виклику getChunk('ChunkName',$properties).

Такий процес необхідний, якщо ви хочете надіслати набір параметрів встановлених у дзвінку для runSnippet(). Властивості в наборі параметрів будуть доступні в сніпеті, якщо вони введені як параметри в мітці сніпет. Знову значення, що посилаються в тегу сніпета, перезапишуть параметри за замовчуванням з тим же ім'ям.

Для інших елементів після того, як ви отримали елемент за допомогою $modx->getObject(), ви можете отримати оброблений висновок, використовуючи $element->process(). Це працює для чанків і сніпетів (взагалі, обидва getChunk() і runSnippet() методи викликають метод елемента process(). Як ви могли б здогадатися$element->process($properties) також доступний і параметри за замовчуванням перезаписуються заданими у дзвінку.

Вам ніколи не потрібно надсилати параметри за замовчуванням у викликах getChunk(), runSnippet() або process(). Вони використовуються автоматично.

Так як елементи можуть мати більше одного набору параметрів, прикріплених до них, завжди необхідно визначати який набір параметрів вам потрібен, крім якщо ви хочете, щоб MODX використовував параметри за замовчуванням.

Цей метод працює і для ресурсів. Після того, як ви отримали об'єкт ресурсу через $modx->getObject(), поле обробленого контенту ресурсу стане доступним через $resource->process(). Будьте обережні не робити цього виклику для поточного ресурсу в сніпеті міститься в даному ресурсі з метою уникнення циклу.

Одержання сирого вмісту Об'єкту

У MODX сирий вміст називається просто «контент». Для чанка контент – це HTML-код чанка, включаючи будь-які теги плейсхолдерів. Для сніпету або плагіна – це дійсний код. Вам рідко знадобиться, може бути зовсім ніколи, створити сніпет чи плагін для зміни MODX БД або допомоги у налагодженні, щоб отримати контент ви можете використовувати наступне:

Звичайно ж, ви можете отримати контент окремих полів за допомогою:

Погляньте на таблицю нижче для пошуку потрібних імен полів, але пам'ятайте, що імена полів можуть змінитися в наступних версіях (особливо для чанків та сніпетів), саме тому getContent() буде найкращим вибором для отримання контенту об'єкта, оскільки він автоматично виставляє правильне ім'я поля .

Інформація нижче дасть вам краще розуміння того, як MODX керує об'єктами, а також наведено список загальних імен полів у кожному об'єкті. Зверніть увагу, що список не повний іокремі імена полів можуть зміняться в подальшому (це інша причина, чому потрібно використовувати стандартні функції доступу).

Модифікація об'єктів

Після отримання посилання на об'єкт за допомогою $modx->getObject(), ви можете змінювати значення його полів таким чином:

Для зміни або створення основного поля Контенту ресурсу або елемента (наприклад, поле «контенту» ресурсів, контент чанків, код сніпетів) завжди використовуйте setContent():

Створення нових об'єктів

Знову, розповім вам про те, що ви навряд чи робитимете, тільки якщо ви не розробник аддонів, що створює білд-скрипт. Це має бути зроблено з належною увагою та розумінням того, які поля необхідні для кожного типу об'єктів. Ви можете створювати об'єкти за допомогою: