我正在尝试编辑输出joomla main_menu模块,以便我可以创建自定义下拉菜单。目前它输出的html如下:
<ul class="menu">
<li class="active item1" id="current"><a href="#"><span>First Level Item </span</a></li>
<li class="parent item63"><a href="#"><span>First Level Item Parent</span></a>
<ul>
<li class="item60"><a href="#"><span>Second Level Item</span></a></li>
<li class="item69"><a href="#"><span>Second Level Item</span></a></li>
</ul>
</li>
<li class="item64"><a href="#"><span>First Level Item</span></a></li>
<li class="item66"><a href="#"><span>First Level Item</span></a></li>
我想要删除输出的span标记。
到目前为止我所知道的是,如果我想编辑输出;在我的模板文件夹中,我创建一个名为'html'的目录,然后在一个名为'mod___mainmenu'的新目录中,然后从modules目录中的现有mod_mainmenu文件夹中复制default.php文件。我对文件所做的所有更改都会改变输出。
我遇到的问题是我无法理解default.php文件中编写的代码发生了什么,因为它使用了一些我不熟悉的XML系统,并且没有任何注释。
如果有人有任何超级有用的想法!
以下是菜单default.php文件中的代码:
defined('_JEXEC') or die('Restricted access');
if ( ! defined('modMainMenuXMLCallbackDefined') )
{
function modMainMenuXMLCallback(&$node, $args)
{
$user = &JFactory::getUser();
$menu = &JSite::getMenu();
$active = $menu->getActive();
$path = isset($active) ? array_reverse($active->tree) : null;
if (($args['end']) && ($node->attributes('level') >= $args['end']))
{
$children = $node->children();
foreach ($node->children() as $child)
{
if ($child->name() == 'ul') {
$node->removeChild($child);
}
}
}
if ($node->name() == 'ul') {
foreach ($node->children() as $child)
{
if ($child->attributes('access') > $user->get('aid', 0)) {
$node->removeChild($child);
}
}
}
if (($node->name() == 'li') && isset($node->ul)) {
$node->addAttribute('class', 'parent');
}
if (isset($path) && in_array($node->attributes('id'), $path))
{
if ($node->attributes('class')) {
$node->addAttribute('class', $node->attributes('class').' active');
} else {
$node->addAttribute('class', 'active');
}
}
else
{
if (isset($args['children']) && !$args['children'])
{
$children = $node->children();
foreach ($node->children() as $child)
{
if ($child->name() == 'ul') {
$node->removeChild($child);
}
}
}
}
if (($node->name() == 'li') && ($id = $node->attributes('id'))) {
if ($node->attributes('class')) {
$node->addAttribute('class', $node->attributes('class').' item'.$id);
} else {
$node->addAttribute('class', 'item'.$id);
}
}
if (isset($path) && $node->attributes('id') == $path[0]) {
$node->addAttribute('id', 'current');
} else {
$node->removeAttribute('id');
}
$node->removeAttribute('level');
$node->removeAttribute('access');
}
define('modMainMenuXMLCallbackDefined', true);
}
modMainMenuHelper::render($params, 'modMainMenuXMLCallback');
答案 0 :(得分:6)
您应该尽可能避免编辑核心文件,以避免在升级时覆盖您的更改。改为使用模板覆盖文件。
当我遇到这个时,我想为每个菜单项添加并清空em标签以允许Gilder/Levin image replacement。在我的html覆盖({templatedir} \ html \ mod_mainmenu \ default.php)中,我用输出缓冲区包围了对modMainMenuHelper :: render(最后一行,基本上)的调用,并使用一个简单的str_replace来添加em标签: / p>
ob_start();
modMainMenuHelper::render($params, 'modMainMenuXMLCallback');
$mainMenuContent = ob_get_clean();
echo str_replace('</span>', '</span><em></em>', $mainMenuContent);
由于你只想摆脱span标签,你可以这样做:
ob_start();
modMainMenuHelper::render($params, 'modMainMenuXMLCallback');
$mainMenuContent = ob_get_clean();
echo str_replace(array('<span>','</span>'), array('',''), $mainMenuContent);
答案 1 :(得分:2)
事实证明,span标签是在一个完全不同的文件中添加的。
如果你去modules / mod_mainmenu目录,有一个helper.php文件,它也控制一些输出。
在第285和293行,代码中有一些span标记。删除那些使输出按我想要的方式工作。