Как написать условие if на множество ресурсов и родителей на Fenom
Всех приветствую, есть поле артикул, которое не нужно выводить у ряда категорий, на данный момент условие реализовано следующим образом:
{set $key = ["31","32" ,"32" ,"33" ,"34"]}
{if $_modx->resource.id in list $key}
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
То есть главный родитель 31, а остальные — его подкаталоги. Но если подкаталоги добавляются, что бы не лезть в шаблон, можно ли как то сделать что бы у всех подкаталогов родителя 31 скрывался артикул? Комментарии: 31
что бы у всех подкаталогов родителя 31 скрывался артикулПри этом код у вас написан наоборот. Наверное нужно что-то в этом роде:
{if $_modx->resource.parent != 31 || $_modx->resource.id != 31}
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
Так выводится артикул везде и в родителе 31 и в подкаталогах
А так
{if $_modx->resource.parent != 31 && $_modx->resource.id != 31}
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
Спасибо большое, так работает, а как в карточке товара реализовать данное условие? Скопировал — не срабатывает
Вам бы документацию Fenom почитать.
{$_modx->resource.id} и подобные этому вызовы обращаются к полям текущего ресурса. Поэтому в чанке будет так:
1) Не смешивайте стандартный синтаксис и fenom. Раз пишите в fenom, пишите все в нем. Т.е. не
{$_modx->resource.id} и подобные этому вызовы обращаются к полям текущего ресурса. Поэтому в чанке будет так:
{if $parent != 31 && $id != 31}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{/if}
И кстати:1) Не смешивайте стандартный синтаксис и fenom. Раз пишите в fenom, пишите все в нем. Т.е. не
[[+article]]
, а {$article}
2) По-моему в первом условии должно быть не [[+article]]
, а {$_modx->resource.article}
А как в карточке товара реализовать данное условие?
Я же написал в комменте. В самом первом моем комменте и комменте Артура, условие для страницы товара. Для карточки товара, если она выводится сниппетом, условие будет то, что я написал в последнем комменте
В карточке пробую так:
{if $parent != 31 && $id != 31 && $parent != 29 && $id != 29}
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
И так:{if $_modx->resource.parent != 31 && $_modx->resource.id != 31 && $_modx->resource.parent != 29 && $_modx->resource.id != 29}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{/if}
Все равно выводит артикул
Во первых, прочитайте тщательно мой коммент выше, где я указал ссылку на документацию и поймете, где у вас ошибка.
Во вторых, покажите вызов сниппета, которым выводятся карточки, код чанка карточки.
Во вторых, покажите вызов сниппета, которым выводятся карточки, код чанка карточки.
Товар выводим шаблоном
<!DOCTYPE html>
<html lang="ru">
<head>
{$_modx->getChunk('meta')}
</head>
<body class="common-home res layout-4">
<div id="wrapper" class="wrapper-fluid banners-effect-5">
<!-- Header Container -->
<header id="header" class=" typeheader-4">
{$_modx->getChunk('header')}
</header>
<!-- //Header Container -->
<!-- Main Container -->
<div class="main-container container">
{$_modx->runSnippet('!pdoCrumbs', [
'showHome' => '0',
'exclude' => '24',
'tplWrapper' => '@INLINE
<ul class="breadcrumb" itemscope="" itemtype="http://schema.org/BreadcrumbList">{$output}</ul>
',
'tplHome' => '@INLINE
<li itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
<a itemprop="item" title="{ $menutitle }" href="{$link}">
<i class="fa fa-home"></i> <span itemprop="name" class="crumb-item">{$menutitle}</span>
<meta itemprop="position" content="{ $idx }">
</a>
</li>
',
'tplCurrent' => '@INLINE
<li class="mr-2" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
<span itemprop="item" class="current">
<span itemprop="name">{$menutitle}</span>
<meta itemprop="position" content="{ $idx }">
</span>
</li>
',
'tpl' => '@INLINE
<li itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
<a itemprop="item" title="{ $menutitle }" href="{$link}">
<span itemprop="name" class="crumb-item">{$menutitle}</span>
<meta itemprop="position" content="{ $idx }">
</a>
</li>
',
])}
{$_modx->runSnippet('!addLooked', [
'templates' => '3',
'limit' => '15',
])}
<div class="row">
<div id="content" class="col-md-9 col-sm-8">
<div class="product-view row">
<div class="left-content-product">
<div class="content-product-left class-honizol col-md-5 col-sm-12 col-xs-12">
{$_modx->runSnippet('!msGallery', [
'tpl' => 'msGalleryProductTpl',
])}
{if $_modx->resource.new?}
<span class="abel-product label-new">{'ms2_frontend_new' | lexicon}</span>
{/if}
{if $_modx->resource.popular?}
<span class="label-product label-sale">{'ms2_frontend_popular' | lexicon}</span>
{/if}
{if $_modx->resource.favorite?}
<span class="label-product label-new">{'ms2_frontend_favorite' | lexicon}</span>
{/if}
</div>
<div class="content-product-right col-md-7 col-sm-12 col-xs-12" itemtype="http://schema.org/AggregateOffer" itemprop="offers" itemscope>
<meta itemprop="category" content="{$_modx->resource.parent | resource: "pagetitle"}">
<meta itemprop="offerCount" content="1">
<meta itemprop="price" content="{$price | replace:" ":""}">
<meta itemprop="lowPrice" content="{$price | replace:" ":""}">
<meta itemprop="priceCurrency" content="RUR">
<div class="title-product">
<h1>{$_modx->resource.introtext ?: $_modx->resource.pagetitle}</h1>
</div>
<!-- Review ---->
<form class="form-horizontal ms2_form" method="post">
<input type="hidden" name="id" value="[[*id]]"/>
<div class="product-label" itemprop="offerDetails" itemscope="" itemtype="http://data-vocabulary.org/Offer">
<div class="product_page_price price" itemprop="offers" itemscope="" itemtype="http://schema.org/Offer">
<span class="price-new product-price" itemprop="price">{$price} {'ms2_frontend_currency' | lexicon}</span>
{if $old_price != 0}
<span class="old_price price-old">[[+old_price]] [[%ms2_frontend_currency]]</span>
{/if}
<meta itemprop="price" content="[[+price]]">
<meta itemprop="priceCurrency" content="RUB">
<meta itemprop="priceValidUntil" content="[[!+nowdate:default=`now`:strtotime:date=`%Y-%m-%d`]]">
<link itemprop="availability" href="http://schema.org/InStock">
</div>
{if $_modx->resource.available == 1}
<div class="stock"><span class="status-stock">В наличии</span></div>
{/if}
{if $_modx->resource.available == 2}
<div class="stock"><span class="status-stock">Нет в наличии</span></div>
{/if}
{if $_modx->resource.available == 3}
<div class="stock"><span class="status-stock">Под заказ</span></div>
{/if}
</div>
<div class="product-box-desc">
<div class="inner-box-desc">
[[getMarksAndModels]]
[[*longtitle:notempty=`
<div class="price-tax"><span>Примечание:</span> <span class="article">[[*longtitle]]</span></div>
`:else=``]]
{if $parent != 31 && $id != 31 && $parent != 29 && $id != 29}
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
[[-*article:gt=`0`:then=`<span>Артикул:</span> <span class="item">[[*article]]</span>`:else=``]]
[[msProductOptions?tpl=`msProductOptionsTpl` &onlyOptions=`orign_n`]]
[[msProductOptions?tpl=`msProductOptionsTpl` &onlyOptions=`dop_n`]]
[[+vendor.name:gt=`0`:then=`
<div class="price-tax"><span>Производитель:</span> <span class="article">[[+vendor.name]]</span></div>
`:else=``]]
[[+vendor.country:gt=`0`:then=`
<div class="price-tax"><span>Страна производителя:</span> <span class="article">[[+vendor.country]]</span></div>
`:else=``]]
<div class="vendor-status">
<div class="price-tax">
<span>Статус производителя:</span>
<span class="article">
{if $_pls['vendor.description']?}{$_pls['vendor.description']}{else}Неоригинал{/if}
</span>
</div>
{if $_pls['vendor.logo']?}
<div class="vendor-logo">
<img src="{$_pls['vendor.logo']}" title="{$_pls['vendor.description']}" class="img-responsive" data-toggle="tooltip"/>
</div>
{else}
<div class="vendor-logo">
<img src="assets/images/vendors/no orign_2.png" title="Неоригинал" class="img-responsive" data-toggle="tooltip"/>
</div>
{/if}
</div>
[[msProductOptions?tpl=`msProductOptionsTpl` &onlyOptions=`synonym`]]
</div>
</div>
<div id="product">
<div class="box-info-product">
<button type="submit" class="btn btn-mega btn-lg" name="ms2_action" value="cart/add">
{'ms2_frontend_add_to_cart' | lexicon}
</button>
<div class="input-group">
<input type="number" name="count" id="product_price" class="form-control col-md-6" value="1"/>
<div class="input-group-append">
<span class="input-group-text">{'ms2_frontend_count_unit' | lexicon}</span>
</div>
</div>
[[!msOneClick?
&tplBtn=`msoneclickBtnTpl`
&tplForm=`msOneClickFormTpl`
]]
</div>
</div>
</div>
<!-- end box info product -->
</form>
</div>
</div>
</div>
<div class="producttab ">
<div class="tabsslider horizontal-tabs col-xs-12">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#tab-1">Описание</a></li>
<li class="item_nonactive"><a data-toggle="tab" href="#tab-2">Доставка и оплата</a></li>
<li class="item_nonactive"><a data-toggle="tab" href="#tab-review">Задать вопрос</a></li>
</ul>
<div class="tab-content col-xs-12">
<div id="tab-1" class="tab-pane fade active in">
[[*content:default=`
<h2>[[*description]] в наличии в магазине Рио</h2>
`]]
</div>
<div id="tab-2" class="tab-pane fade">
[[#41.content]]
</div>
<div id="tab-review" class="tab-pane fade">
<h3>Запрос по VIN, задать вопрос</h3>
[[#815.content]]
[[!AjaxForm?
&form=`questionFormTpl`
&snippet=`FormIt`
&hooks=`validate,FormItSaveForm,email`
&formName=`Сообщение с сайта`
&emailSubject=`Сообщение с сайта`
&emailTo=`ekbsanteh@mail.ru`
&emailFrom=`no-reply@ekb-santeh.ru`
&emailTpl=`tpl.email`
&validate=`name:minLength=^2^`
&fieldNames=`name==Имя,phone==Телефон,pageurl==Страница отправки,vin==VIN,email==Email,city==Город,marka==Марка,model==Модель,year==Год выпуска,upload==Файл`
&validationErrorMessage=`В форме содержатся ошибки!`
&successMessage=`Сообщение успешно отправлено`
]]
</div>
</div>
</div>
</div>
[[!msProducts?
&tpl=`recentlyViewedTpl`
&includeThumbs=`medium`
&parents=`0`
&link=`1`
&master=`[[*id]]`
&wrapIfEmpty=`0`
&tplWrapper=`@INLINE
<div class="related titleLine products-list grid module">
<h3 class="">Аналоги:</h3>
<div class="releate-products yt-content-slider products-list" data-rtl="no" data-loop="yes" data-autoplay="no" data-autoheight="no" data-autowidth="no" data-delay="4" data-speed="0.6" data-margin="30" data-items_column00="4" data-items_column0="4" data-items_column1="3" data-items_column2="2" data-items_column3="2" data-items_column4="1" data-arrows="yes" data-pagination="no" data-lazyload="yes" data-hoverpause="yes">
[[+output]]
</div>
</div>
`]]
<aside class="col-sm-4 col-md-3 content-aside" id="column-left">
[[!looked?
&limit=`3`
&tpl=`lookedViewedTpl`
&tplOuter=`lookedOuterMyTpl`
&includeThumbs=`medium`
]]
<!--<div class="module banner-left hidden-xs ">
<div class="banner-sidebar banners">
<div>
<a title="Banner Image" href="#">
<img src="assets/images/slider/banner-sidebar.jpg" alt="Banner Image">
</a>
</div>
</div>
</div>-->
</aside>
</div>
</div>
</div>
<!--Middle Part End-->
<!-- //Main Container -->
{$_modx->getChunk('footer')}
<!-- //end Footer Container -->
</div>
<!-- End Color Scheme
============================================ -->
{$_modx->getChunk('scripts')}
</body>
</html>
Это же страница товара, а не карточка. И я ведь написал в комменте, почему вы его не прочитали? Нужно выводить не [[+article]] в шаблоне, ибо это плейсхолдер, а {$_modx->resource.article}
Да, именно на странице товара и не получается отключить вывод артикула.
Ни так:
Ни так:
{if $parent != 31 && $id != 31 && $parent != 29 && $id != 29}
Ни так:{if $_modx->resource.parent != 31 && $_modx->resource.id != 31 && $_modx->resource.parent != 29 && $_modx->resource.id != 29}
т.е. у вас артикул выводится даже на странице ресурсов с id 29 и 31 и на их дочерних ресурсах?
Ресурсы с id 29 и 31 — это категории товаров. На самих страницах товаров этих категорий нужно запретить вывод артикула и дочерних подкатегорий каталогов с id 29 и 31
Просто пишите так:
А исключить дочерние категории в списке — просто добавьте эти каталоги с минусом:
{if $_modx->resource.parent not in list [29,31] }
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
это запрет вывода артикула на странице товара.А исключить дочерние категории в списке — просто добавьте эти каталоги с минусом:
'parents' => '0,-29,-31'
но лучше вместо нуля вписать начальный каталог.
Пробую таким способом, артикул все таки выводится. На скриншоте проще показать: disk.yandex.ru/i/DiY5_EjPHyfklA
ID=31 — это самая верхняя категория которая в себе содержит десятки подкатегорий разной вложенности, и у товаров всех этих категорий, которые постоянно добавляются и убавляются, не нужно выводить артикул. Что бы не лезть постоянно в шаблон что бы прописать ID новой добавленной категории.
ID=31 — это самая верхняя категория которая в себе содержит десятки подкатегорий разной вложенности, и у товаров всех этих категорий, которые постоянно добавляются и убавляются, не нужно выводить артикул. Что бы не лезть постоянно в шаблон что бы прописать ID новой добавленной категории.
А так у вас она не корневая, а с вложенностью… Этот скрин должен был быть в начале.
И тогда это все меняет дело.
нужно брать в зубы лом:
getChildIds
Получать родителей в массив и сравнивать.
те что-то такое
вы, думаю, сможете указать верные. Шаблон подставьте какой у этих ресурсов, ну и глубину выборки по вкусу
31 — Id родителя
2 — глубина
template — шаблон.
И тогда это все меняет дело.
нужно брать в зубы лом:
getChildIds
Получать родителей в массив и сравнивать.
те что-то такое
{set $allpara = $_modx->getChildIds(31,2,['template' => 3])}
... $allpara ... // возможно еще нужно сделать манипуляции какие-то.
//можно предварительно распечатать массив и убедиться тчо там все ровно:
<strong>{$allpara | print}</strong>
{if $_modx->resource.parent not in list $allpara}
<div class="reward"><span>Артикул:</span> <span class="item">[[+article]]</span></div>
{/if}
Я образно показал какую функцию можно взять и что можно параметры засунуть.вы, думаю, сможете указать верные. Шаблон подставьте какой у этих ресурсов, ну и глубину выборки по вкусу
31 — Id родителя
2 — глубина
template — шаблон.
Да, супер, спасибо, так все работает, а как в этом случае получить все дочерние идентификаторы для ресурса 31 и 29?
2 вызова сделать для 31 и 29. и сделать 2 условия.
либо написать свой модификатор array_merge Тк его из коробки нет.
{if !(($_modx->resource.parent in list $ali1) || ($_modx->resource.parent in list $ali2))}
Где $ali1 и $ali2 — вызовы с 31 и 29 id.либо написать свой модификатор array_merge Тк его из коробки нет.
Я правильно составил конструкцию? Или чего то не понял, так ка не заработало
{set $allpara = $_modx->getChildIds(31,4,['template' => 3])}
{set $allpara2 = $_modx->getChildIds(29,4,['template' => 3])}
{if !(($_modx->resource.parent in list $allpara) || ($_modx->resource.parent in list $allpara2))}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{/if}
вроде, правильно
попробуйте что ли
попробуйте что ли
{if (($_modx->resource.parent in list $allpara) || ($_modx->resource.parent in list $allpara2))}
Спрятали
{else}
показали
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{/if}
Спасибо, отлично работает на странице товара, но в каталоге в листинге отказывается. Вывожу так:
{set $allpara = $_modx->getChildIds(31,4,['template' => 3])}
{set $allpara2 = $_modx->getChildIds(29,4,['template' => 3])}
{if (($_modx->resource.parent in list $allpara) || ($_modx->resource.parent in list $allpara2))}
{else}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{/if}
Пробовал из условия убрать id шаблона, но все равно выводит артикул.
Ну я вам и давал решение на странице товара.
А если у вас артикулы в списках товаров, то тут чтобы не делать запросы для каждого товара, необходимо в сниппет заранее передать данные по родителям. тут придется написать маленький модификатор для array_merge И передать данные в msProduct (или какой вы сниппет используете?)
1. до сниппета нужно получить все тоже:
Возьмем сделаем чуток вычурно, зато понятно:
указываем так:
А если у вас артикулы в списках товаров, то тут чтобы не делать запросы для каждого товара, необходимо в сниппет заранее передать данные по родителям. тут придется написать маленький модификатор для array_merge И передать данные в msProduct (или какой вы сниппет используете?)
1. до сниппета нужно получить все тоже:
{set $allpara = $_modx->getChildIds(31,4,['template' => 3])}
{set $allpara2 = $_modx->getChildIds(29,4,['template' => 3])}
потом нам нужно эти 2 массива склеить через array_megre. Но обьяснять как делать этот модификатор — лень.Возьмем сделаем чуток вычурно, зато понятно:
{foreach $allpara2 as $nyam}
{set $allpara[] = $nyam}
{/foreach}
{'msProduct' | snippet : [
'parents' => $catalog, // $catalog - не 0, а id каталога. не нужно сюда писать ноль!
'forarticle' => $allpara
]}
И далее в шаблоне tplуказываем так:
{if $parent not in list $allpara}
показать Артикул
{else}
скрыть art
{/if}
Спасибо, пробую, немного не понял, что все таки указывать в parents, потыкал всяко, пробую так, в шаблоне каталога:
{set $allpara = $_modx->getChildIds(31,4,['template' => 3])}
{set $allpara2 = $_modx->getChildIds(29,4,['template' => 3])}
{foreach $allpara2 as $nyam}
{set $allpara[] = $nyam}
{/foreach}
{'msProduct' | snippet : [
'parents' => 31,29,
'forarticle' => $allpara
]}
В чанке:{if $parent not in list $allpara}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{else}
{/if}
Что то не то похоже делаю.
Значит у вас версия минишопа не 4ка, походу.
для передачи параметров можно использовать плейсхолдеры:
для передачи параметров можно использовать плейсхолдеры:
{set $allpara = $_modx->getChildIds(31,4,['template' => 3])}
{set $allpara2 = $_modx->getChildIds(29,4,['template' => 3])}
{foreach $allpara2 as $nyam}
{set $allpara[] = $nyam}
{/foreach}
setPlaceholder('utochka', $allpara); // посмотрите в доке синтаксис.
и уже в tpl вызывайте так:{if $parent not in list ('utochka' | placeholder)}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{else}
{/if}
Да, странно, версия действительно 2.9, как выяснил, поставщик не modstore.pro…
Пробую вывод в шаблоне:
Пробую вывод в шаблоне:
{set $allpara = $_modx->getChildIds(31,4,['template' => 3])}
{set $allpara2 = $_modx->getChildIds(29,4,['template' => 3])}
{foreach $allpara2 as $nyam}
{set $allpara[] = $nyam}
{/foreach}
{$modx->setPlaceholder('noarticle', $allpara)}
В чанке:{if $parent not in list ('noarticle' | placeholder)}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{else}
{/if}
Товары перестали выводиться.
Ну, такие вещи нужно уже самому отдебаживать.
Проверьте что в чанке вообще выводятся данные:
И так попробуйте посмотреть:
каждый чих проверять уже перебор.
Проверьте что в чанке вообще выводятся данные:
И так попробуйте посмотреть:
{$_modx->getPlaceholder('noarticle') | print}
и так:{('noarticle' | placeholder) | print}
если не выводиться, проверьте что переменные верно указаны. ну и еще в феноме не забывайте что есть $_modx, а не $modx.каждый чих проверять уже перебор.
Плейсхолдер выводит огромный массив всех артикулов, по которым не требуется выводить артикул, все верно.
Дело в этой конструкции:
Дело в этой конструкции:
{if $parent not in list ('noarticle' | placeholder)}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{else}
{/if}
В журнале ошибка:'{if $parent not in list (' <- there
Да, просто поменяйте и сделайте так:
{set $dog = ('noarticle' | placeholder)}
{if $parent not in list $dog}
<div class="reward"><span>Артикул:</span> <span class="item">{$article}</span></div>
{else}
{/if}
Спасибо большое, все работает, как могу отблагодарить?
Для того чтобы поблагодарить участника сообщества, вы можете пополнить наш фонд на любую удобную сумму, хоть 100 рублей.
Все реквизиты есть на этой странице
P.S. Думаю Алексей не будет против.
Все реквизиты есть на этой странице
P.S. Думаю Алексей не будет против.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.