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?

Bogdan Kuštan
quelle
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

Jason Pascoe
quelle
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)

ZyDucksLover
quelle
drupal.stackexchange.com/questions/216972/… war der fehlende Schlüssel für mich.
Francis Yaconiello
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();
Jaypan
quelle
2

Um eine saubere Zeichenfolge zu erhalten, können Sie diese Funktion aus dem Pathauto-Modul verwenden.

$clean_string = \Drupal::service('pathauto.alias_cleaner')->cleanString('Your very dirty string, with many URL un-friendly parts!');

Quelle: Drupal: Bereinigen Sie eine Zeichenfolge zur Verwendung in URLs

Alperbalkaya
quelle
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.

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

}}

taggartJ
quelle