我一直在为Joomla 1.7.x开发一个组件,在开发过程中我需要在管理菜单中添加新的组件菜单项,通过在Joomla中向DB中的组件表添加新行很容易1.5次,但现在看来由于Joomla 1.7中的数据库结构更改
,因此通过向菜单表添加新行来添加菜单项很复杂有没有一种简单的方法可以在不重新安装组件的情况下执行此操作?
感谢
答案 0 :(得分: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
答案 1 :(得分:0)
Joomla 1.6+菜单项存储在#__menu表下,管理菜单中有一个名为“main”的特殊菜单类型。
找到主要组件管理员菜单项的ID。您可以通过将parent_id列声明为主菜单项的ID并将level列设置为2来添加其子项。
您将遇到的唯一其他问题是采用嵌套集(lft和rgt列)。这是处理父子关系和菜单项排序的更好方法。我不确定在这个阶段是否使用了parent_id或lft / rgt,但它们都被填写了。
要添加新项目,您必须将所有lft / rgt值“分流”为两个菜单项,其值大于或等于您希望添加菜单项的位置。这应该包括您父项的rgt。如果您的父项目没有子项,则新项目的lft将是父项左侧的值+1。新项目的rgt的值将是父项的lft + 2。
lft和rgt需要注意的一点是,编号适用于每个菜单项(前端和后端),因此如果不正确,可能会破坏整个菜单层次。我认为这就是仍然使用parent_id列的原因,并且管理区域中有一个选项可以“重建”菜单。
答案 2 :(得分: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工作。
答案 3 :(得分:0)
Admit的回答需要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;
}