We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 785
    • 2,113 Posts
    Как все-таки вызвать сниппет внутри другого, кэшировав оба вызова?
    Например, мне нужно вызвать UltimateParent внутри Wayfinder. По идее мне требуется вот это:
    [[Wayfinder? &startId=`[[UltimateParent]]`]]
    Но такой вызов не работает, и приходится делать так:
    [!Wayfinder? &startId=`[[UltimateParent]]`!]
    Этот вызов работает, но Wayfinder не кэшируется, и, соответственно, при каждой загрузке страницы идут лишние обращения к базе данных.
    Кстати,
    [[Wayfinder? &startId=`[!UltimateParent!]`]]
    тоже не работает.

    Кто-нибудь знает, как решить эту проблему?

    Пока вижу только один выход – написать третий сниппет, который будет вызывать непосредственно в коде UltimateParent и Wayfinder (через API), и кэшировать его вызов.
      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
      Статьи о MODx, регулярно новые публикации
      • 33694
      • 742 Posts
      Там у вас всё таки пример или действительно нужно вызвать UltimateParent внутри Wayfinder? В таком случае можно использовать [*parent*] вместо прямого вызова [[UltimateParent]].
        • 785
        • 2,113 Posts
        Пример. Кроме того UltimateParent нужен, если вложенность больше одного уровня. И для главных страниц разделов [[UltimateParent]] не совпадает с [*parent*] (последний равен нулю).
          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 33694
          • 742 Posts
          А как там PHx? Кешированию мешать не будет? Может с его помощью получилось бы (вплоть до оказа от вызова UltimateParent).
            • 785
            • 2,113 Posts
            Во-первых, слабо представляю себе, как это можно решить с помощью PHx, а во-вторых, описание сложного вызова PHx по трудозатратам (лично для меня) превосходит написание простого сниппета, вызывающего последовательно два нужных сниппета.
            Кроме того, вопрос не только о конкретном случае (хотя и о нем тоже), а вообще о вызове одного сниппета внутри другого.
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 785
              • 2,113 Posts
              Если никто не может предложить лучшего решения, то третий сниппет, который можно кэшировать и который вызывает два других, выглядит примерно так:

              <?php
              $startId = $modx->runSnippet('UltimateParent');
              $output = $modx->runSnippet('Wayfinder', array('startId'=>$startId));
              return $output;
              ?>
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации