web-dev-qa-db-fra.com

Définir l'alias d'URL par programme lors de la création d'un nœud dans le plugin de formulaire

J'importe actuellement des données à partir d'une base de données pour créer des nœuds à partir d'eux. Mon code de sauvegarde de nœud ressemble à ceci

$node = \Drupal\node\Entity\Node::create([
        'type'                 => 'issue',
        'title'                => $title,
        'body'                 => $body,
        'field_issue_category' => $term,
        'field_issue_type'     => 'publication',
        'field_pub_id'         => [
            'target_id'           => $publication_id,
        ],
        'field_issue_group' => $group_id,
        'field_date'        => $date,
    ]);
$node->save();

Je veux également créer un alias d'URL basé sur le titre de ce nœud, que je crée comme ça,

$nid       = $node->id();
$title     = preg_replace("/[\s_]/", "-", $title);
$path      = \Drupal::service('path.alias_storage')->save('/node/'.$nid, '/mypath/'.$title);

Cela a réussi à créer un alias d'URL qui apparaît dans la liste des alias d'URL dans la configuration d'alias d'URL. Cependant, il n'apparaît pas dans le champ d'alias d'URL sur la page de modification du nœud.

url alias field

Cela crée un problème. Premièrement, l'utilisateur ne peut pas voir quel est l'alias réel. J'ai également un plugin de bloc qui place chaque nœud de ce type dans une liste sur une page. Il affiche également l'URL de ce nœud. Je voudrais que l'URL affichée soit l'alias comme '/ mypath/title' mais Drupal ne semble connaître que le chemin '/ node/nid'.

Existe-t-il un moyen approprié de définir par programme un alias d'URL de nœuds afin qu'il apparaisse toujours dans le champ d'alias d'URL?

7
Matt

Le widget de nœud affiche actuellement uniquement les alias qui ont le même code de langue que le nœud. https://www.drupal.org/node/2511968 changera cela et affichera également les alias sans langue spécifique.

Mais si l'alias ne fonctionne pas non plus sur le site, cela ressemble à autre chose n'est pas encore correct. Cela fonctionne-t-il dans ce bloc si vous créez manuellement un alias dans l'interface utilisateur? Si oui, comparez les deux enregistrements de la table url_alias, voyez-vous une différence?

Vous pouvez créer un alias dans le cadre de l'enregistrement du nœud, il existe un champ pseudo/calculé de chemin. Essayez d'ajouter ceci à votre tableau:

'path' => [
  'alias' => '/mypath/' . $title,
  'pathauto' => PathautoState::SKIP,
]

Cela devrait également créer l'alias correctement.

Et enfin, si votre alias est si prévisible, vous devriez regarder Pathauto . Cela vous permet de définir des règles de création d'alias. Entre autres choses, il a une tonne de logique pour gérer les caractères spéciaux et les doublons, votre code aura un problème si vous avez deux nœuds avec le même titre, par exemple.

10
Berdir