Способ, которым я думал обновить раскрывающийся список поля узла, не сработает. Это следует делать таким образом:
https://codimth.com/blog/web/drupal/dependent-select-dropdowns-using-ajax-node-addedit-form-drupal-8-9
<?php
используйте Drupal\Core\Form\FormStateInterface;
используйте Drupal\Core\Url;
/**
* Реализует hook_form_alter().
*/
функция MODULENAME_form_alter(&$form, FormStateInterface $form_state, $form_id)
{
если ($form_id == 'node_article_form' || $form_id == 'node_article_edit_form') {
//добавляем оболочку для выбора 2
$form['field_select2']['#prefix'] = '<div id="select2-wrapper">';
$form['field_select2']['#suffix'] = '</div>';
// добавляем ajax для выбора 1
$form['field_select1']['виджет']['#ajax'] = [
'обратный вызов' => 'callback_field_select1_trigger',
'обертка' => 'выбор2-обертка',
'событие' => 'изменить',
'прогресс' => [
'тип' => 'пульсирующий',
'message' => t('Извлечение контента...'),
],
];
//выбираем 2 варианта в форме редактирования
$field_select1_value = $form_state->getValue('field_select1');
если ($form_id == 'node_article_edit_form' && !$field_select1_value) {
$field_select1_edit_value = isset($form['field_select1']['виджет']['#default_value'][0]) ? $form['field_select1']['виджет']['#default_value'][0] : ноль;
$form['field_select2']['виджет']['#options'] = getSelect2Options($field_select1_edit_value);
}
}
}
/**
* @param массив $form
* @параметр $form_state
* @возврат смешанный
*/
функция callback_field_select1_trigger (массив $ form, $ form_state)
{
$field_select1_value = $form_state->getValue('field_select1');
если (!пусто($field_select1_value)) {
$select1_value = $field_select1_value[0]['target_id'];
$form['field_select2']['виджет']['#options'] = getSelect2Options($select1_value);
} еще {
$form['field_select2']['widget']['#options'] = getAllSelect2Options();
}
возврат $form['field_select2'];
}
/**
* @параметр $select1_value
* @возвратный массив
*/
функция getSelect2Options($select1_value)
{
$query = \Drupal::entityQuery('taxonomy_term');
$query->условие('vid', "select2_term");
$query->условие('field_select1.0.target_id', $select1_value);
$tids = $запрос->выполнить();
$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
$опции = [];
$options['_none'] = t('- Любой -');
foreach ($terms как $key => $term) {
$options[$key] = $term->имя->значение;
}
вернуть $options;
}
/**
* @возвратный массив
*/
функция getAllSelect2Options()
{
$query = \Drupal::entityQuery('taxonomy_term');
$query->условие('vid', "select2_term");
$tids = $запрос->выполнить();
$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
$опции = [];
$options['_none'] = t('- Любой -');
foreach ($terms как $key => $term) {
$options[$key] = $term->имя->значение;
}
вернуть $options;
}
// пример, как получить параметры, если select 1 - это несколько полей
$selectedItems = [];
$default_values = $form['field_select1']['виджет']['#default_value'];
если ($ default_values != NULL) {
foreach ($default_values как $key => $value) {
если ($значение!= 0) {
$selectedItems[$value] = $value;
}
}
}
если (количество ($ вкладка) > 0) {
$form['field_select2']['widget']['#options'] = getSelect2Options($selectedItems);
} еще {
$form['field_select2']['widget']['#options'] = getAllSelect2Options();
}