We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 49900
    • 6 Posts
    Добрый день. Нужна помощь. Помогите разобраться. Пишу сниппет для подгрузки ресурсов через аякс на основе GetResources. Не могу понять в чем ошибка, а именно не подгружается [[+id]] во втором случае в сниппет getResourceField. Когда ставлю вместо плейсолдера [[+id]] - id ресурса содержащего нужный тв-параметр выводит отлично. Голову сломал - в чем моет быть трабл

    // Новые параметры сниппета в AJAX запросе
            $params = array();
         
            $params['tpl'] = '@INLINE <div id="[[+id]]" class="pic">[[+idx]]</div>
        <div class="item">
           <span class="title">Гостиница [[+pagetitle]]</span>
            <div class="foto">'. 
    $modx->runSnippet("Gallery", array("album" => $modx->runSnippet("getResourceField", 
    array("id" => '[[+id]]', "field" =>"GalleryAlbum", "isTV" =>"1")) , 
    "thumbTpl" => "hotelTplThumbtop","limit" => "1")).' 
                </div>'
    
    ...
      • 49529
      • 196 Posts
      Использование плейсхолдеров modx ( [[+id]] ) возможно в шаблонах или чанках, но не в сниппетах. Грубо говоря, все, что в "двойных квадратных скобочках" не имеет смысла писать в сниппетах, поскольку это чистый php-код, а в php нет никаких "[[+id]]".

      array("id" => '[[+id]]'

      - этот код не имеет смылсла, поскольку [[+id]] не распарсится в реальный ID внутри сниппета.

      Если вам нужно внутри php получить id текущего ресурса (того, на котором сниппет запущен), то вместо [[+id]] надо писать
      $modx->resource->get('id')

      или шорткат
      $modx->resource->id


      Просветляющая статья на английском о том, как работать с данными MODX через php.

      Опишите подробнее, что вы пытаетесь сделать.
        • 49900
        • 6 Posts
        Спасибо за ответ. Но мне нужно как раз таки не id текущего ресурса (того, на котором сниппет запущен), а id ресурсов подгружаемых сниппетом GetResources через аякс, если без аякс то проблем таких нет, ресурсов может быть неопределенное количество для каждого нужно подхватить id. Я думал возможно есть подобный синтаксис для получения параметров подгружаемых именно ресурсов $modx->resource->id

        Вообще делаю отбор ресурсов по Pagetitle - при вводе в input - вся проблема в том что в чанк подгружаемых ресурсов содержит сниппет Галереи, у которой разумеется свои чанки, которые через аякс не подгружаются - вот пришел к мысли что нужно чанк шаблона подключать @INLINE и к нему подрубать подгрузку сниппета, но видимо так тоже не выйдет...

        А что о статье - таки и на русском полно подобных..


          • 49529
          • 196 Posts
          Вам будет сложно сделать это на стандартном getResources.
          Вот код, который получает список ID ресурсов по pagetitle:

          $resources = $modx->getIterator('modResource', array(
              'pagetitle' => $ваш_pagetitle
          ));
          
          foreach ($resources as $res) {
              $output .= $res->get('id');
          }
          


          В цикле foreach можно что угодно делать с полученными результатами. Хотите, собирайте список ID и вызывайте getResourcs через runSnippet(). Хотите, прямо здесь запускайте getChunk() для каждого.

          Если вы что-то подгружаете через AJAX, значит страница уже загрузилась, шаблонизатор отработал и все содержимое [[]] распарсилось в голый HTML, все плейсхолдеры заменены на свои фактические значения. Получить что-то от MODX через AJAX можно только через API.
            • 49900
            • 6 Posts
            Ну немного иначе мне нужно как это увязать может подскажете увидев весь код

            Есть сниппет ajaxResources
            <?php
            if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}
            
            $action = filter_input(INPUT_POST,'action');
            
            if (empty($action)) {return;}
            
            $res = '';
            switch ($action) {
                  case 'getResources': 
                    $params = array();
                    $params['tpl'] = '@INLINE <div id="[[+id]]" class="pic">[[+idx]]</div>
                <div class="item">
                   <span class="title">Гостиница [[+pagetitle]]</span>
                    <div class="foto">'. $modx->runSnippet("Gallery", array("album" => $modx->runSnippet("getResourceField", array("id" => [[+id]], "field" =>"GalleryAlbum", "isTV" =>"1")) , "thumbTpl" => "hotelTplThumbtop","limit" => "1")).' </div>
                     <div class="inf">
                    <span class="adress">Адрес: [[+tv.adress]]</span><div class="clear"></div>
                    <span class="metro">[[+tv.metro_vo]]</span><div class="clear"></div>
                    <span class="metro">[[+tv.metro_p]]</span><div class="clear"></div>
                    <a class="grey" href="/[[+alias]]/">О гостинице</a>
                    <a class="blue" href="/">Номера</a>
                    <a class="blue" href="/">Цены</a><div class="clear"></div>
                    <p class="trans">[[+introtext]] </p>
                </div>
                <div class="buttons">
                    <span class="price">От [[+tv.min_price]] руб/сутки</span><div class="clear"></div>
                    <a class="onmap"><img src="images/onmap.png"/> Показать на карте</a>
                    <a class="buy" href="/"><img src="images/buy.png"/> Забронировать</a>
                    <a class="show"><img src="images/show.png"/> Раскрыть</a><div class="clear"></div>
                </div>
            
            </div>
            <div class="clear"></div>';
                    $ltr = filter_input(INPUT_POST,'ltr');
                    $params['where'] = '{"pagetitle:LIKE":"%'.$ltr.'%"}';
                    $params['includeTVs'] = '1';
                    $params['processTVs'] = '1';
                    $params['parents'] = filter_input(INPUT_POST, 'parents', FILTER_SANITIZE_NUMBER_INT);
                    $res = $modx->runSnippet('getResources', $params);  break;
            }
            if (!empty($res)) {
                die($res);
            }



              • 49900
              • 6 Posts
              Есть input

              <input id="findit" class="input" onfocus="if(this.value=='Поиск гостиницы по названию') this.value='';" onblur="if(this.value=='') this.value='Поиск гостиницы по названию';" value="Поиск гостиницы по названию" data-action="getResources" data-tpl="hotelTpl" data-parents="100" data-ltr=""/>
              <div id="input"></div>



              аякс обработчик

              $('#findit').livequery('change',function(){
                   $('#findit').attr('data-ltr', $('#findit').val());
              
                  // Ajax post-запрос к странице, выдающей ресурсы (в ней сниппет ajaxResources) 
                 
                 $.ajax({
                async: false,
                url:"/find.php",
                type: "POST",
                data: $('#findit').data(), 
                success: function(data) {
              
               $('#input').append(data);
                }
                })
                
                })
                • 49529
                • 196 Posts
                При таком подходе нагрузка будет дикая. Ваш ajaxResources прожорлив, а вы собираетесь вызывать его на каждую введенную букву, если я правильно понял. В общем-то заставить это работать несложно, достаточно вынести весь инлайновый HTML в отдельный чанк. При этом
                $modx->runSnippet("Gallery", array("album" => $modx->runSnippet("getResourceField", array("id" => [[+id]], "field" =>"GalleryAlbum", "isTV" =>"1")) , "thumbTpl" => "hotelTplThumbtop","limit" => "1"))

                превратится в
                [[Gallery?
                    &album=`[[+tv.GalleryAlbum]]`
                    &thumbTpl=`hotelTplThumbtop`
                    &limit=`1`
                ]]
                

                Поскольку чанк - это не php, плейсходлеры в нем имеют смысл.
                  • 49900
                  • 6 Posts
                  Вначале так и было, в том то и проблема что через аякс не работает, выводит вместо картинок код [[!Gallery? &album=`6`&thumbTpl=`hotelTplThumbtop`&limit=`1`]]

                  я уже выяснил что все изначально конечно неверно. Подскажите направление как сделать, чтобы работало через input.

                  Советуют почитать тут http://modxclub.ru/topics/ajax-katalog-na-praktike-1258.html

                  Пока не пойму куда копать [ed. note: andrei.balkin last edited this post 9 years, 3 months ago.]
                    • 49900
                    • 6 Posts
                    А насчет нагрузки, ну без галереи все летает, проблема в галереи она не подгружается если бы не этот факт все бы устраивало. Каталог будет не огромный