MODxAPI це спроба реалізувати патерн Data mapper. Спочатку проектувалося як заміна бібліотеки DocManager, але в підсумку код було оптимізовано і закладено потенціал для створення обгортки з довільної логікою для будь-яких таблиць.
modResource - Документи (дані з таблиці site_content і site_tmplvar_contentvalues) modUsers - Веб-користувачі (дані з таблиць web_users иі web_user_attributes) modCategories - Категорії (дані з таблиць categories) modChunk - Чанки (дані з таблиць site_htmlsnippets) modModule - Модулі (дані з таблиць site_modules) modPlugin - Плагіни (дані з таблиць site_plugins modSnippet - Сніппети (дані з таблиць site_snippets) modTV - ТВ параметри (дані з таблиць site_tmplvars) modTemplate - Шаблони (дані з таблиць site_templates)
При бажанні можна швидко створити свою модель для будь-якої таблиці. Для цього існує заготовка класу autoTable. У самому примітивному випадку досить вказати лише назву вашої таблиці. Погляньте на приклад створення моделі для таблиці з ім'ям tests:
<?php
include_once(MODX_BASE_PATH. "assets/lib/MODxAPI/autoTable.abstract.php");
class modTests extends autoTable
{
protected $table = "tests";
}
Методи create, edit, delete, save актуальні для всіх моделей. Але як приклад будемо розглядати модель modResource.
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");
$doc = new modResource($modx);
/**
* Підготувати створення документа з наступними даними:
* ID шаблона = 10
* Як батька використовувати документ з ID = 1
* pagetitle заголовок документа = example
*/
$doc->create(array(
'pagetitle' => 'example',
'template' => 10,
'parent' => 1
));
/**
* змінити pagetitle заголовок документа на new title
*/
$doc->set('pagetitle', 'new title');
/*
* Зберегти документ викликавши події OnBeforeDocFormSave OnDocFormSave,
* але не виробляти скидання кешу.
* ID нового документа помістити в змінну id
*/
$id = $doc->save(true, false);
/**
* Відкрити на редагування документ з ID = 10
*/
$doc->edit(10);
/**
* Міняємо батька документа
*/
$doc->set('parent', 0);
/*
* Зберігаємо документ не викликаючи події OnBeforeDocFormSave OnDocFormSave,
* Але при цьому виробляємо скидання кеша.
* ID документа зберігається в змінної $id
*/
$id = $doc->save(false, true);
/***
* Видалити всі документи, які помічені на видалення.
* При цьому викликати події OnBeforeEmptyTrash і OnEmptyTrash
* Якщо значення параметра змінити з true на false, то події викликані не будуть, хоча документи видаляться
*/
$doc->clearTrash(true);
/**
* Видалити документ з ID = 5, минаючи кошик
* При цьому події OnBeforeEmptyTrash і OnEmptyTrash, будуть викликані.
*/
$doc->delete(5, true);
За допомогою моделі modUsers можна проводити не тільки запис і отримання даних, але ще і проводити маніпуляції з авторизацією:
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modUsers.php");
$user = new modUsers($modx);
/**
* Авторизуватись від імені веб-користувача з ID = 1
*/
$user->authUser(1);
/**
* Перевірити статус блокування веб-користувача з ID = 1
* Даний метод повертає значення типу boolean
* true - заблокований
* false - активний
*/
$flag = $user->checkBlock(1);
/**
* Перевірити пароль myPassword для веб-користувача з ID = 1
* Після чого виконати перевірку статусу блокування. Якщо навіть пароль вказано вірний, а користувач заблокований, то даний метод поверне значення false. У разі, якщо змінити значення 3 параметра на false, то статус блокування перевірятися не буде.
* Даний метод повертає значення типу boolean
* true - вірний пароль
* false - пароль не коректний
*/
$flag = $user->testAuth(1, 'myPassword', true);
/**
* Примусово разлогініть веб-користувача
*/
$user->logOut();
modUsers Наступний плагін для подій OnWebPageInit і OnPageNotFound, дозволяє виробляти моментальне застосування блокування. Це буває корисно, коли користувача начебто забанили, але він продовжує проявляти активність, тому що сесія не закінчилася.
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modUsers.php");
$modx->user = new modUsers($modx);
if($modx->isFrontend() && $modx->getLoginUserID('web')){
$modx->user->edit((int)$modx->getLoginUserID('web'));
if(!$modx->user->getID() || $modx->user->checkBlock()){
$modx->user->logOut();
}
}
modResource Наступний сніпет дозволяє послідовно отримувати значення полів одного і того ж документа не виконуючи при цьому повторий SQL запит.
/**
* <h5>[[DocInfo? &id=`6` &field=`pagetitle`]]</h5>
* <img src="[[DocInfo? &id=`6` &field=`image`]]" />
* З даним сніпетом буде виконаний всього 1 SQL запит
*/
if(empty($modx->doc)){
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");
$modx->doc = new modResource($modx);
}
$id = isset($id) ? (int)$id : $modx->documentObject['id'];
$field = isset($field) ? (string)$field : 'id';
if($field == 'id'){
$out = $id;
}else{
if($modx->documentObject['id'] == $id){
$out = isset($modx->documentObject[$field]) ? $modx->documentObject[$field] : '';
if(is_array($out)){
$out = isset($out[1]) ? $out[1] : '';
}
}else{
$doc = clone $modx->doc;
$out = $doc->edit($id)->get($field);
}
}
return (string)$out;