Список характеристик продукта miniShop2
Задача: получить список Опций товара с сортировкой и разбивкой по Категориям
Стандартного и готового решения не было найдено, пришлось ваять самому.
Новый сниппет назовем "оригинально"- ProductOptions

Что бы не путать категории с рабочими, создаем родительскую Категорию, например - Ресурсы.

В ней создаем нужные Категории Опций товара.

При создании товара не забываем раскладывать новые Опции по Категориям
СортировкуОпций производим в настройках Категорий товара

Код сниппета:
<?php
/** @var modX $modx */
/*parametr*/
$tpl = $modx->getOption('tpl', $scriptProperties, 'tplOptionsProd');// чанк строки Опции
$tplCat = $modx->getOption('tplCat', $scriptProperties, 'tplOptionsCat'); //чанк обертка Категории
// получение id товара
if (!empty($input) && empty($product)) {
$product = $input;
}else{
$product = $modx->resource->id;
}
// $parCat - это ID родителя Категорий, в нашем случае - Ресурсы
//Получение списка категорий
/* if parCat empty - select automat category */
if (empty($parCat)){/* похоже это лишнее, поскольку везде в запросах inner join )) */
$cat = $modx->query("SELECT mo.category FROM {$modx->getTableName('msProductOption')} as mpo
inner JOIN {$modx->getTableName('msOption')} as mo
on mpo.key = mo.key
WHERE mpo.product_id = $product
GROUP BY mo.category");
$cat_arr = $cat->fetchAll(PDO::FETCH_COLUMN);
$cat_id = implode(",",$cat_arr);
$query = $modx->query("SELECT * FROM smrt_categories WHERE id in ($cat_id) ORDER BY rank");
$har = $query->fetchAll(PDO::FETCH_ASSOC);
}else{
$query = $modx->query("SELECT * FROM smrt_categories WHERE parent in ($parCat) ORDER BY rank");
$har = $query->fetchAll(PDO::FETCH_ASSOC);
}
/** @var pdoTools $pdoTools */
$pdoTools = $modx->getService('pdoTools');
$options= array();
$category= array();
$output = '';
foreach($har as $cat){
$category = $cat;
// выборка Опций товара для каждой Категории
$sql = $modx->query("SELECT mpo.key,mo.caption, mo.category, mo.measure_unit, mco.rank, mo.type
FROM {$modx->getTableName('msProductOption')} as mpo
inner JOIN {$modx->getTableName('msOption')} as mo
on mpo.key = mo.key
inner JOIN {$modx->getTableName('msCategoryOption')} as mco
on mo.id = mco.option_id
WHERE mpo.product_id = $product
AND mo.category = {$cat['id']}
GROUP BY mpo.key
order by mco.rank");
$opt = $sql->fetchAll(PDO::FETCH_ASSOC);
$string='';
foreach($opt as $oo){
$options['key'] = $oo['key'];
$options['caption'] = $oo['caption'];
$options['category'] = $oo['category'];
$options['measure_unit'] = $oo['measure_unit'];
// выборка значений Опций
$qq = $modx->query("SELECT mpo.value
FROM {$modx->getTableName('msProductOption')} as mpo
WHERE mpo.product_id = $product
AND mpo.key LIKE '{$oo['key']}'");
$val = $qq->fetchAll(PDO::FETCH_ASSOC);
$temp='';
foreach($val as $vv){
$temp .= $vv['value'].", ";
}
$options['value'] = substr(trim($temp),0,-1);
if ($oo['type'] == 'combo-boolean'){
$options['value'] = $options['value']?'Да':'Нет';
}
// оформление строки Опции
if ($tpl == ''){
print_r($options);
}else{
$string .= $pdoTools->getChunk($tpl, $options);
}
}
$category['wrapper']=$string;
// оформление Категории
if ($tpl == ''){
print_r($category);
}else{
$output .= $pdoTools->getChunk($tplCat, $category);
}
}
return $output;
так выглядит вызов сниппета
{'ProductOptions'|snippet:[
'tpl'=>'tplOptionsProd',
'tplCat'=>'tplOptionsCat',
'parCat'=> 20
]}
чанк строки tplOptionsProd
{if $value?}
<tr>
<td style="vertical-align:middle;">{$caption}:</td>
<td width="25%">
{$value}
{$measure_unit}
</td>
</tr>
{/if}
чанк обертка tplOptionsCat
{if $wrapper?}
<h3>{$category}</h3>
<table>
<tbody>
{$wrapper}
</tbody>
</table>
{/if}
Полученный результат

Комментарии ()