Ist es möglich, einem programmgesteuert erstellten Knoten programmgesteuert einen Pfadalias hinzuzufügen?


11

Ich habe einen Pre-Save-Hook im Modul erstellt, der meinen Knoten durch Abrufen von Informationen aus verschiedenen APIs auffüllt. Ich kann mir jedoch nicht vorstellen, wie ich einem neu erstellten Knoten einen Knotenalias hinzufügen soll. Gibt es eine Funktion oder ein Modul oder etwas (Drupal 7 hatte path_auto)? Oder sollte ich mit rohem Einsatz in gehen url_alias? Könnte ich mich mit einer so drastischen Bewegung in den Fuß schießen?


2
Ich denke noch keine D8-Version für diese Art von Modulen. Sie können dies programmgesteuert unter drupal.org/node/1853148 tun .
Sumit Madan

Genial, das habe ich gesucht.
Bogdan Kuštan

Übrigens ist Ihr Profilbild zu süß, Mann .. :)
Sumit Madan

Antworten:


11

Um den Alias ​​zu erstellen, überprüfe ich zuerst, ob der Alias ​​in der Benutzeroberfläche festgelegt wurde, und wenn er leer ist, setze ich ihn manuell mithilfe von label ().

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

Weitere Informationen finden Sie unter https://www.drupal.org/node/1853148


4

Mit Drupal 8 habe ich Folgendes getan (nach einer kurzen Suche in der Datei pathauto.module ):

Schritt 1: Erstellen Sie den Knoten

$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.
]);

Schritt 2: Speichern Sie den Knoten

$node->save();

Schritt 3: Fügen Sie den Pfad ein (stellen Sie sicher, dass das Pathauto-Modul installiert ist, und fügen Sie ein Muster für den angegebenen Knotentyp hinzu).

pathauto_entity_insert($node)

Wenn Sie den Knoten programmgesteuert aktualisieren müssen, vergessen Sie nicht, seinen Pfad zu aktualisieren: pathauto_entity_update($node)und vergessen Sie nicht, ihn zu löschen, wenn Sie den Knoten löschen (löschen Sie ihn, BEVOR Sie den Knoten natürlich löschen, da die Referenz verloren geht, wenn Sie ihn nicht verwenden tu das nicht):pathauto_entity_delete($node)



3

Ab Drupal 8.8 sind Pfad-Aliase jetzt Entitäten, und die Methode zum Erstellen eines neuen Alias ​​hat sich geändert.

Um einen Alias ​​programmgesteuert zu speichern, haben Sie folgende Möglichkeiten:

$path_alias = \Drupal\path_alias\Entity\PathAlias::create([
  'path' => '/unaliased/path',
  'alias' => '/aliased/path',
]);

$path_alias->save();


1

Wir unterhalten einen inoffiziellen Port des Pathauto- Moduls. Sie benötigen auch token.module, das Sie von hier erhalten können . Die Verwendung erfolgt auf eigenes Risiko, die Konfigurationsstruktur kann sich ändern oder Kernaktualisierungen können das Modul vorübergehend beschädigen.

Die Arbeit hat gerade begonnen, um diese beiden Module wieder auf drupal.org zu bringen.


Es scheint, dass Sie vergessen haben, Links in Ihren Beitrag zu setzen :)
Krishna Mohan

Kopieren und Einfügen schlägt fehl (von drupal.stackexchange.com/questions/144227/… ) danke.
Berdir

0

Auch wenn Sie nur eine benutzerdefinierte Inhaltsentität verwenden und dem Formular den URL-Pfad-Alias ​​hinzufügen möchten ...

mach einfach

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

}}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.