Files
kupshop/class/smarty_plugins/function.insert_menu.php
2025-08-02 16:30:27 +02:00

213 lines
5.9 KiB
PHP

<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: eval
* Purpose: evaluate a template variable as a template
* -------------------------------------------------------------
*/
use KupShop\ContentBundle\Util\MenuUtil;
use KupShop\KupShopBundle\Context\LanguageContext;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
function fetchMenuLinks($parent_id = 0, $level = 0)
{
$menuLinks = [];
$languageContext = ServiceContainer::getService(LanguageContext::class);
$qb = sqlQueryBuilder()
->select('ml.*')
->from('menu_links', 'ml')
->andWhere(
\Query\Translation::joinTranslatedFields(
\KupShop\I18nBundle\Translations\MenuLinksTranslation::class,
function ($qb, $columnName, $translatedField, $langID) use ($languageContext) {
if ($columnName === 'name_short' && $langID != $languageContext->getDefaultId()) {
$translatedField = $translatedField ?? 'ml.'.$columnName; // no translations
$qb->addSelect("{$translatedField} AS `{$columnName}`");
return false;
}
return;
},
['name', 'name_short', 'link', 'url', 'figure']
)
)
->orderBy('list_order', 'ASC');
if ($parent_id > 0) {
$qb->andWhere(\Query\Operator::equals(['parent' => $parent_id]));
} else {
$qb->andWhere('ml.parent IS NULL AND ml.id=ml.id_menu');
}
$SQL = $qb->execute();
foreach ($SQL as $row) {
if ($row['figure'] == 'N') {
continue;
}
$url = ($row['type'] == MenuUtil::TYPE_PAGE) ? createScriptURL(['URL' => $row['url']]) : $row['link'];
$url = htmlspecialchars($url);
if ($parent_id === 0 && $level === 0) {
$item = fetchMenuLinks($row['id'], $level);
} else {
$item = [
'id' => $row['id'],
'title' => !empty($row['name_short']) ? $row['name_short'] : $row['name'],
'url' => $url,
'target' => $row['target'],
'children' => fetchMenuLinks($row['id'], $level + 1),
'level' => $level,
'selected' => false,
'data' => json_decode($row['data'] ?? '', true) ?? [],
];
}
$menuLinks[$row['id']] = $item;
}
unset($row);
sqlFreeResult($SQL);
return $menuLinks;
}
function updateMenuLinks(&$menu)
{
global $ctrl;
$selected = false;
$currUrl = html_entity_decode($ctrl['currUrl']['Abs']);
$currUrlRel = html_entity_decode($ctrl['currUrl']['Rel']);
foreach ($menu as &$submenu) {
$itemSelected = false;
// Select if subitem selected
if (!empty($submenu['children'])) {
$itemSelected |= updateMenuLinks($submenu['children']);
}
// Select if url matches
$decodedUrl = html_entity_decode($submenu['url']);
$itemSelected |= $decodedUrl == $currUrl || $decodedUrl == $currUrlRel;
$submenu['selected'] = $itemSelected;
$selected |= $itemSelected;
}
return $selected;
}
function smarty_function_insert_menu($params, &$smarty)
{
$default = [
'level' => 0,
'level_max' => 99,
'template' => 'block.menu.tpl',
'menu_id' => 1,
'submenu' => [],
];
$params = array_merge($default, $params);
// Get Own Menu structures
static $menuLinks = null;
$languageContext = ServiceContainer::getService(LanguageContext::class);
$cacheName = 'menu-'.$languageContext->getActiveId();
if (empty($menuLinks)) {
$menuLinks = getCache($cacheName);
}
if (empty($menuLinks)) {
$menuLinks = fetchMenuLinks();
setCache($cacheName, $menuLinks);
}
// discover menu_id by label
static $menuLabels = null;
if (is_null($menuLabels)) {
$menuLabels = getCache('menu-groupLabels');
if (empty($menuLabels)) {
$menuLabels = sqlFetchAll(
sqlQueryBuilder()->select('id, code')->from('menu_links')
->where('type=:type AND code IS NOT NULL')
->setParameter('type', MenuUtil::TYPE_GROUP)->execute(),
['code' => 'id']
);
setCache('menu-groupLabels', $menuLabels);
}
}
if (!empty($params['label']) && isset($menuLabels[$params['label']])) {
$params['menu_id'] = $menuLabels[$params['label']];
} elseif (!empty($params['label'])) {
return "Neznámý label: {$params['label']}";
}
if (!isset($menuLinks[$params['menu_id']])) {
return "Neznámé menu_id: {$params['menu_id']}";
}
// Get correct menu
$menu = $menuLinks[$params['menu_id']];
$parent = null;
updateMenuLinks($menu);
if (!empty($params['submenu'])) {
foreach ($params['submenu'] as $item) {
$parent = $menu[$item];
$menu = $parent['children'];
}
} elseif ($params['level'] > 0) {
for ($i = 0; $i < $params['level']; $i++) {
$selected = null;
foreach ($menu as $submenu) {
if ($submenu['selected']) {
$selected = $submenu;
break;
}
}
if (empty($selected)) {
return;
}
$parent = $selected;
$menu = $selected['children'];
}
}
$params['file'] = $params['template'];
$params['menu'] = $menu;
$params['parent'] = $parent;
$_smarty_tpl_vars = $smarty->tpl_vars;
echo $smarty->_subTemplateRender(
$params['file'],
$smarty->cache_id,
$smarty->compile_id,
0,
null,
$params,
0,
false
);
$smarty->tpl_vars = $_smarty_tpl_vars;
}
/* vim: set expandtab: */