Erstellen Sie einen Pfadalias programmgesteuert, wenn ein Knoten erstellt wird


8

Ich habe einen benutzerdefinierten Inhaltstyp, der von einem Modul erstellt wird. Gibt es einen Hook, mit dem ich den Pfadalias meines benutzerdefinierten Inhaltstyps festlegen kann, wenn ein Knoten erstellt wird?

Eines meiner Felder ist ein alphanumerischer Code, den ich im Pfad verwenden möchte. zB: 'event / myc0d3'

Ich habe festgestellt, dass diese Funktion ( path_set_alias ) in 6 vorhanden ist, aber ich kann das Äquivalent für 7 nicht finden. Und weiß nicht, wo ich es aufrufen würde.

Antworten:


10

Anstatt Hook zu verwenden, sollte das Pathauto- Modul verwendet werden, in dem Sie ein bestimmtes Muster definieren können, wie Aliase pro Inhaltstyp (at /admin/config/search/path/patterns) generiert werden . Dort können Sie Ersatzmuster verwenden oder Ihre eigenen codieren. Es ist viel sauberer Ansatz.

Andernfalls können Sie versuchen hook_node_presave($node), den Alias ​​direkt zu ändern:

$node->path['pathauto'] = 0; // Required only if Pathauto is enabled.
$node->path['alias'] = "foo/bar";

oder nutzen Sie die path_save(&$path)Funktion direkt wie folgt:

$path = array('source' => "node/$node->nid", 'alias' => 'foo/bar');
path_save($path);

Bei mir hat nur beides in Kombination funktioniert, so dass am Ende innerhalb des Alias-Textfeldes der richtige Alias ​​geschrieben wird. Nur path_save () zu tun hat funktioniert, aber dann hatte ich den falschen Alias ​​im Alias-Textfeld bei der Knotenbearbeitung, sodass ich durch eine einfache erneute Speicherung wieder den falschen Alias ​​erhalten hätte.
Leymannx


9

hook_node_insert () funktionierte in meinem Fall nicht und bei einigen Suchanfragen kam ich auf diesen Blog-Beitrag . Ich habe hook_insert () auf die gleiche Weise und im Presto implementiert .

/**
 * Implements hook_insert().
 */
function mymodule_insert($node) {
    // Set the URL alias
    if (empty($node->path['alias'])) {
        $node->path['alias'] = 'slug/' . $node->nid;
    }
}

2
Zu bemerken, dass dies hook_insert()nur verwendet wird, wenn das Modul, das es implementiert, einen Inhaltstyp definiert; Der Hook kann nicht verwendet werden, um auf einen Knoten für einen Inhaltstyp zu wirken, der von einem anderen Modul definiert wurde.
Kiamlaluno

Dies ist genau der Grund, warum es nicht empfohlen wird, nur auf Artikel zu verlinken, sondern stattdessen die Antwort zu erweitern und die wichtigsten nützlichen Informationen aus diesen Artikeln zu extrahieren - dieser 'Blogpost'-Link ist nicht mehr gültig und führt zu einem 404
Titi

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.