Puncte:0

Reordonați programatic entitățile de referință în funcție de câmp

drapel es
gr8

Am un tip de conținut Speaker care folosește un tip de conținut Event ca referință. Evenimentul are un câmp pentru data și oră de începere. Pot exista orice număr de evenimente la care vorbește un vorbitor, când vizitează pagina vorbitorului, evenimentele nu sunt ordonate după dată, sunt ordonate după id. Cum schimb asta în mod programatic?

Pot să obțin valoarea câmpului și să le sortez după dată, dar nu pot să le setez înapoi la variabilă.

Link API Drupal asociat

utilizați \Drupal\Component\Utility\SortArray;


funcția mytheme_preprocess_node__speaker_page(&$variabile) {
  $nod = $variabile['nod'];
  $entity_ids = [];
  dacă ($nod) {
    if (isset($nod->field_events)) {
      $items = $nod->field_events; //referință la entitate
      $nesortat=matrice();
      foreach ($articole ca $item) {
        $target_id = $articol->target_id;
        $field_event = $item->entity;
        //crearea unei noi matrice nesortate cu id-ul țintă și data evenimentului, aceasta este folosită pentru sortare
        array_push($unsorted, array('target_id' => $target_id, 'event_date' => strtotime($field_event->field_date_of_event->value)));
      }
      //triere
      usort($nesortat, funcție ($a, $b) {
        return SortArray::sortByKeyInt($a, $b, 'data_evenimentului');
      });
      //ID-uri sortate
      $new_entity_ids = array_column($nesorted, 'target_id');

      $items_new = \Drupal\node\Entity\Node::loadMultiple($new_entity_ids);
      $variabile['nod']->field_events = $items_new; //asta nu merge
      //$variabile['nod']->set($nume_câmp)->referencedEntities(); 
    }
  }
}
Kevin avatar
drapel in
Încă trebuie să schimbați ordinea în matricea de randare pentru ca aceasta să aibă un efect asupra rezultatului.
Kevin avatar
drapel in
Nu ar fi mai ușor să aruncați această logică într-un formatator de câmp?
Jaypan avatar
drapel de
Acolo aș face-o.
drapel es
gr8
mulțumesc @Kevin Îmi pare rău, sunt cam nou în acest sens, din câte am înțeles, va trebui să creez un formatator de câmp personalizat care sortează entitățile la care se face referire în funcție de data evenimentului și apoi setează acel formatator de câmp pentru câmpul entităților de referință din afișarea tipul de conținut al difuzorului, am dreptate? Nu ar fi o modalitate mai lungă și consumatoare de timp de a face asta? Am încercat să fac un mod mai rapid, deoarece este doar un fel.
Kevin avatar
drapel in
Problema este că nu doriți să vă ocupați de manipularea matricei de randare aici, iar în momentul în care doriți să afișați acest câmp oriunde altundeva, va trebui să faceți din nou codul în alt loc. Formatatoarele de câmp sunt reutilizabile.
drapel es
gr8
Are sens, mulțumesc @Kevin
4uk4 avatar
drapel cn
Discuție similară despre manipularea listei de entități la care se face referire într-un formatator de câmp, inclusiv un exemplu de cod: https://drupal.stackexchange.com/questions/294728/filter-the-list-of-entities-referenced-by-entity-reference-revisions -camp
4uk4 avatar
drapel cn
Pentru o soluție fără cod puteți folosi https://www.drupal.org/project/eva
drapel es
gr8
da, creez un formatator de câmp, mulțumesc @4k4

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.