В этой версии большая часть добавленного функционала касается непосредственно разработки — тут и функции для упрощения отладки, и для работы с массивами и строками.

Список добавленных функций:

  • is_mobile() — проверяет откуда запрос — с мобильного или нет.
  • array_empty() — проверяемая переменная должна быть пустым массивом.
  • array_notempty() — проверяемая переменная должна быть непустым массивом.
  • array_trim(), array_ltrim() и array_rtrim() — рекурсивная обработка массива функциями trim(), ltrim() и rtrim() соответственно. Можно указывать символы для удаления.
  • explode_trim(), explode_ltrim() и explode_rtrim() — объединение 2-х функций: explode() и trim с возможностью указания символов.
  • print_str() — Расширяет функцию print_r(). Конвертирует переменную в строку и печатает или выводит её. В качестве аргумента может быть строка, массив, объект, у которого определён метод toArray(). Массив оборачивается в тег pre. Результат можно оборачивать в теги HTML.
  • print_d() — выводит значение через функцию print_str() и завершает выполнение сценария. Т.е. print and die.
  • echo_nl() — добавляет к выводу символ окончания строки. В качестве аргумента может быть только строка.
  • parse() — заменяет плейсхолдеры с строке на переданные значения. Плейсхолдеры должны передаваться в ассоциативном массиве.
  • str_starts() — возвращает истину, если строка начинается с указанной подстроки.
  • str_ends() — возвращает истину, если строка заканчивается указанной подстрокой.
  • str_contains() — возвращает истину, если указанная подстрока содержится в исходной строке.
  • str_match() — проверяет, соответствует ли строка указанному паттерну.
  • str_limit() — возвращает строку указанной длины и добавляет завершающую строку — по-умолчанию многоточие.
  • str_between() — возвращает подстроку, найденную между указанными тегами.
  • Кроме функций также были произведены некоторые доработки существующиего функционала. Первое — улучшена функция логирования. Теперь можно вывести в лог объект, у которого есть метод toArray(). А это все наследники класса xPDOObject. Т.е. запросто можно вывести текущего пользователя вот так:

    log_error($modx->user);
    // Результат
    Array (
        [id] => 1
        [username] => admin
        ...
    }
    

    Вторая доработка коснулась функции работы с имейлами. Эта операция очень ресурсоёмкая. И поэтому в класс мейлера был добавлен функционал очереди. Теперь уведомление можно сохранить в очередь, а затем через ajax или по крону отправить его. Очередь реализована в виде простых файлов в директории кэша MODX. Очередей может быть сколько угодно. Работает это так:

    # Формируем письмо
    email()
    	->to('user1@mail.ru')
    	->toUser(5)
    	->cc('user2@mail.ru') 
    	->subject('Тема письма')
    	->content('тело сообщения')
    	->from('Администратор')
    	->replyTo('admin@gmail.com')
    	->attach('file1.jpg')
    	->attach('file2.png')
    	// Добавляем письмо в очередь
    	->toQueue(); // или save()
    ...
    # Достаем из очереди
    email()->sendFromQueue();
    // или более короткий вариант
    email()->saved();
    

    По-умолчанию, создаётся очередь (файл) с именем emails. Для создания другой очереди нужно просто передать в метод новое название.

    // Сохраняем письмо для менеджера
    email()...->save('for_manager'); // Письмо будет добавлено в очередь "for_manager".
    // Сохраняем письмо для администратора (очередь "for_admin"). 
    email()...->save('for_admin'); // Можно очистить старую очередь передав вторым параметром TRUE.
    ...
    // А в крон скрипте отсылаем письма
    email()->saved('for_admin');
    

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

    # is_mobile()

    За появление этой функции благодарим Константина Обухова. Думаю понятно, в чём ее суть — проверяет, страницу запросили с мобильного устройства или нет. При использовании шаблонизатора феном можно определять блоки

    {if is_mobile()}
        Mobile
    {else}
        Desktop
    {/if}
    
    

    # array_empty() и array_notempty()

    Эти функции проверяют, является ли указанная переменная массивом и, в одном случае, пустым, а в другом — не пустым.

    // Вместо
    if (!empty($var) && is_array($var)) {}
    // Пишем
    if (array_notempty($var)) {}
    

    # array_trim(), array_ltrim() и array_rtrim()

    Эти функции позволяют полноценно использовать trim функции для любых массивов. Функция является рекурсивной.

    $array = array(
        'key1' => '/    Value 1 ',
        'key2' => '  Value 2      /',
        'key3' => array(
            '       Sub Array Value 1    ', 
            '/  Sub Array Value 2/'
        )
    );
    // Указываем удаляемые символы. Если не указать, то будут удалены только пробелы.
    return array_trim($array, ' /');
    // Результат
    Array
    (
        [key1] => 'Value 1'
        [key2] => 'Value 2'
        [key3] => 'Array'
            (
                [0] => 'Sub Array Value 1'
                [1] => 'Sub Array Value 2'
            )
    )
    
    

    # explode_trim(), explode_ltrim() и explode_rtrim()

    Эти функции объединяют и расширяют работу двух функций — explode() и trim(). Третим параметром можно передать символы для удаления. Самый простой вариант использования, с которым часто многие сталкиваются, это пребразование строки с id в массив:

    $string = '1, 2, 3,4, 5';
    // По-умолчанию удаляются пробелы
    return explode_trim(',', $string); // Array(1,2,3,4,5)
    // С указанием символов
    $string = '/string1 /,    string2      /,/      string3';
    return explode_trim(',', $string, ' /'); // Array('string1','string2','string3')
    

    print_str()

    Работает также как и print_r(). Но ещё конвертирует переменную в строку и печатает или выводит её (вторым параметром нужно передать true). В качестве аргумента может быть строка, массив, объект, у которого определён метод toArray(). Массив оборачивается в тег pre. Кроме того, можно передать имя тега («p», «div» или «li») или шаблон, чтобы обернуть значение. Данная функция очень пригодится для отладки. Например, при выводе булевой переменной мы увидим не 1 или ничего, а «TRUE» и «FALSE». А в случае с неопределенной переменной будет выведено «NULL», а не пустое значение.

    $nullVar;
    $boolVar = true;
    $objectVar = $modx->user;
    $arrayVar = array(
    	'key1' => 'value1'
    	'key2' => 'value2'
    	'key3' => array(
    			'subkey1' => 'subvalue1',
    			'subkey2' => 'subvalue2',
    		)
    );
    $stringVar = 'Some text';
    
    # Погнали
    print_str($nullVar);   // Результат: 'NULL'
    print_str($boolVar);   // Результат: 'TRUE'
    print_str($objectVar); // Результат: <pre>
                           //                Array (
                           //                      [id] => 1
                           //                      [username] => 'admin'
                           //                      ...
                           //                )
                           //            </pre>
    
    print_str($arrayVar);  // Результат: <pre>
                           //                Array (
                           //                      [key1] => 'value1'
                           //                      [key2] => 'value2'
                           //                      [key3] => Array (
                           //                                      [subkey1] => 'subvalue1',
                           //                                      [subkey2] => 'subvalue2',
                           //                                )
                           //                )
                           //            </pre>
    print_str($stringVar); // "Some text"
    
    # Вывод через return
    return print_str($stringVar, true);
    
    # Оборачиваем вывод
    print_str('Строка, обёрнутая тегом div', false, 'div'); //<div>Строка, обёрнутая тегом div</div>
    // Если второй параметр FALSE, то его можно опустить
    print_str('Строка, обёрнутая тегом div', 'div'); //<div>Строка, обёрнутая тегом div</div>
    # Указываем шаблон для одноразового вывода
    print_str($stringVar, '<div style="color:red">[[+output]]</div>');
    

    Можно настроить постоянный шаблон для всех сообщений. Для этого нужно в системной настройке modhelpers.print_template указать желаемый шаблон. Например, такой шаблон

    // Переменная будет подставлена в плейсхолдер [[+output]]
    <div style="color:yellow;backgroud-color:darkblue;padding:10px">[[+output]]</div>
    

    будет выводить сообщения желтым цветом на синем фоне. Заметно и удобно для отладки.

    echo_nl()

    Добавляет к строке символ конца строки.

    echo_nl('Раз');
    echo_nl('Два');
    echo_nl('Три');
    // Результат:
    Раз
    Два
    Три
    

    parse()

    Функция аналогична методу modX::parseChunk(), только вместо имени чанка указывается строка. Т.е. как бы парсится инлайн-чанк.

    foreach($userArray as $user) {
        $output .= parse('<p>id: [[+id]]</p><p>Имя пользователя: [[+username]]</p>', $user);
        // С указанием собственных тегов
        //$output .= parse('<p>id: {{id}}</p><p>Имя пользователя: {{username}}</p>', $user, '{{', '}}');
    }
    

    str_starts()

    Проверяет, является ли указанная подстрока началом строки. Можно передавать массив подстрок. Третий параметр отвечает за регистронезависимость.

    $str = "Здравствуйте, дорогая редакция!";
    return str_starts($str, 'здр'); // TRUE
    # С учетом регистра
    return str_starts($str, 'здр', true); // FALSE
    # Несколько подстрок
    return str_starts($str, ['привет','здрасьте','здравств']); // TRUE
    

    str_ends()

    Аналогично предыдущей функции, только проверяется конец строки.

    $str = "Здравствуйте, дорогая редакция!";
    return str_ends($str, 'акция!'); // TRUE
    # С учетом регистра
    return str_ends($str, 'Редакция!', true); // FALSE
    # Несколько подстрок
    return str_ends($str, ['мама!','тёща!','ия!']); // TRUE
    

    str_contains()

    Проверяет, содержится ли указанная подстрока в исходной строке. Параметры аналогичны предыдущим функциям.

    $str = "Здравствуйте, дорогая редакция!";
    return str_contains($str, 'дорогая'); // TRUE
    # Несколько подстрок
    return str_contains($str, ['редакция','передача','прощай']); // TRUE
    

    str_match()

    Проверяет строку на соответствие паттерну регулярного выражения. В качестве модификатора любого символа можно использовать звёздочку (*). Третий параметр отвечает за регистр.

    $str = "А я милого узнаю по походке.";
    return str_match($str, '*милого*'); // TRUE
    return str_match($str, 'милого*'); // FALSE
    

    str_between()

    Возвращает подстроку, найденную между указанными тегами.

    $string = "My first name is [[+firstname]] and my last name is [[+lastname]]. ";
    // Жадный режим
    echo str_between($string,'[[+',']]'); // firstname]] and my last name is [[+lastname
    // Нежадный режим (ленивый)
    echo str_between($string,'[[+',']]', false); // firstname
    
    $string = "<p>Lorem ipsum <span>dolor</span> sit amet</p>";
    echo str_between($string,'<span>','</span>'); // dolor
    

    Заключение

    На этом всё. Для работы с сайтом и MODX добавлена всего одна функция — is_mobile(). Жаль, что специалисты по разработке сайтов на MODX не откликнулись на призыв вынести рутинные и часто используемые задачи в отдельные функции.

    22 марта 2017, 12:16   646     0

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

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

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