andrei.balkin 16 февраля 2015 0 18
Нужна помощь, толи взгляд притупился. Не могу понять где ошибаюсь…
Пишу аякс компонент на основе GetResources и в параметрах шаблона хочу получить id подгружаемых ресурсов, для вывода галереи по простому мне нужен Id галереи для вывода фото. Проблема не могу корректно получить в данной конструкции [[+id]]

$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>
18 комментариев
Fi1osof1
Fi1osof 17 февраля 2015г в 08:52 #
А откуда у вас должен взяться [[+id]] и чей это айдишник?
Fi1osof1
Fi1osof 17 февраля 2015г в 08:58 #
И какое-то у вас хитрое смешение инлайн-чанка и чистого пхп (вызов $modx->runSnippet). Чтобы вы понимали, в array(«id» => '[[+id]]' будет передано не значение плейсхолдера [[+id]], а просто текст [[+id]], который кроме как текстом и не станет ничем. Тогда уж array(«id» => $modx->getPlaceholder('id'), вот только я очень сомневаюсь, что на тот момент +id уже будет зафиксирован. Если у вас там для каждого документа галерея в отдельности, то тогда уже и передавайте в шаблон [[!Gallery?album=`[[!getResourceField?id=`[[+id]]`]].........`........]]
a
andrei.balkin 17 февраля 2015г в 11:03 #
Доброго дня Николай. Спасибо за помощь.
Да в данном случае array(«id» => $modx->getPlaceholder('id') id еще не подгружен.
Такая конструкция [[!Gallery?album=`[[!getResourceField?id=`[[+id]]`]].........`........]] не работает через аякс.

Попробую объяснить что вообще хочу. У меня есть список ресурсов, которые нужно подгружать через аякс, после ввода в input фразы, часть фразы содержащей pagetitle ресурса. В общем с фильтрацией ресурсов по pagetitle.

Есть сниппет 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);
}


Есть 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>


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

$('div#findit_eaner input').livequery('change',function(){
     $x = $('div#findit_eaner input').val();
        $('div#findit_eaner input').replaceWith('<input class="input" data-action="getResources" data-tpl="hotelTpl" data-parents="100" data-ltr="'+$x+'" />');
    // Ajax post-запрос к странице, выдающей ресурсы (в ней сниппет ajaxResources) 
   
   $.ajax({
  async: false,
  url:"/find.php",
  type: "POST",
  data: $('div#findit_eaner input').data(), 
  success: function(data) {

 $('#input').append(data);
  }
  })
  
  })

Fi1osof1
Fi1osof 17 февраля 2015г в 12:00 #
Такая конструкция [[!Gallery?album=`[[!getResourceField?id=`[[+id]]`]].........`........]] не работает через аякс.
Почему это вдруг не работает? У вас в документе отрабатывается это или как? Что-то мне подсказывает, что совсем не в документе, а просто через MODX API, без инициализации modResponse и т.п. Создайте простой документ в контексте web, без шаблона, пропишите этот код туда и вызывайте его.
Fi1osof1
Fi1osof 17 февраля 2015г в 12:01 #
аякс обработчик
$('div#findit_eaner input').livequery('change',function(){
....
Вот это совсем не аякс обработчик. Это просто JS-код, который отправляет запрос на сервер. А обработчик на самом сервере уже. Вот и покажите код из find.php, если это не MODX-документ.
a
andrei.balkin 17 февраля 2015г в 12:07 #
Такая конструкция [[!Gallery?album=`[[!getResourceField?id=`[[+id]]`]].........`........]] не работает в @INLINE чанке она подгружается как тескт
Fi1osof1
Fi1osof 17 февраля 2015г в 12:13 #
не работает в @INLINE чанке она подгружается как тескт
Так значит это проблема уже инлайн-чанка. Скорее всего он не обрабатывается с рекурсивной вложенностью. Перенесите весь инлайн-код в отдельный чанк и указывайте в качестве параметра tpl чанк, а не интайл-шаблон.
a
andrei.balkin 17 февраля 2015г в 12:15 #
Вначале так и было, в том то и проблема что через аякс не работает, выводит вместо картинок код [[!Gallery? &album=`6`&thumbTpl=`hotelTplThumbtop`&limit=`1`]]
Fi1osof1
Fi1osof 17 февраля 2015г в 12:20 #
А нигде там в коде случайно нет прерывания die или exit?
Fi1osof1
Fi1osof 17 февраля 2015г в 12:21 #
А, ну кончно, if (!empty($res)) {
die($res);
} :)
Fi1osof1
Fi1osof 17 февраля 2015г в 12:24 #
А что тогда хотим? До конечного парсера не доходит. Вообще вот эта «фишка» с if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}, типа отрабатывать то как для аджакса, то как обычный документ — это конечно же та еще фигня. Не надо одно с другим смешивать.

P.S. Даже если die уберете, вряд ли заработает как положено, так как раз в getResources нормально это не отработалось (с отдельными id для каждого элемента цикла), то даже если все отработается, скорее всего везде будет одна и та же галерея. Все неправильно сделано.
a
andrei.balkin 17 февраля 2015г в 12:28 #
Что посоветуете? Как можно сделать, то что я хочу подскажите направление хотя бы
a
andrei.balkin 17 февраля 2015г в 12:22 #
я собственно и пошел путем замены tpl чанка, на интайл-шаблон, чтобы подгрузить твшник с номером альбома, т.к. иначе не обрабатывается сниппет
Fi1osof1
Fi1osof 17 февраля 2015г в 12:29 #
В общем, не напишу вам полного рабочего варианта, но вот можете глянуть эту статью, как пищу для размышлений.
a
andrei.balkin 17 февраля 2015г в 12:40 #
Спасибо, думаю поможет!
Fi1osof1
Fi1osof 17 февраля 2015г в 12:41 #
Пожалуйста!
a
andrei.balkin 17 февраля 2015г в 12:10 #
да вы правы не так выразился
a
andrei.balkin 17 февраля 2015г в 12:05 #
в find.php MODX-документ, там просто вызов сниппета ajaxResources

Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.