2010-12-07 66 views
0

Je souhaite modifier le parent d'une arborescence de menus lors d'une mise à jour de nœud. J'utilise le module nommé « règles » pour accéder à l'événement de mise à jour et je le code comme suit:Comment changer l'élément de menu parent sans casser les enfants dans Drupal?

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."'"); 
} 

Le problème est que ce noeud $ qui est mise à jour a également quelques éléments du menu enfant sous elle, dans le menu principal et quand je mets à jour le nœud pour changer le parent, ses enfants finissent juste un niveau supérieur et ne sont pas déplacés avec l'élément de menu courant. Existe-t-il un moyen facile de déplacer un arbre de menu entier d'un élément de menu parent à un autre?

Je veux que ce,

- Parent1

-child1

--- sous-child1

--- sous-child2

- parent2

être le suivant:

- Parent1

- parent2

-child1

--- sous-child1

--- sous-enfant2

Pouvez-vous m'aider? Existe-t-il un moyen drupal de le faire? =)

Je sais que ce code fait beaucoup d'hypothèses, mais je en ai besoin juste pour un cas spécifique

+0

C'est une très mauvaise idée de mettre à jour "manuellement" la table de base de données et beaucoup de choses peuvent (et vont) arriver dans et autour du menu, les routeurs, le cache, les alias et beaucoup plus. Avez-vous/insistez/sur l'exécution de ce code de mise à jour de base de données? – berkes

+0

Non, c'était juste une mauvaise tentative. Je l'ai mis là juste pour clarifier ce que j'essaie vraiment de faire. –

Répondre

0

I figured it out en expérimentant avec l'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); 
?> 

juste besoin de comprendre que je ne devais pas faire face à ces "p0" à "p8" lors de l'enregistrement du nouvel élément de menu. Drupal semble déplacer automatiquement les enfants. En passant, je pourrais utiliser un moyen plus fiable d'obtenir mlid de l'élément de menu des noeuds.

-1

Utilisez l'API Drupal pour effectuer ces opérations; vous le trouverez beaucoup plus facile. Si vous vouliez le faire en utilisant des requêtes de base de données (ce que je dois absolument vous conseiller de ne pas faire), vous écririez un algorithme récursif qui a effectué le déplacement de l'arbre.

+0

Ceci est beaucoup mieux servi comme un commentaire. En guise de réponse, c'est très inutile. –

+0

Merci pour le conseil, j'apprécie vraiment mais j'ai déjà regardé à travers l'API et n'ai pas pu vraiment comprendre comment le faire.Pourriez-vous s'il vous plaît être plus précis? –