Список характеристик продукта 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}
Полученный результат
Комментарии ()