it-swarm.com.de

Programmgesteuertes Setzen eines Links

Ich versuche, einen Link programmgesteuert in einer Ansicht Drupal 8) festzulegen. Der Client möchte, dass ein externer Link verwendet wird, wenn ein bestimmtes Linkfeld festgelegt ist. Andernfalls wird standardmäßig der Link zum Knoten verwendet.

Ich versuche herauszufinden, wie dies festgelegt werden soll, und obwohl ich mir hook_views_pre_render () und hook_views_post_render () anschaue, sehe ich keine Methode, um dies zu erreichen. Ich versuche ins Ergebnis zu gehen -

foreach ($view->result as $key => $value) {

}

Kint gibt mir jedoch folgende Daten:

public _relationship_entities -> array(0)
public index -> integer7
public node_field_data_langcode -> string(2) "en"
public nid -> string(2) "99"

für jede ResultRow.

Ich erinnere mich nicht, dass dies in Drupal 7 - besonders fehlt - fehlt mir hier etwas? Wie setze ich programmgesteuert einen Link in Drupal 8)? abhängig von bestimmten Bedingungen für eine Ansichtszeile/ein Feld in einer Zeile?

4
Jack Ryan

Der gesuchte Hook ist hook_views_view_field ().

Mit diesem Hook können Sie die Ausgabe des Felds ändern und sind noch früh genug, um die Entitätsdaten für dieses Feld zu haben.

Im folgenden Beispiel überprüfe ich, ob der Knoten ein Verknüpfungsfeld hat, field_my_link set, und wenn es festgelegt ist, ändere ich die Titelausgabe (die normalerweise mit dem Knoten verknüpft ist), um sie an die URL des Verknüpfungsfelds auszugeben, aber nur dann, wenn Es ist ein externer Link.

function mymodule_preprocess_views_view_field(&$vars) {
  if ($vars['view']->id() != 'testview') {
    return;
  }
  $node = $vars['row']->_entity;
  if ($vars['field']->getField() == '.title' && $node->field_my_link->isEmpty() === FALSE) {
    if ($node->field_my_link[0]->isExternal()) {
      $link = $node->field_my_link[0]->view();
      $link['#title'] = $node->label();
      $vars['output'] = $link;
    }
  }
}

Wenn Sie die Ausgabe eines Ansichtsfelds basierend auf der Ausgabe eines anderen ändern möchten, verwenden Sie hook_views_view_fields ():

function mymodule_preprocess_views_view_fields(&$vars) {
  if ($vars['view']->id() != 'testview') {
    return;
  }

  // Cast Markup object to string.
  $field_one_content = (string) $vars['fields']['field_1']->content;

  // Check if first field contains a substring, if so, update second field.
  if (strpos($field_one_content, 'my search string') > -1) {
    $vars['fields']['field_2']->content = \Drupal\Core\Render\Markup::create('hello world');
  }

}
7
oknate

Wenn Sie die Ansicht so konfigurieren können, dass "gerenderter Inhalt" anstelle von Feldern verwendet wird, ist es möglicherweise ganz einfach, einen Ansichtsmodus zu erstellen, die angezeigten Felder zu konfigurieren und dann ein node--node-type--view-mode.html.twig Vorlage. Anschließend können Sie den Knoten im Ansichtsmodus vorverarbeiten und Variablen hinzufügen/überprüfen, bevor sie in der Vorlage gerendert werden.

Ich sage das, weil es einfacher ist, als mit Ansichten auf dieser Ebene zu ringen.

Hier sind ähnliche Fragen, die sich um solche Dinge drehen:

Dann können Sie diesen Ansichtsmodus in anderen Bereichen wiederverwenden und neue Ansichten erstellen, um diesen Ansichtsmodus zu verwenden, ohne alle Ansichtsfelder zu konfigurieren und dieselben Überschreibungen immer wieder vorzunehmen. Und wie Sie sehen, ist das Debuggen schwierig. Das Debuggen auf Knoten-/Ansichtsmodusebene ist jedoch viel einfacher.

1
Kevin

Ein Rezept dafür über die Views-Benutzeroberfläche

Sie benötigen 3 Felder,

  • eine, um die NID zu bekommen
  • eine, um den field_certain_link zu erhalten
  • eine, um den Link zu rendern

Sie richten jedes Feld folgendermaßen ein:

a) NID-Feld: Ausblenden vor der Anzeige.

b) field_certain_link: Blendet es aus der Anzeige aus und schreibt seinen Wert neu, um den rohen URI zu sein, z. {{ field_certain_link__uri }}. Sie müssen einen Umschreibwert für den Teil ohne Ergebnisse festlegen. Dies sollte node/{{ nid }} Sein, wobei nid aus dem ersten Feld stammt.

c) Dies ist ein Ansichtsfeld "Global: Benutzerdefinierter Text". Geben Sie den Text des Links ein und wählen Sie die Option Umschreiben> Ausgabe als benutzerdefinierte Linkoption. Der Wert des Links sollte der Wert des field_certain_link sein, etw wie {{ field_certain_link }}

Die Ansichtskonfiguration sollte jetzt wie folgt aussehen (Abschnitt Felder):

(enter image description here

Nachdem Sie fertig sind, wird Ihr benutzerdefiniertes Textfeld als Link gerendert und abhängig vom Wert von field_certain_link mit dem externen Link oder dem Knoten verknüpft.

Dies sollte folgendermaßen aussehen (erste und zweite Spalte sind nur aus Debugging-Gründen sichtbar). Die zweite Spalte zeigt das bedingte Umschreiben des Felds, je nachdem, ob ein Wert festgelegt wurde oder nicht. Die erste Zeile hat keinen Wert für das Feld field_certain_link festgelegt und ist daher mit dem Knoten verknüpft:

(enter image description here

Viel Glück!

P.: Sie könnten wahrscheinlich nur ein Feld verwenden und mit twig, um die Bedingungen zu schreiben. Dies ist eigentlich ein D7-Rezept.

1

Möglicherweise müssen Sie einen benutzerdefinierten Ansichtsformatierer erstellen. Diese Plugins nehmen die von einer Ansicht zurückgegebenen Daten und bereiten sie für die Anzeige auf der Seite vor. Die Formatierer 'Table' und 'Grid' sind Beispiele. Ich habe kürzlich eine erstellt, um die Ergebnisse aus einer Ansicht zu übernehmen und ein Kreisdiagramm zu erstellen. In Ihrem Fall können Sie die wichtigen Teile abfragen und sie mithilfe des Formatierers zusammenstellen und als URL rendern.

Eine andere Lösung besteht darin, einen neuen Feldformatierer zu erstellen. Der Formatierer würde das Feld akzeptieren, diese andere Information nachschlagen und den entsprechenden Link erstellen.

0
Kevin Nowaczyk