it-swarm.com.de

Wie kann man feststellen, ob ein Feld renderbaren Inhalt enthält, bevor HTML um ihn herum gedruckt wird?

Ich habe ein halbes Dutzend Referenzfelder für einen Inhaltstyp, der sich am Ende einer Seite unter der Überschrift "Verwandte" und einer Markup-Struktur befindet. Ich habe nachgeprüft if node.field_name is not empty, ... in twig vor dem Eingeben und Drucken von "Related" und dann jedes einzelne Feld, aber in Fällen, in denen die referenzierten Entitäten nicht veröffentlicht sind, führt dies nur zu "Related" und sonst nichts.

Wie kann ich im Voraus herausfinden, ob das Feld, das ich rendern möchte, tatsächlich zugänglichen Inhalt enthält, der dem Benutzer angezeigt wird? ist content.field_name|render|striptags|trim immer noch der einzige Weg?

<div class="info-grid {% if horizontal %}info-grid--horizontal{% endif %}">
    <h2 class="info-grid__title">Related</h2>
    <div class="info-grid__grid">
      {% if node.field_topics is not empty  %}
        {{ content.field_topics }}
      {% endif %}

      {% if node.field_programs is not empty  %}
        {{ content.field_programs }}
      {% endif %}

      {% if node.field_working_groups is not empty  %}
        {{ content.field_working_groups }}
      {% endif %}

      {% if node.field_projects is not empty  %}
        {{ content.field_projects }}
      {% endif %}

      {% if node.field_papers is not empty  %}
        {{ content.field_papers }}
      {% endif %}

      {% if node.field_datasets is not empty  %}
        {{ content.field_datasets }}
      {% endif %}
    </div>
  </div>

Bearbeiten: Aktualisierung mit Hudri-Vorschlag, es druckt immer noch das h2 von Verwandte:

{% set display_related = false %}

{% if not (node.field_programs.isEmpty == true) and content.field_programs is defined %}
  {% set display_related = true %}
{% endif %}

{% if display_related %}
  <div class="info-grid {% if horizontal %}info-grid--horizontal{% endif %}">
...

(enter image description here

5
Kevin

Die bisherigen Antworten gelten nur für Nichtreferenzfelder. Ein Referenzfeld ist anders, da die referenzierten Entitäten andere Zugriffsergebnisse haben können als die übergeordnete Entität. Das gerenderte Feld kann leer sein, das Feld im Knotenobjekt jedoch nicht. Wie in erläutert Wie verstecke ich ein leeres Feld, wenn mein benutzerdefinierter Feldformatierer alle Elemente entfernt? Es gibt zwei eindeutige leere Bedingungen für die Ausgabe des Feldformatierers in {{ content.field_name }}:

  1. Überprüfen Sie das erste Felddelta, das immer mit 0 Beginnt:

    {% set display_related = content.field_name.0 is defined %}
    
  2. oder überprüfen Sie, ob der Feldformatierer renderbare untergeordnete Elemente finden konnte und den Feld-Wrapper hinzugefügt hat:

    {% set display_related = content.field_name['#theme'] is defined %}
    

Für ein Referenzfeld ist es wichtig, content.field_name Zu rendern, auch wenn das Ergebnis negativ ist, da es die zwischenspeicherbaren Metadaten der Zugriffsprüfungen enthält. Wenn beispielsweise ein referenzierter Knoten veröffentlicht wird, muss der übergeordnete Knoten ungültig gemacht und erneut gerendert werden.

Das Überprüfen von content.field_name|render|striptags|trim Ist also überhaupt nicht so schlecht, da diese Überprüfung den Feldinhalt rendert und wenn das Ergebnis negativ ist, müssen Sie das Feld nicht erneut rendern, da die Metadaten bereits sprudelten.


Feldgruppen

Für ein halbes Dutzend Felder können Sie Feldgruppen verwenden. Platzieren Sie alle Referenzfelder in einer Gruppe "Verwandte" und zeigen Sie die Kopfzeile in der Feldgruppenvorlage an. Wenn die Feldgruppenvorlage nicht automatisch ausgeblendet wird, können Sie wie zuvor mit striptags prüfen. Sie erhalten das gesamte gerenderte Ergebnis aller Felder in der Variablen children.

Obwohl ich es vorziehen würde, den spezifischen Inhalt zu überprüfen, von dem Sie erwarten, dass er sich innerhalb der Feldgruppe befindet, und daher Beschriftungen oder andere Dinge zu ignorieren, die später hinzugefügt werden könnten. Der bereits gerenderte Feldgruppeninhalt befindet sich in einem Markup-Objekt, und Sie müssen ihn erneut im Zweig rendern, damit Sie überprüfen können, ob er als Zeichenfolge umgewandelt wurde. Zum Beispiel, ob es einen verknüpften Knoten enthält:

field-group-html-element.html.twig :

{% set display_related = '<a href' in children|render %}
7
4k4

Ist content.field_name | render | striptags | trim immer noch der einzige Weg?

Auf diese Weise entscheiden sich viele Leute für diese Prüfung, wenn Sie sie nur im Zweig durchführen. Aber ich würde argumentieren, dass es nicht der einzige Weg ist, dies zu erreichen.

Sie können auch das Feld node (oder Absatz, Begriff usw. eines beliebigen Objekts Drupal feldfähige Inhaltsentität) anstelle des Arrays content überprüfen von {% if content.field_name... Sie machen {% if not node.field_name.isEmpty %} was auch funktioniert iirc ...

Was auch möglich ist, ist, einfach einen PHP Präprozessor) zu verwenden, um ein count oder eine solche Variable festzulegen, die die Anzahl der Werte im Knoten gezählt hat, und Sie können einfach {% if not count %}. Hoffe das hilft.

0
Beebee

Meine eigene kugelsichere Version, die selbst in den seltsamsten Edge-Fällen funktioniert hat:

  • es funktioniert für alle Feldtypen
  • es prüft, ob das Feld existiert
  • es wird geprüft, ob das Feld nicht leer ist
  • es wird geprüft, ob das Feld im Anzeigemodus nicht ausgeblendet ist
{% if not (node.field_whatever.isEmpty == true) and content.field_whatever is defined %}
  <div class="whatever_markup">
    {{ content.field_whatever }}
  </div>
{% endif %}

Ersetzen Sie node und Sie können es in die Entitätsvorlage any ablegen.

0
Hudri