J'ai créé un crochet de pré-sauvegarde dans le module qui remplit mon nœud en récupérant des informations à partir de diverses API. Cependant, je n'arrive pas à comprendre comment ajouter un alias de nœud au nœud nouvellement créé. Y a-t-il une fonction ou un module ou quelque chose (Drupal 7 avait path_auto)? Ou devrais-je aller avec insert brut dans url_alias
? Puis-je me tirer une balle dans le pied avec un mouvement aussi drastique?
Pour créer l'alias, je vérifie d'abord si l'alias a été défini dans l'interface utilisateur, et s'il est vide, je l'ai défini manuellement à l'aide de l'étiquette ().
use Drupal\Core\Entity\EntityInterface;
/**
* hook_entity_insert
*/
function mymodule_entity_insert(EntityInterface $entity) {
// Convert to lowercase, trim spaces, replace spaces with underscore and then truncate to 60 chars.
$pathTitle = substr(str_replace(" ","_",trim(strtolower($entity->label()))),0,60);
if ($entity->toArray()['path'][0]['alias'] == "") {
$path = \Drupal::service('path.alias_storage')->save("/node/" . $entity->id(), "/mynewpath/" . $pathTitle, "en");
}
}
https://www.drupal.org/node/1853148 pour plus d'informations
En utilisant drupal 8, voici comment j'ai fait (après une recherche rapide dans le fichier pathauto.module):
Étape 1: créer le nœud
$node = Node::create([
'type' => 'article',
'title' => 'Test article',
'langcode' => 'en', // Get it however you want or hardcode it.
'uid' => [USER_ID] // Get it however you want.
]);
Étape 2: enregistrer le nœud
$node->save();
Étape 3: Insérez le chemin (assurez-vous que le module pathauto est installé et ajoutez un modèle pour le type de nœud donné)
pathauto_entity_insert($node)
Si vous devez mettre à jour le nœud par programmation, n'oubliez pas de mettre à jour son chemin: pathauto_entity_update($node)
et n'oubliez pas de le supprimer si vous supprimez le nœud (supprimez-le AVANT de supprimer le nœud bien sûr depuis le la référence sera perdue si vous ne le faites pas): pathauto_entity_delete($node)
Depuis Drupal 8.8, les alias de chemin sont désormais des entités et la méthode de création d'un nouvel alias a changé.
Pour enregistrer par programme un alias, vous pouvez procéder comme suit:
$path_alias = \Drupal\path_alias\Entity\PathAlias::create([
'path' => '/unaliased/path',
'alias' => '/aliased/path',
]);
$path_alias->save();
Pour obtenir une chaîne propre, vous pouvez utiliser cette fonction à partir du module Pathauto.
$clean_string = \Drupal::service('pathauto.alias_cleaner')->cleanString('Your very dirty string, with many URL un-friendly parts!');
Nous maintenons un module port non officiel du pathauto . Vous avez également besoin de token.module, que vous pouvez obtenir auprès de ici . Utilisez à vos risques et périls, la structure de configuration peut changer ou les mises à jour de base peuvent interrompre temporairement le module.
Le travail vient de commencer pour récupérer ces deux modules sur drupal.org.
Aussi, si vous allez simplement dans une entité de contenu personnalisé et que vous souhaitez ajouter l'alias du chemin d'URL au formulaire ...
fais juste
/**
* Implements hook_entity_base_field_info().
*/
function YOURMODULE_entity_base_field_info(EntityTypeInterface $entity_type) {
if (in_array($entity_type->id(), ['ENTITYID'], TRUE)) {
$fields['path'] = BaseFieldDefinition::create('path')
->setLabel(t('URL alias'))
->setTranslatable(TRUE)
->setDisplayOptions('form', [
'type' => 'path',
'weight' => 30,
])
->setDisplayConfigurable('form', TRUE)
->setComputed(TRUE);
return $fields;
}
}