pdoMenu мультикатегории minishop2
Задался очередным вопросом — как научить pdoMenu понимать мультикатегории MS2?
Поясню для чего это нужно — зачастую необходимо вывести «древовидную структуру» магазина, с присоединением превьюшек первого товара из категории. Зачастую менеджеры создают категории, в которых содержатся товары только из других родительских категорий, в этом случае pdoMenu не сможет присоединить превьюшку для категории.
Быть может кто-то уже сталкивался с подобной задачей?
Я сталкивался, около полугода назад, для этого написал вот такой сниппет (под катом):
Нет ли способа расширить класс pdoMenu и заставить его принимать мультикатегории minishop2?
PS: написал в «вопросы» но после публикации понял что пойдет для «готовых решений» -)
UPD: наткнулся на подобную тему с иллюстрациями modx.pro/help/3886/
Поясню для чего это нужно — зачастую необходимо вывести «древовидную структуру» магазина, с присоединением превьюшек первого товара из категории. Зачастую менеджеры создают категории, в которых содержатся товары только из других родительских категорий, в этом случае pdoMenu не сможет присоединить превьюшку для категории.
Быть может кто-то уже сталкивался с подобной задачей?
Я сталкивался, около полугода назад, для этого написал вот такой сниппет (под катом):
if(!isset($pdo)) $pdo = $modx->getService('pdoTools');
$q = $modx->newQuery('msCategory');
$q->leftJoin('msCategoryMember', 'msCategoryMember', array( '`msCategory`.`id` = `msCategoryMember`.`category_id`'));
$q->innerJoin('msProduct', 'msProduct', 'msProduct.parent = msCategory.id OR msCategoryMember.product_id = msProduct.id');
$q->innerJoin('msCategory', 'parentCategory', 'msCategory.parent = parentCategory.id');
$q->innerJoin('msProductFile', 'img', 'img.product_id = msProduct.id AND img.rank = 0 AND img.parent != 0 AND img.path LIKE "%/360x270/"');
$q->where(array('class_key' => 'msCategory','published' => 1,'deleted' => 0));
$q->sortby('parentCategory.menuindex','ASC');
$q->sortby('msCategory.menuindex','ASC');
$q->groupby('msCategory.id');
$q->select(array(
'parentCategory.id as parentID',
'parentCategory.pagetitle as parentPagetitle',
'msCategory.id as catID',
'msCategory.pagetitle as catPagetitle',
'img.url as img'
));
//$q->where('`msCategoryMember`.`product_id` = '.$rid.' OR `id` = '.$pid);
$results = [];
$q->prepare();
//echo $q->toSQL();
$parentID = 0;
if ($q->stmt->execute()) {
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
if ($parentID != $row['parentID']){
$parentID = $row['parentID'];
$results[$row['parentID']]['title'] = $row['parentPagetitle'];
$results[$row['parentID']]['url'] = $modx->makeUrl($row['parentID'],'web','','abs');
}
$results[$row['parentID']]['childs'][$row['catID']]['title'] = $row['catPagetitle'];
$results[$row['parentID']]['childs'][$row['catID']]['url'] = $modx->makeUrl($row['catID'],'web','','abs');
$results[$row['parentID']]['childs'][$row['catID']]['img'] = $row['img'];
}
}
//$tplCat = '@INLINE {{+title}}';
//$tplRow = '@INLINE {{+title}}';
$output = '';
foreach($results as $parentID => $parentCats){
$pls['total'] = count($parentCats['childs']);
$pls['title'] = $parentCats['title'];
$pls['url'] = $parentCats['url'];
$rows = '';
foreach($parentCats['childs'] as $idCat => $cat){
$rows .= $pdo->getChunk($tplRow, $cat);
}
$pls['rows'] = $rows;
$output .= $pdo->getChunk($tplCat, $pls);
//var_dump($rows);
}
return $output;
И вызов сниппета:{$_modx->runSnippet('pdoMenuMS2', [
'tplCat' => '@INLINE <a href="{$url}"> {$title}</a> <ul> {$rows}</ul>',
'tplRow' => '@INLINE <li><a href="{$url}"><img src="{$img}"> {$title}</a></li>`
])}
Вся эта писанина теперь, спустя время, мне кажется черезчур надуманной.Нет ли способа расширить класс pdoMenu и заставить его принимать мультикатегории minishop2?
PS: написал в «вопросы» но после публикации понял что пойдет для «готовых решений» -)
UPD: наткнулся на подобную тему с иллюстрациями modx.pro/help/3886/