Сниппет TvValueControl

TvValueControl - cниппет для более удобного управления выводом сообщений, при пустых значениях TV. Сниппет позволяет минимизировать на странице число условий с использованием модификаторов MODX. Так же может послужить примером для создания других сниппетов.

Пример использования:

[[TvValueControl?
&tvNames=`mytv1==mytv2`
&messages=`Message if empty first.==Message if empty second.`
&ifAllEmpty=`Item is not available.`
]]

В этом примере если значение TV с именем "mytv1" будет пустое или в нем будет установлено значение "0", то будет выводиться сообщение "Message if empty first.". И т.д. для всех, перечисленных TV. Если все TV пустые, то будут выведено сообщение "Item is not available.".
"==" - разделитель для имен TV и сообщений.

Кроме того, создается плейсхолдер [[+tvc_isAllEmpty]] со значениями "1" или "0", проверяя которые можно так же контроллировать вывод какого-то блока на странице.

Пример:

[[+tvc_isAllEmpty:is=`0`:then=`
<div class="product-price">
	<button class="btn btn-lg btn-primary" type="submit" class="shk-but">
		Add to cart
	</button>
</div>
`:else=``]]

Не выводим кнопку, если все цены пустые или ровны нулю.

Есть параметр &toPlaceholder, с помощью которого можно отправить вывод сниппета в плейсхолдер (нужно указать имя плейсхолдера).

Код сниппета:

<?php

/*

[[TvValueControl?
&tvNames=`mytv1==mytv2`
&messages=`Message if empty first.==Message if empty second.`
&ifAllEmpty=`Item is not available.`
]]

*/

$output = '';
$tvNames = $modx->getOption('tvNames', $scriptProperties, '');
$tvNames = explode('==', $tvNames);
$messages = $modx->getOption('messages', $scriptProperties, '');
$messages = explode('==', $messages);
$ifAllEmpty = $modx->getOption('ifAllEmpty', $scriptProperties, '');
$toPlaceholder = $modx->getOption('toPlaceholder', $scriptProperties, '');
$emptyCount = 0;

foreach($tvNames as $index => $tVName){
    $tvValue = $modx->resource->getTVValue(trim($tVName));
    if(empty($tvValue)){
        $output .= !empty($messages[$index]) ? $messages[$index] : '';
        $emptyCount++;
    }
}

if($emptyCount == count($tvNames)){
    $output = $ifAllEmpty;
}

if($toPlaceholder){
    $modx->setPlaceholder($toPlaceholder, $output);
    $output = '';
}

$modx->setPlaceholder('tvc_isAllEmpty', $emptyCount == count($tvNames) ? '1' : '0');

return $output;

Спасибо, отличная вещь.

В идеале нужно такое вот решение https://github.com/oo12/setPlaceholders
Но с возможностью работать с migx и ресурсами Modx одновременно.

Действительно в магазине описание товаров приходится выводить так

Параметр 1: Значение 1
Параметр 2: Значение 2
....
Параметр 20: Значение 20

Причем поле Параметр N берем от родителя/ресурс модх т.к. это в рамках категории одно и то же (например Емкость для категории жестких дисков), а значение берем от товаров (500 гб )/ ресурс migx.

Если время появится, чтобы нормально за это сесть постараюсь сделать что-то такое, хоть и коряво))

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.