以编程方式在Joomla中创建菜单项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式在Joomla中创建菜单项相关的知识,希望对你有一定的参考价值。

我在joomla 2.5中创建了一个组件,它创建了一篇新文章并将该文章添加到菜单项中。

创建文章工作正常,但我在创建菜单项时遇到了一些麻烦。

我有以下代码:

                //add the article to a menu item
                $menuTable = JTable::getInstance('Menu', 'JTable', array());

                    $menuData = array(
                    'menutype' => 'client-pages',
                    'title' => $data[name],
                    'type' => 'component',
                    'component_id' => 22,                  
                    'link' => 'index.php?option=com_content&view=article&id='.$resultID,
                    'language' => '*',
                    'published' => 1,
                    'parent_id' => '1',
                    'level' => 1,
                );

                // Bind data
                if (!$menuTable->bind($menuData))
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Check the data.
                if (!$menuTable->check())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Store the data.
                if (!$menuTable->store())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

错误似乎与设置parent_id和级别有关。在调试库/ joomla / database / tablenested.php时,将parent_id和level设置为0.这会在我的管理员页面上导致以下错误:

警告:str_repeat()[function.str-repeat]:/Applications/MAMP/htdocs/joomla_2_5/administrator/components/com_menus/views/items/tmpl/default.php中的第二个参数必须大于或等于0第129行

答案

尝试使用JTableNested::setLocation($referenceId, $position = 'after'):

$table->setLocation($parent_id, 'last-child');

我还认为你需要重建路径:

// Rebuild the tree path.
if (!$table->rebuildPath($table->id)) {
    $this->setError($table->getError());
    return false;
}

如果它仍然不起作用,试着找出你没有做的MenusModelItem::save

另一答案
$table->setLocation($parent_id, 'last-child');

是确保为新菜单项正确创建左/右值所需的全部内容。无需重建路径,因为现在由JTableMenu的store方法处理。

另外,方便方法“save”可用于绑定,检查和存储菜单项:

$menuItem = array(
            'menutype' => 'client-pages',
            'title' => $data[name],
            'type' => 'component',
            'component_id' => 22,                  
            'link' => 'index.php?option=com_content&view=article&id='.$resultID,
            'language' => '*',
            'published' => 1,
            'parent_id' => $parent_id,
            'level' => 1,
        );

$menuTable = JTable::getInstance('Menu', 'JTable', array());

$menuTable->setLocation($parent_id, 'last-child');

if (!$menuTable->save($menuItem)) {
    throw new Exception($menuTable->getError());
    return false;
}
另一答案

不知何故,$menutable不会更新数据库表中的parent_idlevel,因此您必须通过joomla查询手动更新这两个字段。

$menuTable = JTable::getInstance('Menu', 'JTable', array());

        $menuData = array(
            'menutype' => 'client-pages',
            'title' => $data[name],
            'type' => 'component',
            'component_id' => 22,                  
            'link' => 'index.php?option=com_content&view=article&id='.$resultID,
            'language' => '*',
            'published' => 1,
            'parent_id' => '1',
            'level' => 1,
        );

        // Bind data
        if (!$menuTable->bind($menuData))
        {
            $this->setError($menuTable->getError());
            return false;
        }

        // Check the data.
        if (!$menuTable->check())
        {
            $this->setError($menuTable->getError());
            return false;
        }

        // Store the data.
        if (!$menuTable->store())
        {
            $this->setError($menuTable->getError());
            return false;
        }

        $db   = $this->getDbo();
        $qry = "UPDATE `#__menu` SET `parent_id` = 1 , `level` = 1 WHERE `id` = ".$menuTable->id;
        $db->setQuery($qry);
        $db->query();
另一答案

这段代码对我有用

 JTable::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_menus/tables/');

                $menuTable =& JTable::getInstance('menu', 'menusTable');

                $menuData = array(
                        'menutype' => 'client-pages',
                        'title' => 'mytrialmenu',
                        'type' => 'component',
                        'component_id' => 22,
                        'link' => 'index.php?option=index.php?                    option='com_content&view=article&id='.$resultID,
                        'language' => '*',
                        'published' => 1,
                        'parent_id' => 'choose some parent',
                        'level' => 1,
                );
                // Bind data
                if (!$row->bind($menuData))
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Check the data.
                if (!$row->check())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Store the data.
                if (!$row->store())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

我认为原因是menusTable扩展了JnestedTable,这是操作菜单表中的lft和rgt字段所必需的

以上是关于以编程方式在Joomla中创建菜单项的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 菜单项特定模块不工作

在 Joomla 中以编程方式创建菜单层次结构

创建一个Joomla!文章以编程方式

Joomla 3.0 创建虚拟菜单项

joomla 菜单管理器自定义组件

MenuItem 以编程方式排序