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.

cbaigorri
quelle

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);
Kenorb
quelle
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

Die Funktion heißt jetzt path_save () , ein Beispiel finden Sie unter path_taxonomy_term_insert () .

Berdir
quelle
4
Sie sollten diese Antwort wirklich erweitern, um nicht nur auf externe Ressourcen zu verlinken. Die Links waren jedoch nützlich, solange sie gültig bleiben.
DrCord
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;
    }
}
cbaigorri
quelle
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