В данной версии расширены возможности работы с сессией и почтовыми уведомлениями. Вот список изменений:

  • Изменена сигнатура функции «session». Это очень важное изменение.
  • Добавлена функция «session_pull».
  • Добавлена функция «default_if».
  • Добавлен метод «tpl» к классу modHelpersMailer.
  • Добавлен метод «log» к классу modHelpersMailer.
  • Добавлен метод «toArray» к классу modHelpersMailer.

Теперь давайте пробежимся по порядку.

Функция session()

Теперь она имеет следующую сигнатуру

session($key = null, $default = null, $flat = false)

Теперь чтобы записать значение в сессию нужно передать значение через массив:

session(['key' => 'value']);

Получить значение:

session('key', 'default');

Вторым параметром указывается значение по-умолчанию, если в сессии не существует указанного ключа.

Третий параметр $flat используется для отключения парсинга точечной нотации ключа (по-умолчанию он включён).

// С парсингом
session(['key1.key2' => 'value']); // $_SESSION['key1']['key2'] = 'value';
// Без парсинга
session(['key1.key2' => 'value'], true); // $_SESSION['key1.key2'] = 'value';

Эта возможность иногда может пригодится, так как MODX пишет некоторые ключи с точками — 'modx.user.0.attributes'.

Функция session_pull()

Данная функция получает из сессии значение по указанному ключу и удаляет этот ключ из сессии. Это пригодится для вывода одноразовых сообщений на странице. Например, в php скрипте записываем сообщение в сессию

if ($someError) {
    session(['error.message' => "Это сообщение будет показано только один раз!"]);
}

А в HTML разметке выводим через шаблонизатор (например, Fenom)

<div>
    {$.php.session_pull('error.message')} 
</div>

Функция default_if()

Эта функция выдаёт определённое значение в зависимости от условий. Её можно использовать как альтернативу такому коду

if (!isset($var)) {
    $var = 'default';
}

Теперь это же можно сделать так

$var = default_if($var, 'default');

Или вместо того, чтобы писать так

$var = isset($object->method()) ? $object->method() : 'default'; 

пишем так

$var = default_if($object->method(), 'default'); 

В таком варианте первый параметр проверяется на существование. Если он не существует или равен null, то возвращается дефолтное значение. Но у функции есть третий параметр, который позволяет переопределить сравниваемое значение. Т.е. в нём можно указать значение, при равенстве с которым первого параметра будет возвращено дефолтное значение.

Приведу пример для ясности.

$message = default_if($data, 'Массив пустой!', array()); 
// замена следующему коду
if (isset($data) && $data == array()) {
    $message = 'Массив пустой!';
}

Мне эта функция пригодилась. Возможно ещё кому-нибудь понравиться.

Уведомления

Три последних изменения коснулись класса мейлера библиотеки.

Первое — добавлен метод tpl(), который позволяет добавлять чанк (стандартный или файловый) для контента.

email()
    ->to('user1@mail.ru')
    ->toUser(5)
    ->cc('user2@mail.ru') 
    ->subject('Subject')
    ->tpl('chunkName or file', $params) // игнорируется, если контент указан методом content()
    ->from('Administrator')
    ->replyTo('admin@mysite.com')
    ->attach('path/to/file1.jpg')
    ->send();

Два остальных метода пригодятся при тестировании email уведомлений. Особенно это актуально для локальной разработки.

  • Метод log() используется для вывода массива данных уведомления в лог системы. Если передать аргумент true, то вывод будет в формате JSON.
  • Метод toArray() используется для получения данных уведомления. Если передать аргумент true, то массив выведется через print_r().

Оба эти метода конечные и используются вместо метода send().

email()
    ->to('user1@mail.ru')
    ->toUser(5)
    ->cc('user2@mail.ru') 
    ->subject('Subject')
    ->tpl('chunkName or file', $params)
    ->from('Administrator')
    ->replyTo('admin@mysite.com')
    ->attach('path/to/file1.jpg')
    ->log();

На этом всё.

06 августа 2017, 09:08   492     5

Комментарии ()

  1. Семён 25 сентября 2017, 10:22 # 0
    Сергей, здравствуйте.
    Пробую использовать функцию проверки на мобильность, чтобы отдавать другую вёрстку для мобильных устройств
    Для этого использую пример кода из документации
    {if is_mobile()}
    <h1>МОБИЛЬНИК</h1>
        {include "file:templates/mobile/index.tpl"}
    {else}
    <h1>ДЕСКТОП</h1>
        {include "file:templates/index.tpl"}
    {/if}
    
    Но всё время получаю одну и ту же ошибку
    [2017-09-25 10:19:36] (ERROR @ W :\domains\redactor.loc\core\components\pdotools\model\pdotools\_fenom.php : 652) PHP warning: Missing argument 1 for FenomX::{closure}(), called in W :\domains\redactor.loc\core\components\pdotools\vendor\fenom\fenom\src\Fenom\Template.php(487) : eval()'d code on line 4 and defined
    [2017-09-25 10:19:36] (ERROR @ W :\domains\redactor.loc\core\components\pdotools\model\pdotools\pdotools.class.php : 344) [pdoTools] Could not load snippet "is_mobile"
    
    Компонент установлен, может ещё что-то нужно где-то включить, чтобы заработало?
    1. Сергей Шлоков 25 сентября 2017, 16:00 # 0
      Здравствуйте!
      Честно говоря, не знаю. А настройки Fenom все включены?
      1. Семён 25 сентября 2017, 20:02 # 0
        Да и чанки и шаблоны им обрабатываются.
        Проверил на modhost та же проблема, оставил лог с ошибками.
        Если будет возможность посмотрите, пожалуйста, печально будет если компонент перестанет работать, очень выручает в проектах.
        Вот доступы:
        s11091.h5.modhost.pro/manager/
        s11091
        9alUi3reM9rz
        1. Сергей Шлоков 25 сентября 2017, 21:56 # 0
          Должен быть разрешен php в Fenom. is_mobile() — это php функция.
          1. Семён 26 сентября 2017, 07:25 # 0
            Сергей, спасибо огромное.
            Просто настолько привык к Fenom, что уже порой кажется, он может всё, что может php и без php ))

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.