Повторное использование переменной после вызова сниппета

Добрый день!

Как хранить на странице и использовать значение, переданное от сниппета.
Сниппет выбирает произвольный (rand) дочерний объект родителя, поэтому его лучше вызвать один раз.
Но переданное значение используется в нескольких местах на странице.
Nikita Oralov
24 марта 2018, 13:50
modx.pro
1 134
+1

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

    Nikita Oralov
    24 марта 2018, 18:53
    0
    Сниппет вызывается на странице некэшируемо. В этом случае он выдаёт разные id. Но getImageList его не видит.

    И наоборот кэшируемый вызов. GetImageList тогда видит значение, но это значение не рандомное.

    [[!getChildsOne]]
    
            <div class="tab-content" id="myTabContent">
                <div class="tab-pane fade show active" id="land" role="tabpanel" aria-labelledby="home-tab">
                    <!-- галерея masonry -->
                    <div class="grid">
                        [[getImageList?
                            &tvname=`album-photo`
                            &limit=`20`
                            &docid=`[[+album-land]]`
                            &tpl=`@CODE: 
                                <div class="grid-item">
                                    <div class="wrapper">  
                                        <a href="#" data-toggle="modal" data-target="#photo-modal">
                                            <img src="assets/photos/[[+photoTV]]">
                                        </a>
                                        <div class="some-text">
                                           [[+desc]]
                                        </div>
                                    </div>
                                </div>
                            `
                        ]]
                    </div>
                </div>

    Сниппет getChildsOne

    <?php
    $query = $modx->newQuery('modResource', array('parent' => 12, 'deleted' => false, 'published' => true));
    $children = $modx->getCollection('modResource', $query);
    $input = array();
    $resourceId = "";
    
    foreach ($children as $child) {
      $resourceId = $child->get('id');
      array_push($input, $resourceId);
    }
    
    $i = array_rand($input, 1);
    $out = $input[$i];
    $modx->setPlaceholder('album-land',$out);
    
    return;
      Павел Романов
      24 марта 2018, 19:24
      0
      Попробуйте некешированный плейсхолдер и я бы убрал шаблон в чанк:
      [[!getImageList?
      &tvname=`album-photo`
      &limit=`20`
      &tvname=`album-photo`
      &docid=`[[!+album-land]]`
      &tpl=`grid-item`
      ]]

      Либо формируйте вызов в самом сниппете, заодно можно упростить:
      <?php
      //Получаем рандомный ID
      $input = array();
      foreach ($modx->getIterator('modResource', array('parent' => 12, 'deleted' => false, 'published' => true)) as $resource) {
      	$input[] = $resource->get('id');
      }
      $i = array_rand($input, 1);
      
      // Вызываем getImageList
      $out = $modx->runSnippet('getImageList', array(
      	'limit' => 20,
      	'tvname' => 'album-photo',
      	'docid' => $input[$i],
      	'tpl' => 'grid-item'
      ));
      
      // Помещаем вызов в плейсхолдер "album"
      $modx->setPlaceholder('album',$out);
      return;

      Ну а на странице:
      [[!getChildsOne]]
      
      <div class="tab-content" id="myTabContent">
      	<div class="tab-pane fade show active" id="land" role="tabpanel" aria-labelledby="home-tab">
              	<!-- галерея masonry -->
              	<div class="grid">
                          [[+album]]
                      </div>
      	</div>
      </div>
        Nikita Oralov
        24 марта 2018, 20:51
        0
        благодарю, Павел!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4