it-swarm.com.de

Ändern Sie URL-Aliase programmgesteuert

Ich habe ein Muster eingerichtet, um die URL-Aliase basierend auf einem Feld mit Typlistentext zu erstellen.

das Feld sieht so aus:

auswahl 1 | Auswahl 1

auswahl 2 | Auswahl 2

Wie kann ich den Alias ​​so ändern, dass er ungefähr Folgendes anzeigt:

www.example.com/1- wurde ausgewählt und nicht www.example.com/selection-1

UPDATE: Ich benutze Pathauto für die Muster.

2
Florin Simion

Ich würde ein benutzerdefiniertes Token erstellen und dieses in meinem Alias ​​verwenden. Ich gehe davon aus, dass Sie pathauto verwenden, um Ihre Aliase zu erstellen. Diese Seite gibt ein ziemlich gutes Beispiel dafür, wie Sie Ihr eigenes Token erstellen. Dann können Sie Ihr Token in der Pathauto-Benutzeroberfläche auswählen.

Sie können den hook_tokens_info -Hook im Grunde genau so erstellen, wie sie es getan haben, aber den "Zoll" durch Ihre tatsächlichen Werte ersetzen. Für Ihre Implementierung von hook_tokens sollten Sie Zugriff auf die Entität in der Variablen $data Haben, d. H. $data['node'] Hat Ihr Knotenobjekt, wenn Sie dies für Knoten verwenden. Von dort aus sollten Sie in der Lage sein, $data['node']->field_your_list_field->getValue() auszuführen, um den Wert Ihres Feldes zu ermitteln. Stellen Sie nur sicher, dass Sie ein $replacements - Array zurückgeben, in dem der Schlüssel Ihr custom_token und der Wert der zu ersetzende Wert ist. In Ihrem Fall wäre dies etwa you-selected-value-X.

3
sonfd

In diesem Fall sollten Sie ein Token in einem Custome-Modul erstellen. Todo also solltest du hook_token_info () und dann hook_tokens () implementieren.

Oder vielleicht könnten Sie sich hook_tokens_alter () ansehen und auf das Token abzielen, das Sie tatsächlich in Ihrem Muster verwenden, um dessen Rendering zu ändern.

beispiel von durpal.org:

function hook_tokens_alter(array &$replacements, array $context, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {
  $options = $context['options'];

  if (isset($options['langcode'])) {
    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
    $langcode = $options['langcode'];
  }
  else {
    $langcode = NULL;
  }

  if ($context['type'] == 'node' && !empty($context['data']['node'])) {
    $node = $context['data']['node'];

    // Alter the [node:title] token, and replace it with the rendered content
    // of a field (field_title).
    if (isset($context['tokens']['title'])) {
      $title = $node->field_title->view('default');
      $replacements[$context['tokens']['title']] = drupal_render($title);
    }
  }
}
2