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;