Вывод сгруппированных опций товара
Всем привет. Часто необходимо вывести опции товара разбив их по группам. msProductOptions к сожалению таким функционалом не обладает. Но теперь, благодаря замечательному человеку Евгению Дурягину, такая возможность у нас есть!
Сниппет msProductOptionsEx
Вызов
Шаблон tpl.msProductOptionsEx
В groupSortBy можно указать rank (сортировка по тому, что указывается в поле «Сортировка» при создании категории), name (алфавиту), idx (по тому порядку, как встречается).
Сниппет msProductOptionsEx
<?php
/** @var modX $modx */
/** @var array $scriptProperties */
$tpl = $modx->getOption('tpl', $scriptProperties, 'tpl.msProductOptions');
if (!empty($input) && empty($product)) {
$product = $input;
}
$emptyGroupName = $modx->getOption('emptyGroupName', $scriptProperties, 'Empty');
$groupSortBy = $modx->getOption('groupSortBy', $scriptProperties, 'rank');
$product = !empty($product) && $product != $modx->resource->id
? $modx->getObject('msProduct', $product)
: $modx->resource;
if (!($product instanceof msProduct)) {
return "[msProductOptions] The resource with id = {$product->id} is not instance of msProduct.";
}
$ignoreOptions = array_map('trim', explode(',', $modx->getOption('ignoreOptions', $scriptProperties, '')));
$onlyOptions = array_map('trim', explode(',', $modx->getOption('onlyOptions', $scriptProperties, '')));
$groups = !empty($groups)
? array_map('trim', explode(',', $groups))
: array();
/** @var msProductData $data */
if ($data = $product->getOne('Data')) {
$optionKeys = $data->getOptionKeys();
}
if (empty($optionKeys)) {
return '';
}
$productData = $product->loadOptions();
$optionCategories = array();
$categoryIds = array();
foreach ($optionKeys as $key) {
// Filter by key
if (!empty($onlyOptions) && $onlyOptions[0] != '' && !in_array($key, $onlyOptions)) {
continue;
} elseif (in_array($key, $ignoreOptions)) {
continue;
}
$option = array();
foreach ($productData as $dataKey => $dataValue) {
$dataKey = explode('.', $dataKey);
if ($dataKey[0] == $key && (count($dataKey) > 1)) {
$option[$dataKey[1]] = $dataValue;
}
}
$option['value'] = $product->get($key);
// Filter by groups
$skip = !empty($groups) && !in_array($option['category'], $groups) && !in_array($option['category_name'], $groups);
if ($skip || empty($option['value'])) {
continue;
}
$categoryId = $option['category'];
if (empty($categoryId)) {
$categoryId = 0;
}
if (!isset($optionCategories[$categoryId])) {
$optionCategories[$categoryId] = array(
'name' => $categoryId ? $option['category_name'] : $emptyGroupName,
'id' => $option['category'],
'rank' => $categoryId ? $option['category'] : PHP_INT_MAX,
'idx' => count($optionCategories),
'options' => array()
);
$categoryIds[] = $categoryId;
}
$optionCategories[$categoryId]['options'][$key] = $option;
}
/** @var pdoFetch $pdoFetch */
$pdoFetch = $modx->getService('pdoFetch');
$categories = $pdoFetch->getCollection('modCategory', array('id:IN' => $categoryIds));
switch ($groupSortBy) {
case 'rank':
foreach ($categories as $category) {
$categoryId = $category['id'];
if (!isset($optionCategories[$categoryId])) {
continue;
}
$optionCategories[$categoryId]['rank'] = intval($category['rank']);
}
uasort($optionCategories, function($a, $b) {
if ($a['rank'] == $b['rank']) {
return 0;
}
return ($a['rank'] < $b['rank']) ? -1 : 1;
});
break;
case 'name':
uasort($optionCategories, function($a, $b) {
return strcmp($a['name'], $b['name']);
});
break;
case 'idx':
uasort($optionCategories, function($a, $b) {
if ($a['idx'] == $b['idx']) {
return 0;
}
return ($a['idx'] < $b['idx']) ? -1 : 1;
});
break;
}
return $pdoFetch->getChunk($tpl, array(
'groups' => $optionCategories,
));
Вызов
[[msProductOptionsEx?
&tpl=`tpl.msProductOptionsEx`
&groupEmptyName=`Без группы`
&groupSortBy=`rank`
]]
Шаблон tpl.msProductOptionsEx
{foreach $groups as $group}
<div class="group">
<h4>{$group.name}</h4>
<div class="group-options">
{foreach $group.options as $option}
<div class="form-group">
<label class="col-md-2 control-label">{$option.caption}:</label>
<div class="col-md-10 form-control-static">
{if $option.value is array}
{$option.value | join : ', '}
{else}
{$option.value}
{/if}
</div>
</div>
{/foreach}
</div>
</div>
{/foreach}
В groupSortBy можно указать rank (сортировка по тому, что указывается в поле «Сортировка» при создании категории), name (алфавиту), idx (по тому порядку, как встречается).
Комментарии: 2
Спасибо! пригодилось
Спасибо большое.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.