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 câmpului de completare automată în formular este:
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:
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
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?