Странность с передачей параметра в сниппет
Добрый день, уважаемые коллеги!
Есть сниппет GET, который заполняет плейсхолдеры:
Если вызвать страницу с параметром id_doctor, например, классный.сайт/test?id_doctor=2, то всё чудесно работает и в $doctors попадают записи одного доктора. Однако, если вызвать страницу без параметра id_doctor, то, казалось бы, по умолчанию $id_doctor должен принять null и тогда должен быть вывод всех записей. Но ничего не выводится, так как каким-то образом отрабатывается $query->where(array('id' => $id_doctor)); в котором $id_doctor=null.
Проблема решается, если вызывать сниппет PrintTimeTable следующим способом:
Есть сниппет GET, который заполняет плейсхолдеры:
<?php
$prefix = $modx->getOption('prefix', $scriptProperties, '', true);
foreach ($_GET as $key => $value) {
$value = $modx->stripTags($value);
$modx->setPlaceholder($prefix . $key, $value);
}Есть другой сниппет PrintTimeTable, который вызывается следующим образом:[[!GET]]
[[!PrintTimeTable? &id_doctor=`[[!+id_doctor]]`]]Сниппет PrintTimeTable принимает и обрабатывает параметр id_doctor следующим образом:$id_doctor = $modx->getOption('id_doctor', $scriptProperties, null, true);
$query = $modx->newQuery('Doctors');
if ($id_doctor) {
$query->where(array('id' => $id_doctor));
}
$doctors = $modx->getCollection('Doctors', $query);Так вот вопрос.Если вызвать страницу с параметром id_doctor, например, классный.сайт/test?id_doctor=2, то всё чудесно работает и в $doctors попадают записи одного доктора. Однако, если вызвать страницу без параметра id_doctor, то, казалось бы, по умолчанию $id_doctor должен принять null и тогда должен быть вывод всех записей. Но ничего не выводится, так как каким-то образом отрабатывается $query->where(array('id' => $id_doctor)); в котором $id_doctor=null.
Проблема решается, если вызывать сниппет PrintTimeTable следующим способом:
[[!PrintTimeTable?
&id_doctor=`[[!+id_doctor:isempty=``]]`
]]либо таким способом:[[!PrintTimeTable?
&id_doctor=`[[!#GET.id_doctor]]`
]]Извращение какое-то))) В чем может быть проблема? Почему передача в параметры неопределенного плейсхолдера приводит к тому что $id_doctor в сниппете PrintTimeTable должен быть null, а не null? Комментарии: 4
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
не очень хороший. MODX будет крутить 10 циклов, чтобы распарсить этот пустой плейсхолдер. Если добавить фильтр (любой) в плейхолдер, то MODX сразу его распарсит согласно условию. Т.е. парсер выдаст значение плейсхолдера, а не сам плейсхолдер. Поэтому с фильтром isempty получилось.
Не понятно зачем нужен промежуточный сниппет GET. id_doctor можно выловить в сниппете PrintTimeTable, тогда и таких проблем не будет. А в чанках можно использовать феном.
Можно уточнить о каких 10 циклах идет речь? Если запрошенный плейсхолдер не задан, то есть отсутствует такой ключ в массиве плейсхолдеров, то где MODX его ищет еще?
Я не стал его весь выводить, так как он там еще разные необходимые вещи делает.
Например,
Я не спорю, что можно написать по-другому. Но вопрос не в этом, а в том, что не понятно, что происходит в принципе))))).
Замет в журнале логов проверить.
На странице пусто потому, что после 10 циклов MODX этот плейсхолдер удаляет. Но в сниппет он передается на второй итерации.
Спасибо.