web-dev-qa-db-fra.com

Est-il possible d'ajouter par programme un alias de chemin à un nœud créé par programme?

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?

11
Bogdan Kuštan

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

11
Jason Pascoe

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)

4
ZyDucksLover

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();
2
Jaypan

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!');

Source: Drupal: nettoyer une chaîne à utiliser dans les URL

2
alperbalkaya

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.

1
Berdir

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;
}

}

0
Taggart Jensen