Utwórz alias ścieżki programowo podczas tworzenia węzła

8

Mam niestandardowy typ zawartości, który jest tworzony przez moduł. Czy istnieje haczyk, którego można użyć do ustawienia aliasu ścieżki dla mojego niestandardowego typu treści podczas tworzenia węzła?

Jednym z moich pól jest kod alfanumeryczny i chcę go użyć na ścieżce. np .: „event / myc0d3”

Zauważyłem, że ta funkcja ( path_set_alias ) istniała w 6, ale nie mogę znaleźć odpowiednika dla 7. I nie wiem, jak ją nazwać.

cbaigorri
źródło

Odpowiedzi:

10

Zamiast używać hooka , należy użyć modułu Pathauto , w którym można zdefiniować określony wzorzec, w jaki sposób generowane są aliasy dla każdego typu zawartości (at /admin/config/search/path/patterns). Tam możesz użyć wzorów zastępczych lub zakodować własny. To znacznie czystsze podejście.

W przeciwnym razie możesz spróbować hook_node_presave($node)zmienić alias bezpośrednio:

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

lub użyj path_save(&$path)funkcji bezpośrednio jak poniżej:

$path = array('source' => "node/$node->nid", 'alias' => 'foo/bar');
path_save($path);
kenorb
źródło
Dla mnie działały tylko obie kombinacje, więc na końcu wewnątrz pola tekstowego aliasu zapisywany jest odpowiedni alias. Wykonanie tylko path_save () działało, ale potem miałem zły alias w polu tekstowym aliasu podczas edycji węzła, więc zwykłe ponowne zapisanie spowodowałoby, że ponownie otrzymałem niewłaściwy alias.
leymannx,
9

Funkcja nazywa się teraz path_save () , patrz przykład path_taxonomy_term_insert () .

Berdir
źródło
4
powinieneś naprawdę rozszerzyć tę odpowiedź, aby nie tylko link do zasobów zewnętrznych, ale linki, o ile pozostają ważne, były przydatne.
DrCord,
9

hook_node_insert () nie działał w moim przypadku i przy niektórych wyszukiwaniach wymyśliłem ten post na blogu . Zaimplementowałem hook_insert () w ten sam sposób i presto.

/**
 * Implements hook_insert().
 */
function mymodule_insert($node) {
    // Set the URL alias
    if (empty($node->path['alias'])) {
        $node->path['alias'] = 'slug/' . $node->nid;
    }
}
cbaigorri
źródło
2
Zauważ, że hook_insert()jest używane tylko wtedy, gdy moduł implementujący go definiuje typ zawartości; haka nie można użyć do działania na węźle dla typu zawartości zdefiniowanego w innym module.
kiamlaluno
to jest właśnie powód, dla którego nie zaleca się po prostu linkowania do artykułów, ale zamiast tego rozwinąć odpowiedź i wyodrębnić główne przydatne informacje z tych artykułów - ten link „post na blogu” nie jest już ważny i powoduje 404
Titi