Введение
Оригинал: http://bobsguides.com/blog.html/...Метод $modx->getOption() — необходимая вещь при разработке под MODX. И в этом небольшом руководстве я расскажу о том, для чего этот метод нужен и как его использовать.
Использование getOption() для настроек
Часто getOption используется для получения значения настроек системы:
$value = $modx->getOption('имя настройки');
Если настройка найдена, переменная $value будет содержать её значение, иначе — NULL. Но что делать, если нужно использовать какое-то значение по умолчанию, если настройка не найдена?
$value = $modx->getOption('имя настройки', null, 'значение по умолчанию');
Данный код вернёт значение настройки системы. Если настройка не найдена, переменная $value будет содержать значение по умолчанию. Отлично, но что делать, если настройка найдена, но её значение пустое? Код выше вернёт пустую строку. Конечно, можно каждый раз проверять возвращаемое значение, но есть более простое решение.
Существует малоизвестный четвёртый аргумент для getOption, называемый $skipEmpty. Это логическая переменная. Если она установлена в значение true, метод будет возвращать значение по умолчанию, если настройка не существует или содержит пустое значение. Ну, не классно ли?
$value = $modx->getOption('название настройки', null, 'значение по умолчанию', true);
Если PHP считает переменную, содержащую 0, пустой, то getOption так не делает, что вполне разумно по отношению к настройкам системы. Если значение четвёртого параметра равно true, а настройка существует и её значение равно 0, то getOption вернёт 0, а не значение по умолчанию. Если же значение настройки действительно пустое, будет возвращено значение по умолчанию, даже если настройка существует.
Возможно, вас удивило то, что в качестве второго аргумента мы передали null. Вообще, getOption может быть использован для поиска значений в любом массиве, например, $scriptProperties. Именно массив, в котором производится поиск, и передаётся в качестве второго параметра. Если значение второго параметра равно null, то поиск производится в настройках MODX.
Настройки?
На самом деле, метод getOption() будет проверять все настройки пользователя, настройки пользовательских групп, настройки контекста и настройки системы (именно в этом порядке). Но не думайте, что каждый раз getOption обходит все эти 4 области настроек. Дело в том, что каждый раз, когда запускается MODX, создаётся один комплексный массив настроек. Сначала запрашиваются настройки системы. Затем поверх настроек системы записываются настройки контекста. Поверх полученного массива записываются настройки пользовательских групп, и то же самое происходит с настройками пользователя.
Настройки для основной группы пользователя имеют больший приоритет над остальными настройками группами пользователя. Если настройка отсутствует для основной группы, но присутствует в остальных группах, то будет выбрана настройка у группы с наименьшим порядковым номером (rank).
Использование getOption() при написании сниппетов
Когда вы передаёте параметры в сниппет, они становятся доступными через массив $scriptProperties. И для их получения часто используется метод getOption, так как он позволяет значительно сократить код сниппета без потери функционала.
Ниже изображён пример сниппета без использования getOption.
$defaultCount = 10;
if (isset($scriptProperties['count'])) {
if ($scriptProperties['count'] === '0') }
$count = 0;
} elseif (!empty($scriptProperties['count'])) {
$count = $scriptProperties['count']
} else {
$count = $defaultCount;
}
} else {
$count = $defaultCount;
}
Этот код можно написать по-разному, но суть остаётся той же — код сниппета избыточен. Страшно представить, как увеличится код, если параметров сниппета будет больше. А теперь фокус — код ниже делает абсолютно то же самое:
$count = $modx->getOption('count', $scriptProperties, 10, true);
Другие массивы
Метод getOption() также может быть использован для работы с любыми простыми ассоциативными массивами. Достаточно передать массив в качестве второго аргумента. Разберём пример ниже:
$a = array(
'color1' => 'Белый',
'color2' => 'Синий',
'color3' => 'Красный',
);
$color1 = $modx->getOption('color1', $a, 'Серый');
$color2 = $modx->getOption('color2', $a, 'Серый');
$color5 = $modx->getOption('color5', $a, 'Серый');
В коде выше создаётся массив, а также три переменные со значениями Белый, Синий и Красный. Но что, если ключами массива являются числа, а не строки? Такой вариант тоже работает:
$a = array(
1 => 'Белый',
2 => 'Синий',
4 => 'Красный',
);
$color1 = $modx->getOption('1', $a, 'Серый');
$color2 = $modx->getOption('2', $a, 'Серый');
$color5 = $modx->getOption('5', $a, 'Серый');
Обратите внимание, что в примерах выше первый аргумент всегда заключается в кавычки. Запомните — первый аргумент всегда должен быть строкой. That argument must *always* be a string. It doesn't seem like it should work, but it does because of PHP's loose typing of variables. Если первый аргумент не является строкой (внутри метода есть проверка is_string):
$color1 = $modx->getOption(1, $a, 'Серый');
Ещё об использовании getOption
getOption также удобно использовать для работы с глобальными массивами, такими как $_GET, $_POST, $_SERVER, $_SESSION и пр. Это решает проблему проверки переменной на существование. Несколько примеров:
$option = $modx->getOption('secret_key', $_SESSION, null);
$option = $modx->getOption('product_id', $_GET, 0);
$option = $modx->getOption('user_email', $_POST, '', true);
На этом не всё
Есть действительно малоизвестная (и редко используемая) возможность этого замечательного метода: в качестве первого параметра можно передать массив.
$a = array(
1 => 'Red',
2 => 'Blue',
4 => 'Green',
);
$colors = $modx->getOption(array('1','2','5', $a, 'Gray'));
Данный код вернёт такой массив:
Array (
[1] => Red
[2] => Blue
[5] => Gray
)
Если первым аргументом является массив, то метод getOption будет рекурсивно вызываться для каждого элемента и составлять результирующий массив. Мне не приходилось видеть применение этой возможности, так как второй аргумент обычно уже содержит необходимую информацию. Кстати, ключи оригинального массива сохранены не будут.
На этом всё, спасибо за внимание.
Воеводский Михаил 16.04.2015 21:39 #