Puncte:3

Cum pot construi o matrice de randare care are ca rezultat un șir, mai degrabă decât un obiect Drupal\Core\Render\Markup?

drapel in

Aș dori să folosesc Twig Tweak's drupal_view() pentru a reda o vizualizare în șablonul meu de paragraf. Am câteva câmpuri de referință pentru entități în paragraf și am nevoie de ID-urile entităților la care se face referire transmise ca argumente de filtru contextual.

am construit un Șir de filtru contextual formatator de câmpuri pentru a formata șirul de filtru contextual cu speranța că ar putea fi transmis direct ca valoare a argumentului. Formatatorul va reveni toate dacă câmpul de referință este gol, în caz contrar, va returna ID-urile entității la care se face referire ca șir cu separatori AND/OR, de ex. 1,2,3 pentru AND sau 1+2+3 pentru SAU.

În interiorul șablonului meu, încerc să redez vizualizarea cu următoarea crenguță:

{% set arg1 = content.field_arg1|renda %}
{% set arg2 = content.field_arg2|renda %}

{{ drupal_view('my_view', 'my_display', arg1, arg2) }}

Dar asta nu merge!

Mai degrabă decât șiruri, variabilele mele arg sunt de fapt Drupal\Core\Render\Markup obiecte astfel încât argumentele nu sunt transmise corect la vizualizare.

După ce am cercetat, am descoperit că pot rezolva această problemă prin filtrarea variabilelor mele arg cu un filtru php care returnează un șir. De exemplu, utilizarea filtrului de tăiere funcționează:

{% set arg1 = content.field_arg1|render|trim %}
{% set arg2 = content.field_arg2|render|trim %}

{{ drupal_view('my_view', 'my_display', arg1, arg2) }}

Dacă este posibil, aș dori să construiesc o matrice de randare care să nu necesite niciun joc de picioare elegant în șablon pentru a transmite valorile către drupal_view() funcţie. i.e. o matrice de randare unde pot trece content.field_arg1 sau content.field_arg|renda direct ca argumentele. Este posibil?

Matricele de randare pe care le-am încercat și care nu au funcționat:

$inline_template = [
  '#type' => 'șablon_inline',
  '#template' => '{{ contextual_filter_string }}', // am încercat și cu |trim filter aici
  '#context' => [
    'contextual_filter_string' => '1+2+3',
  ],
];

$markup = [
  '#markup' => '1+2+3',
];

$text_plat = [
  '#plain_text' => '1+2+3',
];

Notă: în tablourile de randare de mai sus nu sunt afișate metadatele din cache (etichete) pentru entitățile la care se face referire în câmp.

Da, există modalități alternative de a obține aceste valori de câmp și de a le transmite drupal_view(), cu toate acestea, nu despre asta este vorba. Aș dori să folosesc un Field Formatter pentru a returna o matrice de randare (cred că trebuie să returnez o matrice de randare) care are ca rezultat un șir gata pentru a fi transmis direct către drupal_view(). Acest lucru îmi permite să configurez formatul argumentului în UI fără să ating codul. Bănuiesc că acest lucru este imposibil.

Câteva abordări alternative pe care le-am luat în considerare:

  • Aș putea să-mi preprocesez paragraful și să adaug aceste șiruri de filtru la $variabile matrice.
  • Mi-aș putea construi propria funcție twig pentru a genera aceste șiruri de filtre contextuale.
  • Aș putea obține valorile direct de la entitatea din șablonul meu, de ex. paragraph.field_arg1.target_id după cum a răspuns Les Lim, dar acest lucru nu funcționează corect pentru câmpurile cu valori multiple.

Editați | ×: Se pare că acest lucru este imposibil, așa că acceptând răspunsul lui Les Lim ca cea mai bună alternativă.

4uk4 avatar
drapel cn
Pentru PHP, consultați https://drupal.stackexchange.com/questions/207699/how-to-get-an-array-of-referenced-entity-ids-from-an-entity-reference-field. Dacă utilizați versiunea curentă Drupal Twig 2.14, acest lucru este posibil și în Twig. Consultați https://twig.symfony.com/doc/2.x/filters/column.html
Les Lim avatar
drapel us
Mi-am editat răspunsul, apoi am reîmprospătat pentru a vedea addendumul la întrebarea de jos. Nu sunt sigur că am un răspuns direct pentru tine; Cred că ceea ce descoperiți este că sistemul de formatare de câmp nu a fost conceput pentru a fi utilizat în modul în care încercați să îl utilizați. Se presupune că ar trebui să returneze marcaj HTML filtrat/escape, nu șiruri brute fără escape pe care ați dori să le utilizați ca argument View.
sonfd avatar
drapel in
@LesLim - Da, mulțumesc, asta e și impresia mea. Mi-am dorit foarte mult ca formatatorul să funcționeze curat, deoarece ar face atât de ușor configurarea și reutilizarea fără prea multe cunoștințe PHP sau Twig. Modificările dvs. sunt utile, chiar dacă în cele din urmă nu îmi răspunde la întrebare.
Les Lim avatar
drapel us
@4k4 Mulțumim pentru sfatul despre filtrul de coloană al lui Twig! Mi-am editat din nou răspunsul.
Puncte:7
drapel us

Răspuns original, presupunând că aveți nevoie doar de o singură valoare din fiecare câmp:

În loc să utilizați rezultatul câmpului randat pe care îl obțineți cu elementele din {{ continut }} matrice, probabil că ar trebui să utilizați valori brute direct de la entitate.Este mult mai probabil ca valorile brute să fie ceea ce caută argumentele tale Views în primul rând.

În Drupal 8/9, dacă entitatea brută este disponibilă pentru șablonul Twig (și este pentru șabloanele Paragraph), puteți utiliza notația Entity API pentru a obține valori brute exacte de la entitate:

{% set arg1 = paragraph.field_arg1.target_id %}
{% set arg2 = paragraph.field_arg2.target_id %}

Anexă, pentru a avea nevoie de mai multe valori de câmp brute unite

După ce am recitit întrebarea, îmi dau seama că aveți nevoie de toate valorile brute dintr-un câmp unite cu un șir. Modulul contrib Twig Field Value vă oferă instrumente generice la îndemână exact în acest scop. În acest caz, l-ați folosi field_raw filtru:

{% set arg1 = content.field_arg1|field_raw('target_id')|safe_join('+') %}
{% set arg2 = content.field_arg2|field_raw('target_id')|safe_join(',') %}

Editare: alăturați mai multe valori brute de câmp fără Twig Field Value (mulțumesc 4k4 pentru sfat)

De fapt, nu aveți nevoie de Twig Field Value pentru a obține target_id valori dintr-un câmp cu valori multiple - puteți extrage mai multe valori dintr-un câmp de entitate brută folosind Twig încorporat coloană filtru.

{% set arg1 = paragraph.field_arg1|column('target_id')|safe_join('+') %}
{% set arg2 = paragraph.field_arg2|column('target_id')|safe_join(',') %}
sonfd avatar
drapel in
Aruncă un `|default('all')` la sfârșit și poți chiar să obții `all` ca valoare dacă câmpul este gol.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.