Я хочу добавить поля в зависимости от первого выбранного варианта. Я также сделал форму с похожим поведением, но это не был виджет поля.
Я использовал этот модуль в качестве примера, чтобы сделать форму
Я не уверен, что способ, которым я реализую это поведение AJAX, должен отличаться в виджете.
Можно ли реализовать поведение этой формы в виджете поля? Я пытаюсь найти примеры конкретных полевых виджетов, реализующих это, но я до сих пор не нашел ничего, что могло бы помочь `
публичная функция formElement(FieldItemListInterface $items, $delta, элемент массива $, массив &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->значение: '';
$элемент = [];
// Соберите уже количество имен в форме.
$num_names = $form_state->get('num_names');
// Мы должны убедиться, что есть хотя бы одно поле имени.
если ($num_names === NULL) {
$name_field = $form_state->set('num_names', 1);
$num_names = 1;
}
$элемент['точки останова'] = [
'#тип' => 'выбрать',
'#title' => $this->t('Группа точек останова'),
'#options' => $this->getBreakpointsGroups(),
'#default_value' => $значение,
'#empty_option' => $this->t('-Выберите группу точек останова-'),
];
$элемент['images_fieldset'] = [
'#тип' => 'набор полей',
'#title' => $this->t('Загрузить изображения для каждой точки останова'),
'#prefix' => '<div id="breakpoint-wrapper">',
'#суффикс' => '</div>',
];
for ($i = 0; $i < $num_names; $i++) {
$element['images_fieldset']['image'][$i] = [
'#тип' => 'изображение',
'#title' => $this->t('Изображение'),
'#имя' => "Имя"
];
}
$element['images_fieldset']['submit'] = [
'#type' => 'отправить',
'#title' => 'Отправить',
'#submit' => ['::submitForm'],
'#value' => $this->t("отправить"),
'#ajax' => [
'обратный вызов' => '::loadImageFields',
'обертка' => 'точка останова-обертка',
],
];
вернуть ['значение' => $элемент];
}
/**
* Возвращает список точек останова.
*
* @возвратный массив
* Ассоциативный массив точек останова, подходящий для использования в качестве формы
* параметры.
*/
защищенная функция getBreakpointsGroups() {
$breakpoints = \Drupal::service('breakpoint.manager')->getGroups();
$breakpoint_names = array_keys($breakpoints);
$breakpoint_group = массив();
foreach ($breakpoint_names как $name) {
$breakpoint_group += [$name => $name];
}
вернуть $breakpoint_group;
}
защищенная функция submitForm($form, &$form_state) {
$state = $form_state->getTriggeringElement();
$breakpoint= $state['#value'];
$массив = массив();
$breakpoint = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup($breakpoint);
$breakpoints_name = array_keys($breakpoint);
foreach ($breakpoints_name как $breakpoint_definition) {
$mediaQuery = $breakpoint[$breakpoint_definition]->getMediaQuery();
array_push($массив,$медиазапрос);
}
$name_field = $form_state->get('num_names');
$form_state->set('num_names',count($array));
$form_state->setRebuild();
}
публичная функция loadImageFields (массив $ form, FormStateInterface $ form_state) {
возврат $form['images_fieldset'];
}
}