Puncte:1

Cum se filtrează completarea automată pe un câmp dependent?

drapel km

Obiectiv - Cum se filtrează completarea automată pe baza unui câmp înrudit? În acest domeniu, o organizație este selectată și apoi completarea automată ar trebui să permită selectarea numai a elementelor create de acea organizație.

Configurarea implică un

  • formularul de entitate inline pentru a selecta organizația. Acesta este câmpul de declanșare.
  • câmp de completare automată pentru a selecta o obligație aferentă organizației respective

Elementul declanșator se numește „emitent”. Aceasta este structura formularului:

Structura formularului IEF emitent

Structura câmpului de completare automată în formular este:

Structura formei Deal Bond

Uitând de modul în care ajax este declanșat atunci când formularul de entitate inline se completează ca o altă problemă. Am un sistem în care o listă de selecție falsă/de declanșare este modificată pe baza unui observator de mutație care declanșează ajax. Am investigat încercarea de a înlănțui evenimentul, încercând să aplic ajax elementului de formular al entității inline și încercând să apelez ajax folosind drupal.ajax.

Cum setez id-ul valorii filtrului. Pot vedea 2 moduri, cel mai curat este trecerea unui parametru #filter la #selection_settings

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_settings'] = [
  'target_bundles' => ['fasole'],
  'filter' => ['field_bond_issuer' => $issuer_id],
];

Pot vedea valoarea setată într-un element #prefix pe formular după ce ajax a rulat

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'testarea conținutului adăugat: id-ul emitentului' . $issuer_id;
returnează $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond'];

Aspectul câmpului:

introduceți descrierea imaginii aici

html

<input data-drupal-selector="edit-field-para-deal-information-0-subform-field-deal-reference-bond-0-target-id" aria-describedby="edit-field-para-deal-information-0-subform-field-deal-reference-bond-0-target-id--_drZ4Yf-StI--description" class="form-autocomplete form-text ui-autocomplete-input" data-autocomplete-path="/entity_reference_autocomplete/node/default%3Anode_by_issuer/tT7cuAtHgjMlRrK6OypcvFEJNTvFEDSmFImi6iBhNNw" type="text" id="edit-field-para-deal-information-0-subform-field-deal-reference-bond-0-target-id--_drZ4Yf-StI" name="field_para_deal_information[0][subform][field_deal_reference_bond][0][target_id]" value="" size="60" maxlength="1024" placeholder="" autocomplete="off">

Arată că default:node_by_issuer este setat în funcția ajax (full):

funcția cbi_deal_id_handle_ajax(matrice &$form, FormStateInterface $form_state) {
  $issuer_para_field = $form_state->getValue('field_para_issuer_information');
  $issuer_field = $issuer_para_field[0]['subform']['field_bond_issuer'];
  $issuer_field_value = $issuer_field['target_id'];
  $issuer_id = explode(':', $issuer_field_value)[1];


  $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_handler'] = 'default:node_by_issuer';
  $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_settings'] = [
'target_bundles' => ['fasole'],
'filter' => ['field_bond_issuer' => $issuer_id],
  ];

 $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'testarea conținutului adăugat: id-ul emitentului' . $issuer_id;
 returnează $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond'];
 }

Pauc la Review la /web/core/lib/Drupal/Core/Render/Element/FormElement.php linia 187 și confirmați că variabila de filtru nu este setată.

Se pare că câmpul de completare automată nu este actualizat cu setări legate de funcția de completare automată. Dacă am setat ajax pentru a actualiza formularul cu

['#selection_handler'] = 'default:node_by_tester';

nu există nicio modificare a handler-ului în redarea de bază. Valoarea stabilită de forma inițială alter rămâne (node_by_issuer).

Modificarea formularului ajax, cu wrapping div pentru a testa dacă id-ul wrapper-ului formularului cu codul hash la sfârșit face vreo diferență

funcția cbi_deal_id_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  dacă ($element['#paragraph_type'] == 'informații_oferte') {
    $articole = $context['articole'];
    $bond = $items->getParent()->getEntity();
    $element['subform']['field_deal_reference_bond']['widget'][0]['target_id']['#selection_handler'] = 'default:node_by_issuer';
    $element['subform']['field_deal_reference_bond']['#prefix'] = '<div id="test-wrapper">';
    $element['subform']['field_deal_reference_bond']['#suffix'] = '</div>';

    $element['subform']['ajax_trigger_button'] = [
      '#type' => 'selectați',
      '#ajax' => [
        'callback' => 'cbi_deal_id_handle_ajax',
        'event' => 'blur',
        'wrapper' => 'test-wrapper',
        'progres' => [
          'type' => 'throbber',
          'message' => t('Se încarcă detaliile emitentului...'),
         ],
      ],
     '#options' => [
      '1' => t('Unul'),
      '2' => t('Doi'),
      '3' => t('Trei'),
     ],
   ];

  dacă ($bond->isNew()) {
    întoarcere;
  }
...

Pentru a filtra datele, am creat un plugin conform https://fivejars.com/blog/when-drupal-best-choice-your-website. Ma astept ca manipulator_selecție proprietatea se adresează acesteia. Acesta este apelat, fără acces la datele filtrului:

<?php

spațiu de nume Drupal\cbi_deal_id\Plugin\EntityReferenceSelection;

utilizați Drupal\node\Plugin\EntityReferenceSelection\NodeSelection;

/**
 * Oferă control de acces specific pentru tipul de entitate nod.
 *
 * @EntityReferenceSelection(
 * id = "default:node_by_issuer",
 * label = @Translation ("Selectare nod după câmp"),
 * entity_types = {"nod"},
 * grup = „implicit”,
 * greutate = 3
 * )
 */
clasa BondByIssuerSelection extinde NodeSelection {

 /**
  * {@inheritdoc}
  */
 funcția protejată buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
   \Drupal::logger('cbi_deal_id')->notice('se încarcă interogarea entitate de compilare cu');
   $interogare = parent::buildEntityQuery($match, $match_operator);
   $handler_settings = $this->configuration['handler_settings'];
   dacă (!isset($handler_settings['filtru'])) {
     returnează $interogare;
   }
   $filter_settings = $handler_settings['filtru'];
   foreach ($filter_settings ca $field_name => $valoare) {
     $interogare->condiție($nume_câmp, $valoare, '=');
   }
   returnează $interogare;
 }

}

Ajax returnează întregul paragraf

Ajustați ajax pentru a înlocui întregul paragraf așa cum este sugerat

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['target_id']['#selection_settings'] = 
  [
     'target_bundles' => ['bond'],
     'filter' => ['field_issuer_filter' => 4993],
   ];
$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'testarea conținutului adăugat: id-ul emitentului' . $issuer_id;
  returnează $form['field_para_deal_information'];
}

În fișierul de potrivire /src/Entity/CbiDealIdEntityAutocompleteMatcher.php

Setările filtrului sunt în controlerul de potrivire de completare automată, dar nu și valorile actualizate

introduceți descrierea imaginii aici

Concluzie

Am încercat să creez un controler https://www.chapterthree.com/blog/how-alter-entity-autocomplete-results-drupal-8. Este apelat, dar nu am date de filtrare și nu văd cum să adresez $form_state pentru a obține id-ul din formularul de entitate inline.

A doua metodă de adresare a interogării este printr-o rută personalizată. Posibil se poate schimba ruta de la ajax. Cercetă investigație.

Care este cea mai simplă metodă de filtrare după valoarea dintr-un câmp de entitate inline?

No Sssweat avatar
drapel ua
În apelarea ajax, trebuie doar să „return $form['field_para_deal_information'];`

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.