MODX (xPDO) - Получаване на обекти, IT шеф
Статия, в която ще разгледаме какво е xPDO и как да го използваме при писане на фрагменти и плъгини за системата MODX Revolution CMS. Нека да разгледаме основните xPDO методи, използвани за получаване на обекти (getObject, getCollection, getIterator, getOne и getMany) и метода newQuery, който се използва за правене на заявка. Освен това ще разгледаме метод за получаване на данни от базата данни CMS MODX Revolution без създаване на обекти, т.е. използвайки PDO.
Какво е xPDO?
xPDO(eXtensionPDO) е обектно-релационният мост (ORB) в сърцето на MODX Revolution CMS.xPDOе библиотека, изградена върху PDO. Основната цел на тази библиотека еда предостави на разработчиците обектно-ориентиран интерфейс за програмиране (API), който ще им позволи да създават сложни уеб приложения по-лесно и по-ефективно.xPDO се основава на обектни модели за различни платформи за бази данни. Обектният модел xPDO е обикновен XML файл. Например, за MySQL DBMS, този файл се нарича modx.mysql.schema.xml. Можете да го намерите в CMS MODX Revolution на следния път: /core/model/schema/ . Ако отворите този файл, можете да видите, че той се състои от обекти (класове). Всеки обект (клас) е определена таблица, а свойствата на този обект са неговите колони.
В MODX Revolution има много обекти (таблици), но най-често използваните при писане на фрагменти и добавки са следните: modResource (ресурси), modChunk (парчета), modUser (потребители), modUserProfile (потребителски профил), modTemplateVarResource (стойност на допълнителни полета), modTemplateVar (допълнителни полета).
Връзка между обекти (класове) 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 към заявката. ДЯСНО СЪЕДИНЯВАНЕ (Дясно външно съединение) е обратното на ЛЯВО СЪЕДИНЯВАНЕПРИСЪЕДИНЯВАНЕ. Това означава, че наборът от резултати от втората (дясна) таблица ще включва всички редове. А от първата (лява) таблица само тези, за които условието за присъединяване на ще бъде изпълнено.
- xPDOQuery.where- добавя клауза WHERE към заявката.
- xPDOQuery.andCondition- Добавя условие И към клаузата WHERE. Методът andCondition може да се използва само след метода where.
- xPDOQuery.orCondition- Добавя условие ИЛИ към клаузата WHERE. Методът orCondition може да се използва само след метода 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
За да работи със свързани обекти, 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 начин за получаване на данни прави това без проверка на разрешенията и разбира се без създаване на xPDOObjects.