Результаты одного сниппета в параметрах другого

С ModX только начинаю работать, поэтому есть некоторые непонятности…

Хочу в шаблоне последовательны вызвать 2 сниппета и в один из которых передать результаты другого. А конкретно:

[[!DetectUserRegion]]

[[getResources? &parents=`[[*id]]` &includeContent=`1` &where=`{«pagetitle:LIKE»:"[[!+DetectedRegion]]"}` &debug=`1`]]

Последовательность эта в ModX Revo не работает. Расследование мое показало, что в getResources попадает

$where = '{«pagetitle:LIKE»:"[[!+DetectedRegion]]"}'

Т.е. подстановка плейсхолдера в процессе вызова второго сниппета не происходит (как я подозреваю, плейсхолдеры подставляются в самом конце, при выводе страницы в броузер).

Главный вопрос, можно ли как-нибудь передать параметр во второй сниппет не вызывая его через runSnippet()?
Константин
03 января 2015, 17:59
modx.pro
3 561
0

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

Евгений Webinmd
03 января 2015, 21:30
0
вызывайте сниппет без знака плюс
[[getResources? &parents=`[[*id]]` &includeContent=`1` &where=`{«pagetitle:LIKE»:"[[!DetectedRegion]]"}` &debug=`1`]]
Да и кавычки у вас разные в условии
Еще попробуйте оба сниппета вызывать некешированными
    Константин
    03 января 2015, 21:46
    0
    По задумке, DetectedRegion — это не сниппет, а плэйсхолдер, получаемый из предыдущего сниппета, поэтому он идет с плюсом.

    Передать в сниппет не плейсхолдер, а результат другого сниппета напрямую я тоже пробовал — не получается.

    Создал специальный сниппет:

    <?php
    $fl = fopen('/var/tmp/new','w');
    fwrite($fl, $param);
    fclose($fl);

    И передаю туда

    ? &param=`[[!DetectUserRegion]]`

    в результате в файл записывается именно [[!DetectUserRegion]], а не результат выполнения.

    P.S. В оригинале с кавычками все Ok. Это они при посте поменялись.
    Василий Наумкин
    03 января 2015, 21:53
    0
    Если второй сниппет вызывается кэшированным, а первый нет — то он будет обработан раньше первого.

    Должно быть так:
    [[!DetectUserRegion]]
    
    [[!getResources?
    	&parents=`[[*id]]`
    	&includeContent=`1`
    	&where=`{"pagetitle:LIKE":"[[+DetectedRegion]]"}`
    	&debug=`1`
    ]]

    Ну и в сниппете DetectUserRegion, конечно, должно быть:
    $modx->setPlaceholder('DetectedRegion', 'Значение');
      Константин
      03 января 2015, 22:09
      0
      Огромное спасибо! Отключил кэширование в getResources и все заработало.

      Еще не подскажите, случайно, где можно прочитать про порядок подстановки чанков, сниппетов и т.д.? Обыскал рунет, но толком ничего не нашел… :(
      Сергей
      Сергей
      28 августа 2017, 10:36
      0
      Обновим тему))
      Вызываю вот так — все работает — почему? Судя из вышеприведенных постов, не должно работать…
      [[!pdoPage?
      	&element=`msProducts`
      	&includeThumbs=`360x270`
      	&limit=`4`
      	[[!sortPrice]]
      ]]
      сниппет sortPrice:
      $output = '&sortby=`id` &sortdir=`desc`';
         if ($_GET["sort"] == "price_up") $output = '&sortby=`Data.price` &sortdir=`asc`';
         if ($_GET["sort"] == "price_down") $output = '&sortby=`Data.price` &sortdir=`desc`';
       return $output;
        Василий Наумкин
        28 августа 2017, 12:06
        0
        Потому что MODX сначала разбирает вложенные теги и вставляет результат от них на место вызова.

        Вот и работает, хоть и говонокод.
          Сергей
          Сергей
          28 августа 2017, 17:15
          0
          А в чем *****код? нужно обосновать! скорость загрузки упадет? или повысится вероятность xss-атаки? В чем г-код???
            Василий Наумкин
            28 августа 2017, 17:25
            0
            Как минимум, нужно разобрать 2 тега вместо одного.

            Как максимум, потом подобный стиль приводит к такому (сегодня только в другом месте спрашивали)
            [[!pdoResources?
                    [[+parent:neq=``:then=`
                        &parents=`[[+parent]]`
                        &sortby=`menuindex`
                    `:else=`
                        &parents=`0`
                        &resources=`[[+resources]]`
                        &sortby=`FIELD(modResource.id, [[+resources]] )`
                    `]]
                    &showHidden=`1`
                    &sortdir=`ASC`
                    &depth=`0`
                    &limit=`[[+limit]]`
            	&tpl=`block_tag-row`
            	&includeTVs=`[[+image_type]],product_overview-label,content.tag`
            	&processTVs=`[[+image_type]],product_overview-label,content.tag`
            	&imageType=`[[+image_type]]`
            	[[!getUrlParam:neq=``:then=`&tvFilters=`content.tag===[[!getURLParam?&name=`tag`&max=`100`]]``? &name=`tag`]]
            	&useWeblinkUrl=`1`
            ]]

            Хотя всё это можно засунуть в один свой сниппет, из которого потом выдать
            <?php
            if (!empty($_GET['tag'])) {
                $scriptProperties['tvFilters'] = 'content.tag===' . preg_replace('#[^\w]#', '', $_GET['tag']),
            }
            // ... еще куча своей любой логики
            
            return $modx->runSnippet('pdoResources', $scriptProperties);
            И я это еще не самое страшное, что бывает. Когда смотришь чужой проект и пытаешься вникнуть, что происходит в подобном вызове — голова дымится.

            То, что система позволяет что-то делать, не говорит о том, что делать так — хорошо и правильно. Но вообще, лично мне пофиг, удачи в разработке сайтов.
              Сергей
              Сергей
              28 августа 2017, 18:30
              0
              Угу, ясно, 2 тега вместо одного, ок.
              Попутно — а что это за правило —
              '#[^\w]#'
              ?
                Сергей
                Сергей
                29 августа 2017, 23:39
                0
                А если так?
                В шаблоне категории:
                [[!DetectGet]]
                [[!pdoPage?
                	&element=`msProducts`
                	&sortby=`[[+DetectGetBy]]` &sortdir=`[[+DetectGetDir]]`
                ]]
                Сниппет DetectGet:
                //умолчальная сортировка по убыванию id
                $DetectGetBy = 'id';
                $DetectGetDir = 'desc';
                
                if (!empty($_GET['sort'])) {
                	if ($_GET["sort"] == "price_up") { //сортировка по возрастанию цены
                		$DetectGetBy = 'Data.price';
                		$DetectGetDir = 'asc';
                	}
                	if ($_GET["sort"] == "price_down") { //сортировка по убыванию цены
                		$DetectGetBy = 'Data.price';
                		$DetectGetDir = 'desc';
                	}
                }
                
                $modx->setPlaceholder('DetectGetBy', $DetectGetBy);
                $modx->setPlaceholder('DetectGetDir', $DetectGetDir);
                  Сергей
                  Сергей
                  30 августа 2017, 00:09
                  0
                  не пойму, плейсхолдеры [[+DetectGetBy]] и [[+DetectGetDir]] тоже вызывать некэшированными?
                    Сергей
                    Сергей
                    30 августа 2017, 12:10
                    0
                    чо там?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          12