Вывести опции по категориям
Здравствуйте!
Пытаюсь сделать универсальный вариант для интернет-магазина, где будут категории смартфоны, аксессуары, ноутбуки, планшеты и т.д
У всех категорий свои опции, но для клиента хочется сделать вывод более понятным и удобным. Пример:
То есть, основные характеристики, процессор, дисплей и т.д, а под ними уже выводить необходимые опции.
Во всех категориях названия опций и сами опции будут отличаться, не хочется делать для каждой категории свой шаблон, т.к это долго и сложно в управлении в дальнейшем.
Подскажите, есть ли какие-то способы реализации?
Использую: minishop2, mSearch2.
Пытаюсь сделать универсальный вариант для интернет-магазина, где будут категории смартфоны, аксессуары, ноутбуки, планшеты и т.д
У всех категорий свои опции, но для клиента хочется сделать вывод более понятным и удобным. Пример:
То есть, основные характеристики, процессор, дисплей и т.д, а под ними уже выводить необходимые опции.
Во всех категориях названия опций и сами опции будут отличаться, не хочется делать для каждой категории свой шаблон, т.к это долго и сложно в управлении в дальнейшем.
Подскажите, есть ли какие-то способы реализации?
Использую: minishop2, mSearch2.
Комментарии: 3
Присоединяюсь. Удалось реализовать?
Пока нет, есть вариант делать вывод через MIGX, но в таком случае это запарно, т.к придется заполнять 2 раза одно и тоже, чтоб и в фильтре были значения и визуально в карточке товара.
Как вариант можно использовать платный компонент — msextrafields, как попробую — отпишу.
Как вариант можно использовать платный компонент — msextrafields, как попробую — отпишу.
Если решение кому пригодится:
Создаем сниппет msProductOptionsEx
Вызываем сниппет, где требуется вывести свойства товаров по группам:
Чанк tpl.msProductOptionsEx:
Создаем сниппет 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}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.