Puncte:0

entity_form cum să adăugați în mod programatic referințe și să actualizați vizual formularul (entity_browser)

drapel gr

Am o entitate fieldable cu un câmp de referință la paragrafe field_paragraphs și un paragraph_type cu un câmp de referință la evenimentul content_type field_events.

Ceea ce încerc în formularul de entitate este să am un buton în subformularul de eveniment paragraph_type, care la clic precompletează field_events de tip_paragraf cu conținut. Afișarea formularului de field_events folosește un entity_browser pentru a permite utilizatorului să aleagă și să deselecteze manual evenimentele adăugate programatic și cred că aici sunt blocat.

Cred că sunt destul de aproape de soluție, lasă-mă să încerc să descriu:

Când dau clic pe butonul, evenimentele adăugate nu sunt vizibile, dacă folosesc entity_browser acum pentru a insera un eveniment, toate evenimentele pe care le-am adăugat programatic sunt afișate.

Așa că, cumva, trebuie să spun entity_browser din apel invers să returneze lista actualizată, cred (sunt un începător Drupal, așa că vă rog să mă ușurezi) Dar nu am nicio idee cum să fac acest lucru, de asemenea, cred că ar trebui să fie posibil fara a face asta? Adică doar adăugați referințele și lăsați „reconstruirea formularului independent de afișarea formularului”... Nu știu, aici este codul de până acum:

/**
 * Implementează hook_field_widget_WIDGET_TYPE_form_alter().
 */
funcția module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {

  comutator ($element['#paragraph_type']) {
   caz „evenimente”:

      $replace_id = $element['subform']['field_events']['widget']['#id'];

      $element["subform"]['add_tomorrows_events_button'] = [
        '#type' => 'buton',
        '#attributes' => [
          'name' => 'add_tomorrows_events',
        ],
        '#value' => t('Adăugați evenimente de mâine'),
        '#ajax' => [
          'callback' => 'module_insert_tomorrows_events_into_paragraph_events',
          'wrapper' => $replace_id,
          'method' => 'înlocuiește',
          'eveniment' => 'clic',
        ]
      ];

     pauză;

   Mod implicit:
     // cod...
     pauză;
 }

}

/**
 * apel invers Ajax.
 */
funcția module_insert_tomorrows_events_into_paragraph_events( &$form, FormStateInterface &$form_state) {

  /* Obține indexul paragrafului în field_paragraphs */
  $triggering_element = $form_state->getTriggeringElement();
  $paragraph_index = $triggering_element["#parinti"][1];


  /* Momentan, încearcă să adaugi 10 evenimente */
  $rezultate = \Drupal::entityQuery('nod')
  ->condition('tip', 'eveniment')
  ->interval(0, 10)
  ->execute();

  /* Aici încerc să construiesc șirul așa cum este în cheia target_id a widget-ului 
     de ex. „nod:3213 nod:54354 nod:432423”
  */
  $target_ids = "";
  foreach ($rezultate ca $res) {
    $target_ids .= " nod:".$res;
  }


  

  $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;

  /* doar alte lucruri pe care le-am încercat */
  /*$form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#default_value'] = $target_ids;*/
  /* $form_state->setValue(['field_paragraphs', $paragraph_index, 'subform', 'field_events', 'target_id'], $target_ids);
  $form_state->setRebuild(true);
    */
/* am încercat să actualizez EB, dar `current` nu este actualizat :/
   $t = EntityReferenceBrowserWidget::updateWidgetCallback($form, $form_state); 
   returnează $t["field_paragraphs"]["widget"][$paragraph_index]["subform"]["field_events"]["widget"];
*/




  returnează $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"];
}

TL;DR: Evenimentele sunt adăugate, dar entity_form/entity_browser nu este actualizat vizual, după folosirea entity_browser toate evenimentele adăugate programatic sunt afișate, cum să le afișați în primul rând?

Puncte:0
drapel gr

Am făcut-o să funcționeze, împărtășesc asta dacă cineva dă peste același lucru, în cele din urmă a fost trivial cu utilizarea ReplaceCommand și InvokeCommand

funcția module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {
  comutator ($element['#paragraph_type']) {
    caz „paragraph_events”:

      // Adăugați butonul numai dacă subformularul-paragraf este extins.
      dacă ($element['top']['summary']['fields_info']['#expanded']) {
        $element["subform"]['add_tomorrows_events_button'] = [
          '#type' => 'buton',
          '#attributes' => [
            'name' => 'add_tomorrows_events',
          ],
          '#value' => t('inserați evenimentele de mâine'),
          '#ajax' => [
            'callback' => '_module_insert_tomorrows_events_into_paragraph_events',
            'eveniment' => 'clic',
          ],
        ];
      }

      pauză;


      ...

și apelul înapoi

funcția _module_insert_tomorrows_events_into_paragraph_events(&$form, FormStateInterface $form_state): AjaxResponse {

  $triggering_element = $form_state->getTriggeringElement();
  $paragraph_index = $triggering_element["#parinti"][1];


  // Încărcați rezultatele din vizualizare.
  $view = Vizualizări::getView('evenimente');
  dacă (!$view || !array_key_exists('morrows_events', $view->storage->get('display'))) {
    returnează „vezi „evenimente” sau afișează „evenimentele de mâine” lipsește”;
  }

  $view->setDisplay('mâine_evenimente');
  $view->execute();
  $rezultate = $vizualizare->rezultat;

  $target_ids = "";
  foreach ($rezultate ca $res) {
    $target_ids .= " nod:" . $res->nid;
  }


  $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;
  $răspuns = AjaxResponse nou();

  $sel = '#' . $form["field_paragraphs"]["widget"][$paragraph_index]["subform"]['field_events']['widget']['target_id']["#id"];
  $response->addCommand(new ReplaceCommand($sel, $form["field_paragraphs"]["widget"][$paragraph_index]["subform"]['field_events']['widget']['target_id'])) ;
  $response->addCommand(new InvokeCommand($sel, 'trigger', ['entity_browser_value_updated']));

  returnează $răspuns;

}

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.