【问题标题】:How to change the parent menu item without breaking the children in Drupal?如何更改父菜单项而不破坏 Drupal 中的子项?
【发布时间】:2010-12-07 18:31:02
【问题描述】:

我想在节点更新时更改菜单树的父级。我正在使用名为“规则”的模块来访问更新事件,我的代码如下:

if ($node->taxonomy[1] == "1") {
    $plid = 440;
} else if ($node->taxonomy[1] == "2") {
    $plid = 379;
}
if($plid) {
    db_query("UPDATE {menu_links} SET plid='".$plid."', p1='".$plid."' WHERE link_path='"."node/".$node->nid."'");
}

问题是这个更新的 $node 在它下面还有一些子菜单项,在主菜单中,当我更新节点以更改父节点时,它的子节点只是高一级而没有得到与当前菜单项一起移动。有没有一种简单的方法可以将整个菜单树从一个父菜单项移动到另一个父菜单项?

我想要这个,

-parent1

--child1

---sub-child1

---sub-child2

-parent2

变成这样:

-parent1

-parent2

--child1

---sub-child1

---sub-child2

你能帮帮我吗?有 Drupal 的方式吗? =)

我知道这段代码做了很多假设,但我只在一个特定情况下需要它

【问题讨论】:

  • “手动”更新数据库表是一个非常糟糕的主意,并且在菜单、路由器、缓存、别名和更多。你/坚持/运行这个数据库更新代码吗?
  • 不,这只是一次糟糕的尝试。我把它放在那里只是为了澄清我真正想做的事情。

标签: drupal menu tree move


【解决方案1】:

我通过试验 API 发现了这一点:

<?php
    $result = db_query("SELECT mlid FROM {menu_links} WHERE link_path='%s'", "node/".$node->nid);
    $oldItem = db_fetch_array($result);
    $oldLinkItem = menu_link_load($oldItem[mlid]);
    $oldLinkItem[plid] = $plid;
    menu_link_save($oldLinkItem);
?>

只需要弄清楚我在保存新菜单项时不必处理那些“p0”到“p8”。 Drupal 似乎会自动移动孩子。顺便说一句,我可以使用更可靠的方法来获取节点菜单项的 mlid。

【讨论】:

    【解决方案2】:

    使用 Drupal API 来执行这些操作;你会发现它更容易。如果你想使用数据库查询(我绝对建议你不要这样做),你可以编写一个递归算法来执行树的移动。

    【讨论】:

    • 这是一个更好的评论。作为答案,这是最没有帮助的。
    • 感谢您的建议,我真的很感激,但我已经查看了 API 并且无法真正弄清楚如何去做。你能说得更具体点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多