Странность с передачей параметра в сниппет
Добрый день, уважаемые коллеги!
Есть сниппет 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
Но ничего не выводится, так как каким-то образом отрабатывается $query->where(array('id' => $id_doctor)); в котором $id_doctor=null.Думаю, не совсем так. Даже совсем не так. Если MODX не может распарсить плейсхолдер, то он его возвращает. Т.е. получается $id_doctor='[[!+id_doctor]]'. Вообще ваш вариант
[[!PrintTimeTable? &id_doctor=`[[!+id_doctor]]`]]
не очень хороший. MODX будет крутить 10 циклов, чтобы распарсить этот пустой плейсхолдер. Если добавить фильтр (любой) в плейхолдер, то MODX сразу его распарсит согласно условию. Т.е. парсер выдаст значение плейсхолдера, а не сам плейсхолдер. Поэтому с фильтром isempty получилось.Не понятно зачем нужен промежуточный сниппет GET. id_doctor можно выловить в сниппете PrintTimeTable, тогда и таких проблем не будет. А в чанках можно использовать феном.
Если MODX не может распарсить плейсхолдер, то он его возвращает.В моем случае он возвращает пусто ''. Во всяком случае, когда я вывожу его значение на странице [[!+id_doctor]], то ничего не выводится.
MODX будет крутить 10 циклов, чтобы распарсить этот пустой плейсхолдер.Можно уточнить о каких 10 циклах идет речь? Если запрошенный плейсхолдер не задан, то есть отсутствует такой ключ в массиве плейсхолдеров, то где MODX его ищет еще?
Не понятно зачем нужен промежуточный сниппет GETЯ не стал его весь выводить, так как он там еще разные необходимые вещи делает.
Например,
if (!$_GET['services'] && isset($_GET['serv_group'])) {
$_GET['services'] = implode(",", $_GET['serv_group']);
$modx->setPlaceholder('services', $_GET['services']);
}
Я не спорю, что можно написать по-другому. Но вопрос не в этом, а в том, что не понятно, что происходит в принципе))))). В моем случае он возвращает пусто ''.Проверить можно просто. В сниппет PrintTimeTable перед return нужно добавить
$modx->log(1, $query->toSql()); // Сформированный sql запрос
$modx->log(1, $id_doctor);
Замет в журнале логов проверить.На странице пусто потому, что после 10 циклов MODX этот плейсхолдер удаляет. Но в сниппет он передается на второй итерации.
Да, действительно. Век живи — век учись))
Спасибо.
Спасибо.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.