Modul în care m-am gândit să actualizez meniul drop-down al câmpului nod nu va funcționa. Acest lucru ar trebui făcut în acest fel:
https://codimth.com/blog/web/drupal/dependent-select-dropdowns-using-ajax-node-addedit-form-drupal-8-9
<?php
utilizați Drupal\Core\Form\FormStateInterface;
utilizați Drupal\Core\Url;
/**
* Implementează hook_form_alter().
*/
funcția MODULENAME_form_alter(&$form, FormStateInterface $form_state, $form_id)
{
if ($form_id == 'node_article_form' || $form_id == 'node_article_edit_form') {
//adăugați un wrapper pentru a selecta 2
$form['field_select2']['#prefix'] = '<div id="select2-wrapper">';
$form['field_select2']['#suffix'] = '</div>';
// adăugați ajax pentru a selecta 1
$form['field_select1']['widget']['#ajax'] = [
'callback' => 'callback_field_select1_trigger',
'wrapper' => 'select2-wrapper',
'eveniment' => 'schimbare',
'progres' => [
'type' => 'throbber',
'message' => t('Se preiau continut...'),
],
];
//se selectează 2 opțiuni în formularul de editare
$field_select1_value = $form_state->getValue('field_select1');
if ($form_id == 'node_article_edit_form' && !$field_select1_value) {
$field_select1_edit_value = isset($form['field_select1']['widget']['#default_value'][0]) ? $form['field_select1']['widget']['#default_value'][0] : nul;
$form['field_select2']['widget']['#options'] = getSelect2Options($field_select1_edit_value);
}
}
}
/**
* @param matrice $form
* @param $form_state
* @return mixt
*/
funcția callback_field_select1_trigger(matrice $form, $form_state)
{
$field_select1_value = $form_state->getValue('field_select1');
dacă (!gol ($field_select1_value)) {
$select1_value = $field_select1_value[0]['target_id'];
$form['field_select2']['widget']['#options'] = getSelect2Options($select1_value);
} altfel {
$form['field_select2']['widget']['#options'] = getAllSelect2Options();
}
returnează $form['field_select2'];
}
/**
* @param $select1_value
* @return matrice
*/
funcția getSelect2Options($select1_value)
{
$interogare = \Drupal::entityQuery('termen_taxonomie');
$query->condition('vid', "select2_term");
$query->condition('field_select1.0.target_id', $select1_value);
$tids = $interogare->execute();
$termi = \Drupal\taxonomie\Entitate\Term::loadMultiple($tids);
$opțiuni = [];
$options['_none'] = t('- Oricare -');
foreach ($terms ca $key => $term) {
$opțiuni[$cheie] = $term->nume->valoare;
}
returnează $opțiuni;
}
/**
* @return matrice
*/
funcția getAllSelect2Options()
{
$interogare = \Drupal::entityQuery('termen_taxonomie');
$query->condition('vid', "select2_term");
$tids = $interogare->execute();
$termi = \Drupal\taxonomie\Entitate\Term::loadMultiple($tids);
$opțiuni = [];
$options['_none'] = t('- Oricare -');
foreach ($terms ca $key => $term) {
$opțiuni[$cheie] = $term->nume->valoare;
}
returnează $opțiuni;
}
// exemplu cum să obțineți opțiuni dacă selectați 1 este mai multe câmpuri
$selectedItems = [];
$default_values = $form['field_select1']['widget']['#default_value'];
dacă ($default_values != NULL) {
foreach ($default_values ca $key => $value) {
dacă ($valoare != 0) {
$selectedItems[$value] = $valoare;
}
}
}
dacă (număr ($tab) > 0) {
$form['field_select2']['widget']['#options'] = getSelect2Options($selectedItems);
} altfel {
$form['field_select2']['widget']['#options'] = getAllSelect2Options();
}