Doresc să adaug câmpuri în funcție de prima opțiune selectată. Am făcut și un formular cu un comportament similar, dar nu a fost un widget de câmp.
Am folosit acest modul ca exemplu pentru a face formularul
Nu sunt sigur dacă modul în care implementez acest comportament AJAX ar trebui să fie diferit într-un widget.
Comportamentul acestui formular poate fi implementat într-un widget de câmp? Încerc să caut exemple de widget-uri de câmp specific care implementează acest lucru, dar încă nu am găsit nimic care ar putea ajuta `
funcția publică formElement(FieldItemListInterface $articole, $delta, matrice $element, matrice &$form, FormStateInterface $form_state) {
$valoare = isset($articole[$delta]->valoare) ? $articole[$delta]->valoare: '';
$element = [];
// Adună deja numărul de nume din formular.
$num_names = $form_state->get('num_names');
// Trebuie să ne asigurăm că există cel puțin un câmp de nume.
dacă ($num_nume === NULL) {
$name_field = $form_state->set('num_names', 1);
$num_nume = 1;
}
$element['puncte de întrerupere'] = [
'#type' => 'selectați',
'#title' => $this->t('Grup punct de întrerupere'),
'#options' => $this->getBreakpointsGroups(),
'#default_value' => $valoare,
'#empty_option' => $this->t('-Selectează un grup de puncte de întrerupere-'),
];
$element['images_fieldset'] = [
'#type' => 'fieldset',
'#title' => $this->t('Încărcați imagini pentru fiecare punct de întrerupere'),
'#prefix' => '<div id="breakpoint-wrapper">',
'#sufix' => '</div>',
];
pentru ($i = 0; $i < $num_nume; $i++) {
$element['images_fieldset']['image'][$i] = [
'#type' => 'imagine',
'#title' => $this->t('Imagine'),
'#name' => "Nume"
];
}
$element['images_fieldset']['submit'] = [
'#type' => 'trimite',
'#title' => 'Trimiteți',
'#submit' => ['::submitForm'],
'#value' => $this->t("trimite"),
'#ajax' => [
'callback' => '::loadImageFields',
'wrapper' => 'wrapper-punct de întrerupere',
],
];
returnează ['value' => $element];
}
/**
* Returnează o listă de puncte de întrerupere.
*
* @return matrice
* O matrice asociativă de puncte de întrerupere, potrivită pentru a fi folosită ca formă
* Opțiuni.
*/
funcția protejată getBreakpointsGroups() {
$breakpoints = \Drupal::service('breakpoint.manager')->getGroups();
$breakpoint_names = array_keys($breakpoints);
$breakpoint_group = array();
foreach ($breakpoint_names ca $name) {
$breakpoint_group += [$nume => $nume];
}
returnează $breakpoint_group;
}
funcția protejată submitForm($form, &$form_state) {
$state = $form_state->getTriggeringElement();
$breakpoint= $state['#value'];
$array = array();
$breakpoint = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup($breakpoint);
$breakpoints_name = array_keys($breakpoint);
foreach ($breakpoints_name ca $breakpoint_definition) {
$mediaQuery = $breakpoint[$breakpoint_definition]->getMediaQuery();
array_push($array,$mediaQuery);
}
$name_field = $form_state->get('num_names');
$form_state->set('num_names',count($array));
$form_state->setRebuild();
}
funcția publică loadImageFields(matrice $form, FormStateInterface $form_state) {
returnează $form['images_fieldset'];
}
}