Как вызвать mFilter2 через runSnippet с помощью API MODX ?
Здравствуйте, подскажите пожалуйста, я вызываю mFilter2 через MODX API, ну и к тому же это всё работает через ajax. То есть вот как всё происходит:
Есть ajax запрос:
$(".SectionContent").empty();
$(".SectionContent").append(msg);
Но вот проблема в том, что фильтры теперь не работают после этого. Подскажите пожалуйста как сделать так что бы когда мы вызываем mFilter2 через ajax, и получаем html с фильтрами, сами фильтры работали?
Просто вот кстати что я заметил, когда я выбираю какой либо фильтр, после того как получил html и вставил его на страницу с помощью ajax. Сам Ajax запрос от mFilter2 отправляется и соответственно ответ получаю см. скриншот «ajax запрос», но он не вставляется на страницу и вот пагинация тоже, у меня стоит параметр 'ajaxMode' => 'button', а в итоге получаются пагинация цифрами, а должна быть кнопкой. Ну и в итоге данная проблема только когда я используя ajax и API MODX-а для вызова mFilter2. Когда он просто вызывается в ресурсе таким вот образом [[!mFilter2… ]] всё в порядке.
Подскажите пожалуйста что тут можно сделать, заранее благодарю за внимание и ответ.
Есть ajax запрос:
$.ajax({
type: "POST",
url: 'assets/template/php/action.php',
dataType: 'html',
data:{"objectID":IdElem}, //Тут передаю ID ресурса на сервер
success:function(msg) {
$(".SectionContent").empty();
$(".SectionContent").append(msg);
}
});
А на сервере вот такой обработчик:define('MODX_API_MODE', true);
require_once($_SERVER['DOCUMENT_ROOT'].'/index.php');
$modx=new modX();
$modx->initialize('web');
/* include MODX_API END */
$IDResureses = $_POST["objectID"];
$parametrArray = array(
'suggestions' => '',
'class' => 'msProduct',
'element' => 'msProducts',
'limit' => '8',
'sort' => 'ms_vendor|Id:asc',
'parents' => $IDResureses,
'tplOuter' => 'mSearch2_blockElement2',
'tpls' => 'tpl.msProducts.row2',
'includeTVs' => 'fileDowl,Proiz',
'includeThumbs' => 'medium',
'filters' => 'ms|vendor:vendors',
'tplFilter.outer.ms|vendor' => 'tpl.mFilter2.filter.outerMain',
'tplFilter.row.ms|vendor' => 'tpl.mFilter2.filter.checkboxMain',
'ajaxMode' => 'button',
'CurrentID' => $IDResureses, //Это я добавил параметр в mFilter2 в него передаю ID ресурса который пришел из ajax
);
$output = $modx->runSnippet('mFilter2My',$parametrArray); //И сделал копию mFilter2 только с именем mFilter2My
$modx->getParser()->processElementTags('', $output, false, false, '[[', ']]', array(), 10);
$modx->getParser()->processElementTags('', $output, true, true, '[[', ']]', array(), 10);
$modx->log(1, print_r($output, 1));
echo $output;
Ну добавил в mFilter2 только по сути одно условие вот оно:if (!empty($CurrentID)) {$modx->setPlaceholder('AjaxId',$CurrentID);}
И потом вот после того как php выполнился, получаю вот такую вот разметку, это код чанка 'tplOuter' => 'mSearch2_blockElement2', но соответственно вместо плейсхолдеров и всего остального я получаю html соответствующий:<div class="msearch2" id="mse2_mfilter">
<div class="row" id="filterBlock">
<div class="col-md-12 main-filter-Config">
<ul class="nav nav-pills nav-justified" id="myTab" role="tablist">
<li class="nav-item checkElemBefore">
<a class="witdhElement nav-link active" title="Фильтр по производителю" id="fabr-tab" data-toggle="tab" href="#fabr" role="tab" aria-controls="fabr" aria-selected="true">Производитель <span class="count-check-checkElem1 disNon">(<span class="elemcheck currentCheck-checkElem1"></span> из <span class="elemcheck allCheckbox-checkElem1"></span>)</span></a>
</li>
</ul>
<div class="main-line-default"></div>
<form action="[[+AjaxId]]" method="post" id="mse2_filters">
<div class="resultQuery tab-content" id="pills-tabContent">
[[+filters]]
</div>
[[+filters:isnot=``:then=`
<button type="reset" class="restartBtn btn btn-default hidden">[[%mse2_reset]]</button>
<button type="submit" class="btn btn-success pull-right hidden">[[%mse2_submit]]</button>
<div class="clearfix"></div>
`]]
</form>
</div>
</div>
<div class="informationBlock"></div>
<div class="row gridElementShop">
<div class="col-md-12 Arraycollection">
<div id="mse2_results" class="contentBlock row">
[[+results]]
</div>
<div id="pdopage" class="mse2_pagination">
[[!+page.nav]]
</div>
</div>
</div>
</div>
Вся вот эта разметка возвращается с сервера и я с помощью Jquery вставляю полученный html в блок$(".SectionContent").empty();
$(".SectionContent").append(msg);
Но вот проблема в том, что фильтры теперь не работают после этого. Подскажите пожалуйста как сделать так что бы когда мы вызываем mFilter2 через ajax, и получаем html с фильтрами, сами фильтры работали?
Просто вот кстати что я заметил, когда я выбираю какой либо фильтр, после того как получил html и вставил его на страницу с помощью ajax. Сам Ajax запрос от mFilter2 отправляется и соответственно ответ получаю см. скриншот «ajax запрос», но он не вставляется на страницу и вот пагинация тоже, у меня стоит параметр 'ajaxMode' => 'button', а в итоге получаются пагинация цифрами, а должна быть кнопкой. Ну и в итоге данная проблема только когда я используя ajax и API MODX-а для вызова mFilter2. Когда он просто вызывается в ресурсе таким вот образом [[!mFilter2… ]] всё в порядке.
Подскажите пожалуйста что тут можно сделать, заранее благодарю за внимание и ответ.
Комментарии: 4
mFilter2 — очень мощный и умный компонент. Если вам приходится городить какие-то костыли поверх него, то 100% вы что-то делаете неправильно. Либо структура проекта выбрана не верно, либо вы не знаете возможностей компонента, либо еще что.
Поэтому
Поэтому
Подскажите пожалуйста что тут можно сделать, заранее благодарю за внимание и ответ.Совет — пересмотрите всю логику проекта и сделайте по-нормальному
Понял, благодарю Вас за ответ. А Вы не могли бы подсказать пожалуйста, вот как тогда лучше сделать. На сайте есть меню, и ниже этого меню фильтры, по умолчанию у нас в меню выбрана «плитка» и вот на скриншоте ниже самого меню, можно увидеть фильтры предназначены для раздела плитка.

