Рейтинг:0

How to retrieve #tree values inside multiple containers?

флаг cn

I am using Drupal 8 and I am creating multiple forms that are made of a #tree hierarchy.

I need to retrieving the value of the "first name" from the #tree using the below code and it doesn't get the value.

$firstName = $form_state->getValue('userBoxArea')[$count]['userBox']['nameBox']['firstName'];

This is my code:

protected static $formID;

public function getFormId() {
    if (empty(self::$formID)) {
        self::$formID = 1;
    }
    else {
        self::$formID++;
    }
    
    return 'formID' . self::$formID;
}

public function buildForm(array $form, FormStateInterface $form_state){
    
    $database = \Drupal::database();
    $result = $database->select('user_details', 'u')
    ->fields('u', ['uid']);
    $row = $result->execute()->fetchAll();
    $rowCount = count($row);

    $form['userBoxArea' ] = [
        '#type' => 'container',
        '#tree' => TRUE,
    ];

    for($counter = 0; $counter < $rowCount; $counter++){
        $form['userBoxArea'][$counter] = [

            'userBox' => [
                '#type' => 'container',

                'nameBox' => [
                    '#type' => 'container',

                        'firstName' => [
                            '#type' => 'textfield',
                            '#title' => 'Enter your first name', 
                        ],

                ],

                'save' => [
                    '#type' => 'submit',
                    '#value' => $this->t('Save'),
                    '#name' => 'save-' . $counter,
                    '#submit' => ['::submitForm'],
                    '#validate' => ['::validateForm'],
                    '#limit_validation_errors' => [],
                ],

            ],        

        ];
    }

    return $form;
}

public function validateForm(array &$form, FormStateInterface $form_state) {
    $firstName = $form_state->getValue('firstName');
    
    if (strlen($firstName) == NULL) {
        $form_state->setErrorByName('firstName', $this->t('The First Name should not be empty.'));
    }
}

public function submitForm(array &$form, FormStateInterface $form_state) {
    $submitString = $form_state->getTriggeringElement()['#name'];
    $submitNumber = explode("-", $submitString);
    $count = $submitNumber[1];
    $firstName = $form_state->getValue('userBoxArea')[$count]['userBox']['nameBox']['firstName'];

    $this->messenger()->addMessage($this->t('Your first name is %firstName has been saved.', ['%firstName' => $firstName]));
    $this->messenger()->addMessage($this->t('Button number: @num', ['@num' => $count]));
}

The rowCount pertains to the row in my database. The process is to acquire firstName from the user and those variables will be saved inside the database.

I have researched articles from Drupal if there is a limitation of the #tree containers and found nothing about it.

Any suggestions if I am missing something. How do you retrieve the value of "firstName"?

Thanks in advance.

Jaypan avatar
флаг de
Вам нужно показать больше кода, его недостаточно для отладки. Еще об обработчике отправки - где находится $ counter и т. Д. Что вы используете, чтобы определить, что значение пусто?
Jeirod avatar
флаг cn
@Jaypan Извините, я обновил свой код. Чтобы определить, является ли значение пустым, я использую функцию validateForm. Мне было интересно, как я не могу получить доступ к текстовому полю внутри нескольких контейнеров.
Jeirod avatar
флаг cn
Я получаю сообщение об ошибке «Неопределенный индекс: nameBox», хотя оно присутствует.
Рейтинг:0
флаг de

Ошибка исходит от проверка формы(), где вы используете следующую строку.

$firstName = $form_state->getValue('firstName');

Вам нужно получить значения первого имени, используя дерево.

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

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