все просто

Список характеристик продукта 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}

Полученный результат

Результат работы сниппета

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