modxLoader - загрузчик классов и методов

modxLoader — это плагин для загрузки классов и методов, как из PHP так и через AJAX.

Использование данного класса достаточно просто и позволит разрабатывать новые сниппеты без записи их в админке, а вызывать сразу методы класса.

Удобство в том, что создав свой класс, можно использовать его без его объявления, а потом обращения к нужному методу, а так же инклюдов. А сразу выбираем метод.

Пример
$modx->load->controller('account/controller/login', $config);

'account/controller/login' — путь в папке assets/snippets/ до нужного сниппета и название класса контроллера (AccountControllerLogin).
По умолчанию, если не указан метод, вызывается метод класса index.

$config — параметры передаваемые в выбранный метод.


Прямое обращение к методу addUser
$modx->load->controller('account/controller/login/addUser', $config);


не забывайте, если методы публичные, то и достучаться до них не проблема, но если приватные или защищённые, то бестолку.

Работа загружаемых классов
Все загружаемые через modxLoader классы, могут быть как расширением класса Loader, так и других доступных.
Использование функций ядра modx доступно в каждом методе через
$this->modx->...


Создание новых сниппетов
Правила создания новых сниппетов (контроллеров) сводится к «правильному» названию класса, он должен называться в зависимости от вложенности данного файла.
К примеру есть файл сниппета, который имеет путь
assets/snippets/ВашСниппет/Классы/Сниппет.php,
соответственно название класса в этом файле будет
<?php
class ВашСниппетКлассыСниппет {

    function index() {
        ....
    }

}

Или как расширение класса Loader либо любого другого
<?php
class ВашСниппетКлассыСниппет extends Loader {

    function index() {
        ....
    }

}

и вызвать данный сниппет достаточно просто
$modx->load->controller('вашсниппет/классы/сниппет', $config);

(регистр не имеет значения)

AJAX
И на десерт, AJAX. Работает по принципу Ajax метод №4 от Agel_Nash

Создание файла для работы через аякс.

Пример вызова метода на jQuery

var params = {};
$.ajax({
    url: 'ajax.php?route=вашсниппет/классы/сниппет/ajax',
    dataType: 'json',
    type: 'post',
    data: params,
    success: function(json) {

    // ваш код

    },
    error: function(xhr, ajaxOptions, thrownError) {
    alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
    }
});

Обращение к методу ajax в вашем классе, но не забывайте делать проверки и чистку POST от всякого мусора.

Так же можно передать GET параметры в метод класса.

$.ajax({
    url: 'ajax.php?route=вашсниппет/классы/сниппет/ajax&docid=1&parent=2',
    dataType: 'json',
    type: 'post',
......

dataType: 'json' — в данном случае ответ от сервера в json
и код метода (функции) ajax будет такой


public function ajax($config) {
	$json = array();

        // ваш код

	header('Content-Type: application/json');
	echo json_encode($json);
}


По сути уже через аякс можно сделать абсолютно что угодно в среде modx, не городив кучу сниппетов, а используя один загрузчик — modxLoader.

удалено
Так же в modxLoader есть метод view, в который можно загружать параметры и выводить шаблон с подстановкой этих параметров.

$data = array();
$data['date'] = date("Y-m-d H:i:s");

echo $this->modx->load->view('assets/snippets/ВашСниппет/Шаблоны/Шаблон.tpl', $data);

Шаблон.tpl

<h1>Текущая дата <?= $date ?></h1>


Код плагина на гитхабе.

Жду ваших отзывов и предложений)

UPD: удален шаблонизатор, переопределена работа через ajax.

10 комментариев

avatar
В MODX и так нет проблем работы через ajax
достаточно погуглить метод 3 через событие 404
или метод 4 через отдельный файлик после чего доступны все возможности MODX.

Тут же как по мне доп класс может и полезен но для себя пока не вижу плюшек только еще 1 сущность.
так же ajax?route=вашсниппет/классы/сниппет/ajax&docid=1&parent=2
как по мне показывает куда идет запрос что не сильно хорошо ибо дает возможность пошарить параметры и получить что то лишнее но тут надо просить Agel_Nash глянуть код на безопастность
avatar
взять к примеру shopkeeper, там тоже можно напрямую пощупать параметры))
но напрямую если пройти, там уже на всё воля разработчиков, что они в эти методы засунут, как и во всём другом.
А данный плагин и работает через аякс по Ajax. Метод №3 ))
avatar
так же в modxLoader, есть метод простенького шаблонизатора с подстановкой параметров. Что быстрее плейсхолдеров и чанков.
avatar
Быстрее на сколько? если 10% то кроме еще одной сущности ничего хорошего :(

Чем проще и однородней среда тем проще работать с системой :)

В MODX и так нет строгих правил, поэтому иногда править проект за кем то сущий кошмар. Хорошо когда знаешь откуда ноги растут :)

А когда встречаешь новый шаблонизатор то недопонимаешь зачем. Я за простоту и легкость понимания :) Я вон даже против того что добавили в версиии 1.2 новые штуки в виде PHx в ядре условия IF через комментарии. Как по мне это все лишнее и только засоряет читабельность кода :)

Вообще уверен что решение хорошее и облегчает работу :) но Для себя пока не вижу его полезность и удобство. Ибо все выше изложенное делается просто без лишних сущностей
avatar
данный загрузчик, облегчает не только работу, но и избавляет от создания лишних сниппетов в админке, поскольку обращаться можно к ним через загрузчик.
И готовые решения переносить на другие сайты будет гораздо проще, просто скопировать нужные папки.

Так же данный загрузчик можно использовать в роли и сниппета.
[!loader?route=`DocLister/snippet.doclister`&options=`....`!]

Один сниппет вместо всех))
avatar
Один сниппет вместо всех это еще хуже :) читабельность кода на нуле

переносить давно можно все сниппеты плагины как душе угодно:
гляньте Плагин StaticElements )
avatar
ну не так уж и на нуле, наоборот нагляднее, для разработчика.
[!loader?route=`DocLister/snippet.doclister`
&id=`category`
&parents=`0`
&orderBy=`id ASC`
&tvList=`image`
&tpl=`dl.chunk`
!]


[!loader?route=`eForm/snippet.eform`
....
!]
avatar
Я даже смотреть не буду, т.к. уже где-то говорил, что несогласен с ajax на плагине NotFound.
avatar
OnPageNotFound самое первое событие при загрузке страницы, если бы было ещё раньше, типа OnExecuteParser, чтобы можно было поставить свои обработчики после загрузки конфига сайта настроек.
То данный плагин можно было поставить и на него.
avatar
Евгений, кстати и на твоём способе Ajax метод 4, всё так же прекрасно работает.

ajax.php

<?php

define('MODX_API_MODE', true);

include_once(dirname(__FILE__) . "/index.php");

$modx->db->connect();

if (empty ($modx->config)) {
    $modx->getSettings();
}

$modx->invokeEvent("OnWebPageInit");

if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')){
	$modx->sendRedirect($modx->config['site_url']);
}

$json = array();

$json = $modx->load->controller($_REQUEST['route'], $_REQUEST);

header('content-type: application/json');
echo json_encode($json);


только url уже будет выглядеть вот так

$.ajax({
            url: 'ajax.php?route=account/controller/register/ajax',

.....
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.