Получение tv из дочерних ресурсов
Москва
-рыба
-пиво
-кальмары
Киров
-рыба
-пиво
-кальмары
Ростов
-рыба
-пиво
-кальмары
в Москва, Киров, Ростов есть tv *tovar_forel_chekbox, *tovar_shuka_chekbox, *tovar_kit_chekbox
Чанк один, в нем условие:
[[*tovar_forel_chekbox:is=`1`:then=`есть форель`]]
[[*tovar_shuka_chekbox:is=`1`:then=`есть щука`]]
[[*tovar_kit_chekbox:is=`1`:then=`есть кит`]]
Проблема, не могу получить на вложенных страницах -рыба, -пиво, -кальмары значение tv: *tovar_forel_chekbox, *tovar_shuka_chekbox, *tovar_kit_chekbox.
Пробовал сниппет
<?php
$resource = $modx->resource;
$tvName = $modx->getOption('tvName', $scriptProperties, '');
if (empty($tvName)) {
return '';
}
$tvValue = $resource->getTVValue($tvName);
if ($tvValue == 1) {
return 1;
}
$parent = $modx->getObject('modResource', $resource->get('parent'));
if ($parent) {
$parentTVValue = $parent->getTVValue($tvName);
if ($parentTVValue == 1) {
return 1;
}
}
return '';
Вызываю в чанке:
[[If?
&subject=`[[checkTV? &tvName=`tovar_forel_chekbox`]]`
&operator=`EQ`
&operand=`1`
&then=`есть форель`
]]
[[If?
&subject=`[[checkTV? &tvName=`tovar_shuka_chekbox`]]`
&operator=`EQ`
&operand=`1`
&then=`есть щука`
]]
[[If?
&subject=`[[checkTV? &tvName=`tovar_kit_chekbox`]]`
&operator=`EQ`
&operand=`1`
&then=`есть кит`
]]
Не получается получить &then=`` ни на главной ни на вложенной с таким сниппетом.Комментарии: 7
Помогите решить проблему…
Нужно такое условие…
Нужно такое условие…
[[#[[*parent]].tovar_kit_chekbox:is=`1` или *tovar_kit_chekbox:is=`1`:then=``]]
Если сами TV-шки называются «есть щука», «есть форель» и «есть кит», то так:
Вызов один:
<?php
$docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
$tvs = explode(',', $tvs);
$out = array();
foreach($tvs as $tv){
if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
$out[] = $tvo->get('caption');
}
return implode(', ', $out);
Вызов один:
[[checkTV?
&docid=`[[*parent]]` //если на дочерних
&tvs = `tovar_forel_chekbox,tovar_shuka_chekbox,tovar_kit_chekbox`
]]
- Для чего получать все TV родителя?
- Зачем прописывать текущему ресурсу родительские TV?
Я немного ушел в сторону.
Сниппет getTV:
[[$vitrina]]
[[getTV]]
Проблема осталась что иногда по не понятным причинам один TV не всегда получает значение…
а именно:
Сниппет getTV:
<?php
// Получить родительский ресурс
$parentResource = $modx->getObject('modResource', $modx->resource->get('parent'));
if ($parentResource) {
// Получить все TV у родительского ресурса
$parentTvs = $parentResource->getTemplateVars();
foreach($parentTvs as $tv) {
// Проверить, существует ли такая переменная у текущего ресурса
$currentTv = $modx->getObject('modTemplateVar', ['name' => $tv->get('name')]);
if ($currentTv) {
// Получить значение родительского TV
$parentValue = $tv->getValue($parentResource->get('id'));
// Установить значение родительского TV для текущего ресурса
$currentTv->setValue($modx->resource->get('id'), $parentValue);
$currentTv->save();
}
}
}
в шаблоне вызова так:[[$vitrina]]
[[getTV]]
Проблема осталась что иногда по не понятным причинам один TV не всегда получает значение…
а именно:
[[*city_phone_whatsapp:isnot=``:then=`вывод текста`]]
если использую
[[If? &is=`[[*city_phone_whatsapp]]`:then=`вывод текста`]],
ничего не выводит
Вам нужно проверять стоит ли в определенных TV у родительского ресурса «1» и если стоит, то выводить их название?
Сделайте как я написал выше — это универсальное решение.
Если требуется выводить не название TV а какой-то произвольный текст, то можете так:
А в вызове указывайте для какой TV какой текст выводить:
Сделайте как я написал выше — это универсальное решение.
Если требуется выводить не название TV а какой-то произвольный текст, то можете так:
<?php
$docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
$tvs = json_decode($tvs,1);
$out = array();
foreach($tvs as $tv => $name){
if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
$out[] = $name;
}
return implode(', ', $out);
А в вызове указывайте для какой TV какой текст выводить:
[[checkTV?
&tvs = `{ "tovar_forel_chekbox":"форель","tovar_shuka_chekbox":"щука","tovar_kit_chekbox":"кит" }`
&docid=`[[*parent]]`
]]
[[!#[[*parent]].tovar_forel_chekbox:ne=‘’:then=‘hello’]]
Писал с телефона. Кавычки исправите.
Писал с телефона. Кавычки исправите.
Спасибо кто откликнулся и за помощь)) Сработал свой костыль Сниппет getTV + js (подстановка номера через поиск на странице и замену пустого значения).
в шаблоне вызова так:
[[!getTV]]
[[!$vitrina]]
в шаблоне вызова так:
[[!getTV]]
[[!$vitrina]]
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.