[modHelpers] Контейнер, фильтрация данных, планшет
Новость для разработчиков. В библиотеку добавлено несколько новых функций:
С первыми двумя функциями, думаю, всё понятно. Это функции-детекторы текущего устройства. Раньше можно было только проверить является ли устройство мобильным или нет, используя функцию is_mobile(). Теперь проверка полноценнее. Особенно это хорошо впишется при использовании шаблонизатора.
Идём дальше. Функция app() возвращает объект контейнера, который используется для разрешения зависимостей. В контейнере можно хранить объект, который будет один и тот же на протяжении загрузки приложения. Это так называемый синглтон (singleton). Например, в начале загрузки определяется репозиторий (репозиторий пользователей, ресурсов и т.п.), а затем в любом месте приложения к нему можно обращаться. Синглтоны часто используются как сервисы.
Основные методы:
Проверяем, определена ли уже зависимость
Удобно когда нужно проводить какие-нибудь однотипные манипуляции
Про filter_data() я уже писал. Добавлю только, что можно вызывать несколько фильтров для поля (через |), а также указывать параметры у фильтров (после :).
На сегодняшний момент фильтры следующие:
Кроме того можно использовать не только замыкания (анонимные функции), но и функции php (к ним же относятся и функции самой библиотеки modHelpers).
Ну и осталась функция null_if(). Она возвращает NULL, если переданное значение равно второму параметру. По-умолчанию, второй параметр равен пустой строке. Эта функция — задел на будущий функционал валидации данных.
Ещё пару слов про функцию logout(). У неё появился третий параметр, определяющий нужно ли перелогиниться. Если указать TRUE, то если пользователь залогинен в админке, он будет аутентифицирован как этот пользователь. Если указать FALSE, то он так и останется гостем. Это может пригодится при тестировании — когда нужен гость, в вы залогинены в админке, и MODX автоматом аутентифицирует пользователя сайта как админа. Вот чтобы не выходить из админки можно разлогиниться с параметром FALSE.
На этом всё.
P.S. Детектор устройства использует библиотеку MobileDetect. Поэтому можно использовать все её возможности. А у неё очень много полезных методов. Эта библиотека подключается как сервис через функцию app(). Поэтому обратиться к ней можно в любом месте так
- is_tablet()
- is_desktop()
- app()
- filter_data()
- null_if()
С первыми двумя функциями, думаю, всё понятно. Это функции-детекторы текущего устройства. Раньше можно было только проверить является ли устройство мобильным или нет, используя функцию is_mobile(). Теперь проверка полноценнее. Особенно это хорошо впишется при использовании шаблонизатора.
{if $.php.is_tablet()}
// Планшет
{elseif $.php.is_mobile()}
// Телефон
{else}
// Десктоп
{/if}
Функция is_mobile() определяет и телефоны и планшеты как мобильные.Идём дальше. Функция app() возвращает объект контейнера, который используется для разрешения зависимостей. В контейнере можно хранить объект, который будет один и тот же на протяжении загрузки приложения. Это так называемый синглтон (singleton). Например, в начале загрузки определяется репозиторий (репозиторий пользователей, ресурсов и т.п.), а затем в любом месте приложения к нему можно обращаться. Синглтоны часто используются как сервисы.
Основные методы:
- bind() — регистрация зависимости.
- singleton() — регистрация синглтона через имя класса или замыкание.
- instance() — регистрация уже существующего объекта в качестве синглтона.
- bound() — проверяет, определена ли указанная зависимость.
- resolved() — проверяет, создан ли объект указанной зависимости.
// В плагине при инициализации MODX определяем зависимость
app()->singleton('userRepo', function() use ($modx) {
return users()->where(['active'=>true])->toArray();
});
И теперь в любом месте приложения можно вызвать $users = app('userRepo');
И получаем всегда один и тот же репозиторий. И никаких повторных запросов к базе.Проверяем, определена ли уже зависимость
if (!app()->bound('alias')) {
app()->bind('alias', function(){...});
}
Удобно когда нужно проводить какие-нибудь однотипные манипуляции
// Инициализируем зависимость
app()->bind('user', function($app, $params = array()) {
if (isset($params['id'])) $user = user($params['id']);
// Делаем нужные манипуляции и инициализации
...
// Возвращаем объект
return $user;
});
...
// В любом месте приложения вызываем
$user = app('user', array('id' => 5)); // получаем подготовленный объект пользователя
Про filter_data() я уже писал. Добавлю только, что можно вызывать несколько фильтров для поля (через |), а также указывать параметры у фильтров (после :).
На сегодняшний момент фильтры следующие:
- int, integer — Приводит к integer.
- string — Удаляет теги и пробелы из начала и конца строки.
- float — Приводит к float типу.
- array — Конвертирует значение в массив.
- bool, boolean — Возвращает TRUE для «1», «true», «on» и «yes». И FALSE в остальных случаях.
- alpha — Возвращает только буквенные символы из указанного значения.
- alpha_num — Возвращает только буквы и цифры.
- num — Возвращает только цифры.
- email — Удаляет все символы кроме букв, цифр и !#$%&'*+-=?^_`{|}~@.[].
- url — Удаляет все символы кроме букв, цифр и $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
- limit — Обрезает строку до указанного значения и добавляет в конец указанную строку. После двоеточия через запятую можно определить 2 параметра — длина строки и окончание ('limit:20,...'). Многоточие указывается по-умолчанию.
- fromJSON — Декодирует строку из JSON формата.
- toJSON — Возвращает значение в JSON формате.
- default — Возвращает значение по-умолчанию, если указанное значение не существует ('default: Значение по-умолчанию').
Кроме того можно использовать не только замыкания (анонимные функции), но и функции php (к ним же относятся и функции самой библиотеки modHelpers).
// $_POST['list' => 'cat1, cat2, cat5']
$post = filter_data($_POST, ['list' => 'explode|trim'; // Вызываем 2 фильтра - функции php
// $post['list'] = array('cat1', 'cat2', 'cat5')
Загружает объект пользователя// $_POST = ['user' => '5']
$rules = [
'user' => 'user', // функция modHelpers
];
$post = filter_data($_POST, $rules);
// $post['user'] - объект класса modUser с id 5.
Ну и осталась функция null_if(). Она возвращает NULL, если переданное значение равно второму параметру. По-умолчанию, второй параметр равен пустой строке. Эта функция — задел на будущий функционал валидации данных.
Ещё пару слов про функцию logout(). У неё появился третий параметр, определяющий нужно ли перелогиниться. Если указать TRUE, то если пользователь залогинен в админке, он будет аутентифицирован как этот пользователь. Если указать FALSE, то он так и останется гостем. Это может пригодится при тестировании — когда нужен гость, в вы залогинены в админке, и MODX автоматом аутентифицирует пользователя сайта как админа. Вот чтобы не выходить из админки можно разлогиниться с параметром FALSE.
На этом всё.
P.S. Детектор устройства использует библиотеку MobileDetect. Поэтому можно использовать все её возможности. А у неё очень много полезных методов. Эта библиотека подключается как сервис через функцию app(). Поэтому обратиться к ней можно в любом месте так
$detector = app('detector');
// И дальше уже вызывать методы
$detector->version('Firefox');
if ($detector->isiOS()) {}
if ($detector->is('Chrome')) {}
Правда автор MobileDetect пишет, что функция is() пока бета. Лично у меня // Браузер не определяет
$detector->is('Firefox'); // false
// А его версию да
$detector->version('Firefox'); // 54.0
Поблагодарить автора
Отправить деньги
Комментарии: 1
Старость — не радость. Забыл написать про изменение функции parse(). Теперь у неё 2 режима: быстрый парсинг и полный. Быстрый — для простой замены тегов
$tpl = '<li>[[+id]]. [[+username]]</li>';
// В цикле меняем
...
$output .= parse($tpl, $data);
...
$output = '<ul>' . $output . '</ul>'
А полный парсинг работает как getChunk для инлайн чанка. Т.е. можно указать полноценную строку с тегами чанков, сниппетов.$tpl = 'Строка с вызовом чанка [[$chunk]].';
$output = parse($tpl, $data, true, 5);
Для полного парсинга нужно передать в третьем параметре TRUE. В четвертом можно указать количество итераций парсера. По-умолчанию, 10.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.