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;