Рейтинг:0

Как получить значения #tree внутри формы?

флаг cn

Я новичок в Drupal 8, и я создаю модуль, который имеет форму #tree.Я выбрал форму #tree для создания нескольких форм с одинаковыми текстовыми полями и кнопкой.

Я наткнулся на один документ в друпале про #tree.
https://www.drupal.org/docs/7/api/form-api/tree-and-parents
Я провел исследование по этому поводу и не могу найти документацию, сообщение или блог о том, как получить конкретное значение из #tree.

Я реализовал #tree в своей форме. Единственная проблема в том, что я не могу получить конкретное значение из формы.

for($counter = 0; $counter < $rowCount; $counter++){
   $form['firstname']['#tree'] = TRUE;
   $form['имя'] => [
        '#тип' => 'текстовое поле',
        '#title' => 'Имя',
   ];
   $form['второе имя'] => [
        '#тип' => 'текстовое поле',
        '#title' => 'Второе имя',
   ];
   $form['сохранить'] => [
        '#type' => 'отправить',
        '#value' => $this->t('Сохранить'),
        '#submit' => ['::submitForm'],
   ];
}

rowCount относится к строке в моей базе данных. Процесс заключается в том, чтобы получить имя и фамилию от пользователя, и эти переменные будут сохранены в базе данных.

Как я могу получить второе имя внутри формы #tree?

Рейтинг:0
флаг cn

#дерево обозначает иерархию в форме, вам все еще нужен действительный и логичный PHP, чтобы он работал, например.

// В сборке...
$ форма ['родитель'] = [
  '#type' => 'контейнер',
  '#дерево' => ИСТИНА,
];

for($counter = 0; $counter < $rowCount; $counter++){
  $form['родительский'][$counter] = [
    'firstname' => ['#type' => 'input', ...],
    'lastname' => ['#type' => 'input', ...],
  ];
}

// В отправке...
// '0' - это ключ, который вы установили с помощью $counter ранее.
$first_firstname = $form_state->getValue('parent')[0]['firstname'];
$first_lastname = $form_state->getValue('parent')[0]['lastname'];
Jeirod avatar
флаг cn
Спасибо тебе за пояснение. Когда я впервые прочитал статью о Drupal, я подумал, что `#tree` — это тип формы в Drupal. Могу ли я также изменить 0 в зависимости от того, какую кнопку нажал пользователь? Допустим, пользователь нажал вторую кнопку отправки. Можно ли разместить скрытое поле, содержащее номер счетчика, который будет передан в функцию «отправить»?
флаг cn
Вам нужно установить уникальное `#name` для каждой кнопки и проверить `$form_state-> getTriggeringElement()` в обработчике отправки.
Jeirod avatar
флаг cn
Спасибо за ваш ответ. У меня также есть еще один вопрос. я создал еще один 2 контейнера внутри родительского контейнера. Добавляю контейнеры для подразделений. Могу ли я получить доступ к такому значению, как `$first_firstname = $form_state->getValue('parent')[0]['secondContainer'][' ThirdContainer']['firstname'];`? Я пробовал это в своем коде, и он говорит: undefined index: firstname.
Рейтинг:0
флаг de

#дерево Создает иерархию значений в обработчике отправки формы.

Сравнивать:

общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
  $ форма ['контейнер'] = [
    '#type' => 'контейнер',
  ];
  $form['контейнер']['some_value'] = [
    '#тип' = >'текстовое поле',
  ];

  // Кнопки отправки и т. д. не показаны

  вернуть $ форму;
}

Это создаст элемент формы. После нажатия кнопки «Отправить» ключ элемента формы используется для возврата значения. в данном случае ключ некоторое_значение, что означает, что обработчики проверки и отправки могут получить отправленное значение с помощью form_state->getValue('some_value').

Теперь добавьте #дерево к контейнеру:

общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
  $ форма ['контейнер'] = [
    '#type' => 'контейнер',
    '#дерево' => ИСТИНА,
  ];
  $form['контейнер']['some_value'] = [
    '#тип' = >'текстовое поле',
  ];

  // Кнопки отправки и т. д. не показаны

  вернуть $ форму;
}

С этим изменением $form_state->getValue('some_value') ничего не вернет, так как значение теперь является частью элемента-контейнера (элемент #дерево элемент) и должен быть получен относительно этого:

// Возвращает массив с одним ключом, 'some_value', который содержит
// переданное значение.
$form_state->getValue('контейнер')

// Возвращает отправленное значение:
$form_state->getValue(['контейнер', 'some_value'])
Jeirod avatar
флаг cn
Спасибо за дополнительную информацию. Я использую цикл с несколькими кнопками отправки.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.