Виталий Серый

Виталий Серый

Был в сети 16 ноября 2021, 22:01
Заказы не принимаю
На текущий момент без изменения сниппета msProducts сгруппировать не получится.
Надо править либо сам сниппет, либо создать копию (если не прав, то править надо меня).

После 28 строки добавить что-то вроде такого
// Add grouping
$groupby = array(
    'msProduct.id',
); //строка 28
if(!empty($scriptProperties['groupby'])){
    $groupby = array(
        $scriptProperties['groupby'],
    );
}

Так же при желании все необходимое можно добавить в вызове сниппета вместо создания нового
{'!mFilter2' | snippet:[
    'class' => 'msProduct',
    'parents' => 0,
    'element' => 'msProducts',
    'innerJoin' => '{
                "Category": {
                    "class": "msCategory"
                 }
            }',
    'select' => '{
                "Category": "*"
            }',
    'groupby' => 'Category.id',
    'tpl' => '@INLINE <p><a href="{$uri}">{$pagetitle}</a></p>',
    ....
]}
Можно поизвращаться при желании. Но лучше прислушаться к Максиму и реализовать через js, готовых велосипедов, наверное, полно.
{set $page_key = 'num'}
{set $page = $.get.$page_key?:1}
{set $limit = 3}
{if ($page is numeric) && (($page + 0) is not decimal)}
    {set $total = $rows | length}
    {set $pages = ($total - ($total % $limit)) / $limit}
    {set $pages = ($total % $limit) ? ($pages + 1) : $pages}
    {set $page = $page > $pages ? 1 : $page}
    {set $offset = $limit * ($page - 1)}
    {set $idx = 0}
    {foreach $rows as $val}
        {*<p>{$idx} - {$offset} - {$offset + $limit}</p>*}
        {set $idx = $idx + 1}
        {if $idx <= $offset || $idx > ($offset + $limit)}
            {continue}
        {/if}
        <div>{$idx} - {$val}</div>
    {/foreach}
    {macro link($curr_page, $dir='<', $total, $page_key,$tpl)}
        {set $classes = ['btn btn-light']}
        {set $page = ($dir == '>') ? ($curr_page + 1) : ($curr_page - 1)}
        {if (($curr_page >= $total) && ($dir == '>')) || (($curr_page <= 1) && ($dir != '>'))}
            {set $classes[] = 'disabled'}
            {set $disabled = 1}
        {/if}
        {if $disabled}
            <span class="{$classes | join:' '}">{$tpl}</span>
        {else}
            <a href="?{$page_key}={$page}" class="{$classes | join:' '}">{$tpl}</a>
        {/if}
    {/macro}
    {if $pages >= 2}
        <div class="pagination">
            {macro.link curr_page=$page total=$pages page_key=$page_key tpl='<<'}
            {foreach 1..$pages as $num}
                {set $classes = ['btn btn-light']}
                {if $num@first}{set $classes[] = 'first'}{/if}
                {if $num@last}{set $classes[] = 'last'}{/if}
                {if $num == $page}{set $classes[] = 'active'}{/if}
                <a href="?{$page_key}={$num}" class="{$classes | join:' '}">{$num}</a>
            {/foreach}
            {macro.link curr_page=$page dir='>' total=$pages page_key=$page_key tpl='>>'}
        </div>
    {/if}
{/if}
В данном случае это, на мой взгляд, оптимальная реализация, но предложу немного мутировать.
В настройках контекста создать переменную, пусть будет ctx_res, в которой через запятую перечислить все требуемые id.
Алиасы ресурсов привести в соответствие.
И вывести, например, через pdoMenu
{'pdoMenu' | snippet:[
	'parents' => 0,
	'resources' => 'ctx_res' | option,
	'tpl' => 'tpl',
]}

tpl:
<div class="content__item content__item{$idx}">
	<a href="{$id | url}" class="content__heading content__heading--{$idx}">{('gg_' ~ $alias) | lexicon}</a>
	<a href="{$id | url}" class="content__heading-a">
		<p>{$id | resource : 'introtext'}</p>
	</a>
	<span class="content__more{$idx}"> {'gg_more' | lexicon}</span>
	<a href="{$id | url}" class="content__more"> {'gg_more' | lexicon}</a>
</div>
Через if или switch
{set $items = [
	'2' => 'gg_about',
	'4' => 'gg_invest',
	'3' => 'gg_trade',
]}

{if $_modx->context.key == 'eng'} {* {if $_modx->config.cultureKey == 'en'} *}
    {set $items = [
	'12' => 'gg_ne_about',
	'14' => 'gg_invest_li',
	'13' => 'gg_trader',
    ]}
{elseif $_modx->context.key == 'deu'} {* {if $_modx->config.cultureKey == 'de'} *}
    {set $items = [
	'22' => 'gg_about',
	'24' => 'gg_invest_on',
	'23' => 'gg_trade_in',
    ]}
{/if}
Мне нравится делать примерно вот так:
{set $items = [
	'2' => 'gg_about',
	'4' => 'gg_invest',
	'3' => 'gg_trade',
]}

{set $idx = 1}
{foreach $items as $id => $lex}
	<div class="content__item content__item{$idx}">
	    <a href="{$id | url}" class="content__heading content__heading--{$idx}">{$lex | lexicon}</a>
	    <a href="{$id | url}" class="content__heading-a">
	        <p>{$id | resource : 'introtext'}</p>
	    </a>
	    <span class="content__more{$idx}"> {'gg_more' | lexicon}</span>
	    <a href="{$id | url}" class="content__more"> {'gg_more' | lexicon}</a>
	</div>
	{set $idx = $idx + 1}
{/foreach}
Спасибо за реакцию.
В очередной раз убеждаюсь, что стоит тихо почитывать документацию, Василия, Николая, Сергея, Илью, Ивана, Павла, Михаила, Евгения, Боба, Марка и иже с ними, читать код, самостоятельно экспериментировать и вникать.
И плевать на подобные вопросы, обсосанные уж много раз и в конечном счете с единственным посылом — «сделайте всю работу за меня».
Василий Наумкин однажды писал про переключение контекстов. Рекомендую ознакомиться. Но если лень возиться и хочется побыстрее разделаться с вопросом, то пропишите:
default:
            // Set the default language/context here
            $modx->switchContext('web');
            $url = $modx->makeUrl($modx->getOption('error_page'));
            $modx->sendRedirect($url, array('responseCode' => 'HTTP/1.1 404 Not Found'));
            break;