Странность с передачей параметра в сниппет

Добрый день, уважаемые коллеги!
Есть сниппет 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?
Дмитрий
24 апреля 2017, 11:28
modx.pro
1 029
0

Комментарии: 4

Сергей Шлоков
24 апреля 2017, 16:40
+1
Но ничего не выводится, так как каким-то образом отрабатывается $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, тогда и таких проблем не будет. А в чанках можно использовать феном.
    Дмитрий
    24 апреля 2017, 18:19
    0
    Если 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']);
    }
    Я не спорю, что можно написать по-другому. Но вопрос не в этом, а в том, что не понятно, что происходит в принципе))))).
      Сергей Шлоков
      24 апреля 2017, 18:31
      +2
      В моем случае он возвращает пусто ''.
      Проверить можно просто. В сниппет PrintTimeTable перед return нужно добавить
      $modx->log(1, $query->toSql()); // Сформированный sql запрос
      $modx->log(1, $id_doctor);
      Замет в журнале логов проверить.
      На странице пусто потому, что после 10 циклов MODX этот плейсхолдер удаляет. Но в сниппет он передается на второй итерации.
        Дмитрий
        25 апреля 2017, 12:08
        0
        Да, действительно. Век живи — век учись))
        Спасибо.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4