Андрей

Андрей

Был в сети 25 июня 2026, 01:11
Заказы принимаю
Василий Столейков
Василий Столейков
1
+1
Да нет, вызываю сниппет на той же странице что и форма, а форму посылаю на саму себя через POST. А сниппет уже редиректит на ту страницу, которая указана в скрытом поле pageId у формы:
<form class="form-horizontal col-xs-12" action="[[~[[*id]]]]" method="post">
    <input type="hidden" value="35" name="pageId">

Сниппет:
<?php
if(isset($_POST['pageId'])) {
    $pageId = $_POST['pageId'];

    // тут нужно перечисляем все нужные нам GET параметры
    $parametrs = array();
    if(isset($_POST['country']) && !empty($_POST['country'])) {$parametrs[country'] = $_POST['country'];}
    
    // создаём из них ссылку
    if (!empty($parametrs)){
    	foreach($parametrs as $key => $value){
    		if ($firstItemExist == 1) {
    			$urlParametrs .= "&" . $key . "=" . $value;
    		}
    		else {
    			$urlParametrs = "?" . $key . "=" . $value;
    			$firstItemExist = 1;
    		}	
    	}
    }
    
    $url = $modx->makeUrl($pageId, '', '', 'full');
    $redirectLink = $url.$urlParametrs;

    header('Location: '.$redirectLink);
    die();
    
}
else {return;}
Максим
Максим
8
+2
Может быть кому-то пригодится простенький сниппет для вызова mFilter2, который дописывает в параметр filters имена назначенных для категории опций — эти опции выводятся в фильтре чекбоксами:
<?php
$catid = $modx->resource->id;
$q = $modx->newQuery('msCategoryOption');
$q->select(array(
    'msCategoryOption.category_id',
    'msCategoryOption.option_id',
    'mso.key'
    ));
$q->where(array(
    'msCategoryOption.category_id' => $catid
    )
    );
$q->leftJoin('msOption','mso','msCategoryOption.option_id = mso.id');
$q->prepare();
$q->stmt->execute();
$options = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
$_options = array();
foreach ($options as $option) {
    $_options[] = 'msoption|'.$option['key'];
}
$_options = implode(',',$_options);
$scriptProperties['filters'] = implode(',',array($scriptProperties['filters'],$_options));
return $modx->runSnippet('mFilter2',$scriptProperties);
Василий Наумкин
Василий Наумкин
4
0
Условия в виде массива в msProducts не принимаются, потому что он ожидает их всегда в виде JSON. Придётся так и указывать:
{$_modx->runSnippet('!msProducts', [
    'parents' => 3,
    'sortby' => '{
        "Data.new": "desc",
        "msProduct.editedon": "desc"
    }',
    'includeThumbs' => '150x150',
    'where' => '{
	"Data.price:>=": 0
    
    }',
    'limit' => 4,
    'showLog' => true,
    'tpl' => '@INLINE
		bla-bla-bla
	'
])}
У pdoResources такой проблемы нет.

Кстати, если очень хочется использовать именно массивы — то можно воспользоваться тем, что json_encode в Fenom является разрешённой PHP функцией:
{$_modx->runSnippet('!msProducts', [
    'parents' => 3,
    'sortby' => json_encode([
        "Data.new" => "desc",
        "msProduct.editedon" => "desc"
    ]),
    'includeThumbs' => '150x150',
    'where' => json_encode([
	    "Data.price:>=" => 0
    ]),
    'limit' => 4,
    'showLog' => true,
    'tpl' => '@INLINE
		bla-bla-bla
	'
])}
Илья Уткин
Илья Уткин
3
+1
Пётр Молчанов
Пётр Молчанов
1
+2
Максим Кузнецов
Максим Кузнецов
2
+1
Максим Кузнецов
Максим Кузнецов
2
+1
Ок, я поставил minishop2 и mSearch2. Прикладываю рабочие параметры Join'a:
&class=`modResource`
	&leftJoin=`{
		"Thumb": {
			"class": "msProductData",
			"on": "modResource.id = Thumb.id"
		 }
	}`
	&select=`{
		"modResource": "*",
		"Thumb": "Thumb.thumb as preview"
	}`
— вызывать как [[+preview]]. Все дело было в классе — msProductData вместо msProductFile…

Ненавижу LeftJoin..)
Максим Кузнецов
Максим Кузнецов
1
0
mSearch вызывает результаты через pdoResources, а значит:

а) можно вывести thumbs через leftJoin вот так (данный пример для вывода превьюшек msGallery2, а для msGallery minishop'a, соответственно, нужно прописать его данные с бд):
&leftJoin=`{
	"75x75": {"class":"msResourceFile","alias":"75x75", "on": "75x75.resource_id = modResource.id AND 75x75.path LIKE '%/75x75/' AND 75x75.rank=0"}
}`
&select=`{
	"modResource":"*"
	,"75x75":"75x75.url as 75x75"
}`
б) можно применить параметры &class=`msProduct` &element=`msProducts` &includeThumbs=`75x75`

— ну и 75х75 заменить на желаемый размер превьюшек