Рейтинг:0

Визуализация отправленных полей формы для отправки по электронной почте с заголовком + значением

флаг in

У меня довольно сложная форма, основанная на \Друпал\Ядро\Форма\Формбасе со многими (частично вложенными) полями и хотите отправить полное содержимое по электронной почте при отправке.

В настоящее время у меня есть

публичная функция submitForm (массив и форма $, FormStateInterface $ form_state)
{

   foreach ($form_state->getValues() as $key => $value) {
     if (!empty($form[$key]['#title']) && $key != 'images') {
       $values[$form[$key]['#title']->render()] = $value;
     }
   }
...
# позже я отформатирую массив $values ​​как HTML-список

Это будет отображать поля только на верхнем уровне формы, но у меня есть поля внутри групп.

Есть ли хороший и чистый способ отобразить все значения поля? Или мне нужно перебирать и анализировать вручную по $форма множество?

Могу ли я даже использовать рендерер для этого?

РЕДАКТИРОВАТЬ:

общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {


    // ...

    $ форма ['компания'] = [
        '#type' => 'контейнер',
    ];

    $form['компания']['названиекомпании'] = [
        '#тип' => 'текстовое поле',
        '#title' => $this->t('Название компании'),
    ];

Подвести итог:

Как я могу перебрать все поля, в том числе те, которые находятся в контейнерах, и получить значения + метку (а не только техническое имя)? Есть ли хорошие помощники для этого или мне нужно делать все это вручную?

apaderno avatar
флаг us
Этот код не будет работать, и это не имеет смысла. Зачем вам нужна `$form[$key]['#title']` для доступа к значению в `$form_state`? Кроме того, поскольку `$form[$key]['#title']` является строкой, она не реализует никакого метода `render()`.
apaderno avatar
флаг us
Также было бы полезно увидеть код, создающий форму. Непонятно, что вы подразумеваете под *группами* и означает ли *поля* *элементы формы*.
флаг in
код в настоящее время работает, #title - это объект, я думаю, это потому, что форма уже построена. Моя единственная проблема - перебирать все элементы формы, потому что они вложены в группы. Я добавляю пример кода, как строится исходный массив $form.
apaderno avatar
флаг us
Не видя всех элементов формы, невозможно понять, что вы подразумеваете под *группами*. Что касается показанного кода, достаточно использовать `'nameofcompany'`, а не то, что возвращает `$this->t('Name of Company')`. У вас уже есть `$values['nameofcompany']`; вам не нужно, чтобы `$values[$this->t('Name of Company')]` устанавливалось в одно и то же значение.
флаг in
Мне нужны ярлыки, а не внутренние имена
флаг in
Я отредактировал вопрос - под группами я имею в виду контейнеры. См. пример кода. Это делает его более понятным? Дайте мне знать, если у вас есть вопросы.
флаг in
@apaderno Я опубликовал ответ ... но мне интересно, есть ли более приятный - не такой низкоуровневый - способ.
Рейтинг:0
флаг in

Это то, что я придумал, мне просто интересно, есть ли более элегантный способ, чем этот "низкоуровневый" разбор

/**
 * Возвращает массив с метками в качестве ключей, представленными значениями в качестве значений на основе исходной формы
 *
 * @param FormStateInterface $form_state
 * @возвратный массив
 */
частная функция generateLabelsWithValues ​​(FormStateInterface $ form_state): массив {
  $form = $form_state->getCompleteForm();
  $result = $this->itateAndAddValues($form, $form_state);
  вернуть $результат;
}

/**
 * Перебрать форму или контейнер и сложить значения
 */
частная функция iterateAndAddValues ​​(массив $formOrContainer, FormStateInterface $form_state, массив $result = []) {
  foreach ($formOrContainer as $key => $element) {
    if ($key[0] === '#' || $key === 'form_build_id' || $key === 'form_id' || $key === 'submit') {
      Продолжить;
    }
    if ($element['#type'] === 'контейнер' || $element['#type'] === 'fieldset') {
      $result = $this->itateAndAddValues($element, $form_state, $result);
      Продолжить;
    }

    если ($значение = $form_state->getValue($key)) {
      $result[(string)$element['#title']] = $value;
    }
  }

  вернуть $результат;
}

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

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