Тут уже всё работает, так как вызвано в самом ресурсе уже.
Но так же вот есть другой пункт «Сантехника и мебель» у этого раздела должен быть фильтр по производителю только. И я вот думал сделать так, вот когда происходит нажатие на пункт меню «Сантехника и мебель» отправляется ajax запрос на сервер, сервер в свою очередь отвечает тем, что присылает фильтр и товары, и далее мы уже фильтруем. Подскажите пожалуйста, может лучше как то по другому тогда делать?

Тут уже всё работает, так как вызвано в самом ресурсе уже.
Но так же вот есть другой пункт «Сантехника и мебель» у этого раздела должен быть фильтр по производителю только. И я вот думал сделать так, вот когда происходит нажатие на пункт меню «Сантехника и мебель» отправляется ajax запрос на сервер, сервер в свою очередь отвечает тем, что присылает фильтр и товары, и далее мы уже фильтруем. Подскажите пожалуйста, может лучше как то по другому тогда делать?
1) Не заморачиваться делать всё на одной странице, а сделать обычным меню с переходом в нужный раздел. Если всё сделано хорошо, то загрузка страницы будет быстрой и никто ничего не заметит.
2) Почитать документацию к mFilter еще несколько раз и попробовать сделать это меню не меню, а тоже элементами фильтра, и отключить показ неактивных фильтров, в целом должно сработать.¯\_(ツ)_/¯
2) Почитать документацию к mFilter еще несколько раз и попробовать сделать это меню не меню, а тоже элементами фильтра, и отключить показ неактивных фильтров, в целом должно сработать.¯\_(ツ)_/¯
Понятно, благодарю Вас за ответ. Первый вариант скорее всего использовать буду)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.