MODxAPI

Введение

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;
Mem: 3.75 mb, MySQL: 0.0025 s, 2 req., PHP: 0.0331 s, all: 0.0357 s, cache.