MODX (xPDO) - Отримання об’єктів, ІТ Шеф
Стаття, в якій розглянемо, що таке xPDO та як його використовувати при написанні сніпетів та плагінів для системи CMS MODX Revolution. Розберемо основні методи xPDO, що застосовуються для отримання об'єктів (getObject, getCollection, getIterator, getOne та getMany) та метод newQuery, який використовується для складання запиту. Крім цього, розглянемо спосіб отримання даних з бази CMS MODX Revolution без створення об'єктів, тобто. за допомогою PDO.
Що таке xPDO?
xPDO(eXtensionPDO) - це об'єктно-реляційний міст (ORB), покладений в основу системи CMS MODX Revolution.xPDOявляє собою бібліотеку, побудовану на основі PDO. Основна мета цієї бібліотеки – ценадати розробникам об'єктно-орієнтований програмний інтерфейс (API), який дозволить більш просто та ефективно створювати складні веб-додатки.В основу xPDO покладено об'єктні моделі для різних платформ баз даних. Являє собою об'єктна модель xPDO звичайний XML-файл. Наприклад, для СУБД MySQL цей файл називається modx.mysql.schema.xml . Знайти його в системі CMS MODX Revolution можна наступним шляхом: /core/model/schema/ . Якщо цей файл відкрити, можна побачити, що він складається з об'єктів (класів). Кожен об'єкт (клас) є деяку таблицю, а властивості цього об'єкта – його стовпці.
Об'єктів (таблиць) в MODX Revolution досить багато, але найчастіше використовуються при написанні сніпетів і плагінів такі: modResource (ресурси), modChunk (чанки), modUser (користувачі), modUserProfile (профіль користувача), modTemplateVarResource (значення додаткових полів), mod (додаткові поля).
Відношення між об'єктами (класами) CMS MODX Revolution
Примітка: у дужках на наведеній вище схемі вказані назви таблиць без префікса. Кожна таблиця є у xPDO моделі той чи інший об'єкт.
Методи xPDO для отримання об'єктів
У xPDO отримання об'єктів здійснюються в основному за допомогою наступних методів: getObject, getCollection, getIterator.
Метод getObject призначений отримання одного об'єкта. Об'єкт - це екземпляр класу xPDOObject. Уявити цей об'єкт можна як рядок у таблиці бази даних.
Метод getCollection призначений отримання колекції об'єктів. Колекція - це масив об'єктів xPDOObject. Уявити цю колекцію можна як список рядків у таблиці.
Метод Iterator призначений для одержання колекції спеціального вигляду. Ця колекція відрізняється від getCollection тим, що вона не надає доступу відразу до всіх її елементів (об'єктів xPDOObject), звернення до них здійснюється послідовно.
Метод getObject
getObject - це метод, який дозволяє отримати об'єкт, що задовольняє зазначений критерій.
Метод getObject може приймати 3 аргументи: $className, $criteria і $cacheFlag. Перший аргумент – це ім'я класу (назва об'єкта), який ви хочете отримати. Другий аргумент - це критерій, на підставі якого здійснюватиметься пошук елемента. Третій (останній) аргумент визначає, чи потрібно кешувати отриманий об'єкт.
Якщо останній аргумент ( $cacheFlag ) має ціле значення, то він визначатиме час, на який об'єкт необхідно помістити в кеш. Якщо аргумент $cacheFlag має значення false , він не буде поміщений в кеш. А якщо аргумент $cacheFlag дорівнює true, то отриманий об'єкт буде поміщений у кеш на невизначений термін.
Аргумент $criteriaможе приймати одне з 3 значень:
- значення первинного ключа;
- масив, що містить одну або декілька умов;
- об'єкт xPDOCriteria або його похідні.
Наприклад, напишемо сніпет, який повертатиме назву (заголовок) ресурсу, який має >:
Якщо метод getObject не може отримати об'єкт, що задовольняє зазначеному критерію, він повертає як відповідь значення null .
Вказувати критерії для пошуку потрібного об'єкта можна також за допомогою масиву:
Ви також можете здійснити пошук вказаного об'єкта (наприклад, ресурсу) по кількох полях:
Якщо зазначеному критерію відповідають кілька об'єктів, то метод getObject поверне лише перший.
Ви також можете створювати більш складні критерії для вибору елементів за допомогою xPDO запиту:
Метод getCollection
getCollection - це метод, який повертає колекцію (масив) знайдених об'єктів xPDOObjects , які відповідають умові.
Метод getCollection приймає самі три аргументи, як і метод getObject .
Ключем масиву, який повертає метод getCollection, є первинний ключ отриманих об'єктів.
Спробуємо одержимо об'єкт з колекції, отриманої методом getCollection за його id :
Наприклад, виведемо імена всіх користувачів CMS MODX Revolution:
Другим параметром може бути не тільки масив, але й об'єкт xPDOQuery:
Метод getIterator
xPDO метод getIterator ідентичний методу getCollection за винятком того, що він дозволяє звернутися в певний момент часу лише до одного об'єкта xPDOObject із колекції рядків. З точки зору використання пам'яті метод getIterator є більш ефективним, ніж метод getCollection татому краще використати саме його. Виняток становить лише ті моменти, коли вам необхідно мати доступ одразу до всіх об'єктів (рядків) колекції.
Увага: При ітерації як індекс об'єкта виступає не первинний ключ.
Метод get призначений для того, щоб отримати значення зазначеної властивості (поля) об'єкта xPDOObject (рядки таблиці).
Метод newQuery
newQuery – це метод, який дозволяє будувати складні запити SQL в об'єктно-орієнтованому вигляді. Створення запиту здійснюється завжди щодо якогось класу, вказаного як перший параметр. Іншими словами, метод newQuery створює новий xPDOQuery для зазначеного класу xPDOObject. Складені запити, наприклад, можна передати як аргумент $criteria метод getObject або getCollection .
Функція newQuery створює об'єкт xPDOQuery. Вона приймає 3 параметри:
Для конструювання запиту можна використовувати такі методи:
- xPDOQuery.leftJoin- додає запит пропозицію LEFT JOIN. Операція LEFT JOIN виконує зовнішнє ліве з'єднання 2 таблиць так, що в результуючий набір потраплять не тільки ті з'єднання рядків, які задовольняють умовіon, але й інші рядки з першої (лівої) таблиці. При цьому відсутні стовпці з другої (правої) таблиці будуть замінені значеннями NULL .
- xPDOQuery.innerJoin- додає пропозицію INNER JOIN на запит. Операція INNER JOIN виконує внутрішнє з'єднання 2 таблиць так, що в результуючий набір потрапляють ті з'єднання рядків таблиць, які відповідають умовіon.
- xPDOQuery.rightJoin- додає запит пропозицію RIGHT JOIN. З'єднання RIGHT JOIN (праве зовнішнє з'єднання) назад до з'єднання LEFTJOIN. Це означає те, що в результуючий набір із другої (правої) таблиці потраплять усі рядки. А з першої (лівої) таблиці лише ті, для яких виконуватиметься умова з'єднання on.
- xPDOQuery.where- додає запит пропозицію WHERE.
- xPDOQuery.andCondition- додає умову AND у пропозицію WHERE. Метод ікондицію може бути використаний тільки після методу, де .
- xPDOQuery.orCondition- додає умову OR у пропозицію WHERE. Метод абокондицію може бути використаний тільки після методу, де .
- xPDOQuery.limit- додає запит пропозицію LIMIT/OFFSET.
- xPDOQuery.sortby- додає запит пропозицію ORDER BY.
- xPDOQuery.select- вказує стовпці, які потрібно повернути із SQL запиту. Функція select працює як з масивом стовпців, так і з рядком (імена стовпців у рядку вказуються через кому).
- xPDOQuery.groupby- додає запит пропозицію GROUP BY. Пропозиція GROUP BY зазвичай використовується у поєднанні з агрегатними функціями COUNT, MIN, MAX, AVG та SUM.
- xPDOQuery.setClassAlias- встановлює SQL псевдонім для таблиці, що є основним класом (об'єкт).
Наприклад, створимо сніпет, який виводитиме на екран ресурси і пов'язане з кожним з них значення TV поля з >.
Вимоги до написання вибірки:
Побачити запит, створений методом newQuery, можна так:
Методи getOne та getMany
p align="justify"> Для роботи зі зв'язаними об'єктами в xPDO використовуються методи getOne і getMany (залежно від потужності відношення).
getOne - це метод, який отримує об'єкт, пов'язаний з поточним ставленням, що має потужність 1:? (1:0 чи 1:1) чи 1:1.
Наприклад, розглянемо, як отримати об'єкт modUser , пов'язаний з об'єктом modResource ставленням "PublishedBy", що має потужність 1.
getMany - це метод, який дозволяє отримати колекцію об'єктів, пов'язаних з поточним ставленням 1: * (один до багатьох).
Наприклад, розберемо, як отримати всі ресурси, створені деяким користувачем:
Виведення даних за допомогою PDO
Отримати дані з бази MODX Revolution можна лише з допомогою методів xPDO ( getOject , getCollection та інших.), а й у вигляді PDO як масиву. Даний спосіб не є стандартним способом отримання даних у CMS MODX Revolution, зате він дозволяє заощадити пам'ять і збільшити швидкодію. Ці переваги в основному проявляють себе тільки в тому випадку, якщо вам необхідно з бази отримати велику кількість інформації.
Увага: Спосіб отримання даних, заснований на PDO, виконує це без перевірки прав і, звичайно, без створення об'єктів xPDOObject.