Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Оум… Ну смотрите:

У вас, наверняка, или внутри тега head или перед закрывающим тегом body есть строчки в духе:
<script type="text/javascript" src="https://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript" src="scripts/masonry.js"></script>

<script type="text/javascript">
	$(document).ready(function(){ 
		$('#container').masonry(); //этим вы инициализируете ваш masonry скрипт
	});
	//здесь может быть еще код.
</script>
— в том месте, где написано «здесь может быть еще код», сразу после }); пишите:

$(document).on('mse2_load', function() {
	$('#container').masonry();
});
— ну и "$('#container').masonry();" нужно заменить на ваш вызов masonry, само собой.
docs.modx.pro/components/pdotools/ — на всякий случай.

По поводу ajaxa — делаю нечто похожее тут, можно запускать где-то внизу страницы сниппет с условием:
<?php
	if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_POST['action'])) {
		return;
	}
	
	if ($_POST['action'] == "название экшна в аяксе") {
		//ваши вызовы и операции
	}

	if (!empty($result)) {
		die(json_encode($result));
	}
— и отправлять аякс-запрос на ту же страницу, где вы и находитесь. После чего скриптами вставлять результат в нужное место.
Подробнее — тут (основы).
По поводу массе переменных — имелся ввиду пример, при котором сам сниппет, который передается в элемент — имеет массу своих входных переменных, которые нужно объявить в его вызове.

Что же до велосипеда… Ну, в целом — да, ваша правда.
Но в рамках pdoResources (при всех его преимуществах с позиции скорости и удобовводимости данных): на мой взгляд, говорить, что кто-то уже придумал запросы к базе данных и, поэтому, любые собственные запросы к бд — велосипед, это — перебор..)
… вы правда считаете чистый запрос на api — велосипедом?)

limit для pdoPage = кол-во результатов на страницу.
limit для сниппета = ограничение кол-во результатов, которые нужно разбить на страницы. (Пример: ТОП-100 популярных ресурсов, выводимых по 10 на страницу.)

Что же до element — через api, думаю, выйдет быстрее, да и не придется городить массу переменных непосредственно в вызове pdoPage.
Любой сниппет может принять любые входящие значения вида &params_N=`x`, но то, как они используются (и вообще, будут ли) напрямую зависит от кода приложения. Если вы пишите свой сниппет выборки, то вы можете указать в коде строки вида:
if empty($a) {
	$a = 1;
}
if empty($b) {
	$b = 0;
}
...->limit($a, $b);
— и, соответственно, если в вызове будут присутвовать свойства &a=`5` &b=`10` — они будут перекрывать их.

Что же конкретно до сниппетов pdoTools —
у них есть как параметр &limit, так и параметр &offset.

Подводя итоги: если вы хотите при помощи своего сниппета реализовать выборку и вывести все через pdoTools, то вам нужно получить список ресурсов своим сниппетом и внутри него запустить pdoTools с параметром &resources. Как-то вот так:

$limit = число;
		$offset = число
		$query = $modx->newQuery('modResource');
		$query->where(array(список_условий_для_выборки_вашего_сниппета));
		$query->select(array('modResource.id'));
		$query->limit($limit, $offset);

		if ($query->prepare() && $query->stmt->execute()) {
			//тут получаем и формируем циклом массив в строку $resources, перечисляющую id ресурсов выборки
		}

		$pdoOptions = array();
		$pdoOptions['limit'] = значение_лимита_для_пдо;
		$pdoOptions['offcet'] = значение_оффсета_для_пдо; //в теории, эти строки не слишком нужны, т.к. уже можно ограничить до нужного размера результат при получении из бд
		$pdoOptions['resources'] = $resources;

		return $modx->runSnippet('pdoPage', $pdoOptions);
Не за что.)

Вообще, в этом примере я предлагал подставить его в уже существующий сниппет, формирующий урл.
Если использовать как отдельный — то можно вызывать его в шаблоне со страницей формы где-нибудь в самом низу, и обернуть все в условие:

if(isset($_POST['submit'])) {
	(код проверки)
}
else {return;}
Ну и редирект и die тоже обернуть в условие, что кол-во get-переменных не нулевое.
Если через get-параметр стороннего сниппета, формируя ссылку для редиректа на страницу с mFilter, то как-то так (в сниппете, где формируется строка):

$parametrs = array();

if(isset($_GET[название_параметра1])) {
	$parametrs[ключ_переменной] = $_GET[название_параметра1]; 
	// Пример: если нужно передать в строку power=9, то ключ переменной - power
}
//повторяем столько раз, сколько значений из сниппета теоретически можно получить

$pageId = "айди страницы с фильтрами";
$url = $modx->makeUrl($pageId, '', '', 'full');

if (!empty($parametrs)){
	foreach($parametrs as $key => $value){
		if ($firstItemExist == 1) {
			$urlParametrs .= "&" . $key . "=" . $value;
		}
		else {
			$urlParametrs = "?" . $key . "=" . $value;

			$firstItemExist = 1;
		}	
	}
}


$redirectLink = $url . "/" . $urlParametrs;
header('Location: '.$redirectLink);
die();
Ммм… Тогда единственное решение — добавить скрытое поле в чанки outer'ов, которое будет переключать методы обновления и подцеплять его значение в скрипт на требуемые события miniShop2.Cart (change, status, remove, clean и так далее).

А дальше, когда значение уже передастся в класс-обработчик — выставить простое if/else-условие там, где определяются чанки.