4

我一直在为 Joomla 1.7.x 开发一个组件,在开发过程中我需要向管理菜单添加新的组件菜单项,通过在 Joomla 1.5 中向 DB 中的组件表中添加新行很容易,但现在添加起来似乎很复杂由于 Joomla 1.7 中的数据库结构更改,通过向菜单表添加新行来创建菜单项

有没有一种简单的方法可以在不重新安装组件的情况下做到这一点?

谢谢

4

4 回答 4

3

我发现的最简单的方法:

$table = JTable::getInstance('menu');

$data = array();
$data['menutype'] = 'main';
$data['client_id'] = 1;
$data['title'] = 'ITEM TITLE';
$data['alias'] = 'com-component-name';
$data['link'] = 'index.php?option=com_component_name&view=default';
$data['type'] = 'component';
$data['published'] = '0';
$data['parent_id'] = '117'; // ID, under which you want to add an item
$data['component_id'] = '10026'; // ID of the component
$data['img'] = 'components/com_component_name/assets/images/icon.png';
$data['home'] = 0;

if (
        !$table->setLocation(117, 'last-child') // Parent ID, Position of an item
    || !$table->bind($data) 
    || !$table->check() 
    || !$table->store()
){
    // Install failed, warn user and rollback changes
    JError::raiseWarning(1, $table->getError());
    return false;
}

删除:

$table->delete(120); // item ID
$table->rebuild();

基于http://docs.joomla.org/Using_nested_sets#Adding_a_new_node

于 2012-10-28T13:48:50.177 回答
0

这是我想出的一些 SQL 查询,它们起到了作用(仅显示了相关部分):

SET @lastRgt := (SELECT rgt + 1 FROM #__menu WHERE alias="alias-of-preceding-menu-item");

UPDATE #__menu SET rgt=rgt+2 WHERE rgt > @lastRgt;
UPDATE #__menu SET lft=lft+2 WHERE lft > @lastRgt;

INSERT INTO #__menu (menutype, title, alias, path, link, type, published, parent_id, level, component_id, img, client_id, params, access, lft, rgt)
VALUES(..., @lastRgt+1, @lastRgt+2);

在 Joomla 2.5 上为我工作。

于 2013-05-09T22:28:21.603 回答
0

Joomla 1.6+ 菜单项存储在#__menu 表下,管理菜单有一个称为“主”的特殊菜单类型。

找到您的主要组件管理菜单项的 ID。您可以通过将 parent_id 列声明为主菜单项的 id 并将 level 列设置为 2 来添加子项。

您将遇到的唯一其他问题是采用嵌套集(lft 和 rgt 列)。这是处理父子关系和菜单项排序的更好方法。我不确定在这个阶段是否使用了 parent_id 或 lft/rgt,但它们都被填写了。

要添加新项目,您必须将所有 lft/rgt 值“分流”两个,以便菜单项的值大于或等于您希望添加菜单项的位置。这应该包括您的父项的 rgt。如果您的父项没有子项,则新项的 lft 将是父项 left 的值 + 1。新项的 rgt 的值将是父项的 lft + 2。

使用 lft 和 rgt 需要注意的一点是,编号适用于每个菜单项(前端和后端),因此不正确执行可能会破坏整个菜单层次结构。我认为这就是为什么仍然使用 parent_id 列的原因,并且管理区域中有一个选项可以“重建”菜单。

http://en.wikipedia.org/wiki/Nested_set_model

于 2012-01-24T15:04:41.367 回答
0

承认的答案是需要更新 Joomla 3.x

我确信它对于较旧的 Joomla 版本是正确的,这就是我不编辑它的原因。

经过进一步的研究和编辑,这对我有用。

$table = JTableNested::getInstance('Menu');
$data = array();
$data['menutype'] = 'main';
$data['client_id'] = 1;
$data['title'] = 'ITEM TITLE';
$data['alias'] = 'com-component-name'; 
$data['link'] = 'index.php?option=com_component_name&view=default';
$data['type'] = 'component';
$data['published'] = '0';
$data['parent_id'] = '117'; // ID, under which you want to add an item
$data['component_id'] = '10026'; // ID of the component
$data['img'] = 'components/com_component_name/assets/images/icon.png';
$data['home'] = 0;
$table->setLocation(117, 'last-child') // Parent ID, Position of an item
if (!$table->bind($data) || !$table->check() || !$table->store()) {
    // Install failed, warn user and rollback changes
    JError::raiseWarning(1, $table->getError());
    return false;
}
于 2016-09-25T05:41:05.277 回答