CodeIgniter: проверка формы с помощью многомерных данных POST

#php #codeigniter #codeigniter-2

#php #codeigniter #codeigniter-2

Вопрос:

Итак, фреймворк — CodeIgniter 2.0.2. У меня есть форма, в которой есть группы полей, соответствующие строкам в базе данных. Имена полей приведены в формате:

 opt[0][foo]
opt[0][bar]
opt[1][foo]
opt[1][bar]
etc...
  

Индекс (1,2 и т.д.) не соответствует идентификаторам строк в базе данных, это просто способ разделить группы полей. В индексе могут быть пробелы, поскольку пользователи могут добавлять и удалять произвольное количество групп полей. Все группы идентичны, то есть они содержат точно такой же набор полей с одинаковыми именами второго уровня.

Я хочу иметь возможность использовать библиотеку проверки CodeIgniter для проверки формы и (p) повторного заполнения по мере необходимости. Я нашел множество сообщений (в дополнение к превосходному руководству пользователя CI) о предварительном заполнении, и я знаю, как заставить работать с повторным заполнением в целом. Однако, это первый раз, когда мне пришлось попробовать это с индексированными именами полей, как указано выше. Я пробовал нижеприведенное, и это не работает:

 array(
    'field' => 'opt[][foo]',
    'label' => 'Foo',
    'rules' => 'required'
)
  

Я предполагаю, что я просто надеялся на слишком многое, и CodeIgniter не поддерживает то, что мне нужно, для этого. Является возможностью расширения существующей библиотеки проверки формы, поэтому, если кто-нибудь был в такой же ситуации и может дать несколько советов, это было бы очень кстати.

Обновить:

Просто немного дополнительной информации, я также пытался проверить специально индексированное поле (см. Ниже), и это также не сработало… Насколько я понимаю, многомерная проверка должна работать в конкретном случае:

 array(
    'field' => 'opt[0][foo]',
    'label' => 'Foo',
    'rules' => 'required'
)
  

Ответ №1:

Следующий код контроллера работает для меня на CI 2.0.2

 public function test() {

        $this->load->library('form_validation');
        $this->load->helper('form');

        $this->form_validation->set_rules('test[test1][test2]', 'Test', 'required|valid_email');

        $this->form_validation->run();  

        echo validation_errors();

        echo form_open($this->uri->uri_string());
        echo form_input('test[test1][test2]', set_value('test[test1][test2]'));
        echo form_submit();
        echo form_close();

    }
  

Комментарии:

1. Действительно, это так! Также работайте с массивами, я отчетливо помню, что в прошлом с этим возникали проблемы, может быть, было обновление 2.0, которое исправило это? Или я ошибаюсь, и это никогда не было проблемой?

2. Пожалуйста, перечитайте вопрос. В массиве POST имеется произвольное количество элементов первого уровня. т. Е. я мог бы использовать test [0-5] или я мог бы использовать test [0-50]. Полагаю, я мог бы установить правила в цикле, но это действительно уродливое решение, и я бы предпочел абстрагировать их в конфигурационный файл.

3. Кроме того, попробуйте еще раз с числовым индексом, так test[0][test2] как это мой формат возвращаемых данных. Этот формат у меня не работал, как я сказал в обновлении.

4. Я попробовал еще раз с числовым форматом. У меня это сработало нормально.

5. Что касается произвольного количества элементов, вы не можете настроить файл конфигурации из-за неизвестного количества элементов, вы можете изменить файл конфигурации во время выполнения, но вам все равно понадобится ваш цикл, даже если это просто для повторного заполнения недопустимой формы. Еще одна вещь, на которую следует обратить внимание, — это DataMapper ORM, он проверяет данные в модели при сохранении, поэтому вы создаете новый объект для каждого набора полей, плюс вы получаете преимущества ORM, такие как автоматические соединения / взаимосвязи. datamapper.wanwizard.eu

Ответ №2:

Вы можете использовать это для перебора opt переменной и установки правил проверки для каждого ввода.

 if(!empty($opt))
    {
        foreach($opt as $id => $value)
        {
            $this->form_validation->set_rules('opt[' . $id . '][foo]', 'Foo', 'required');
            $this->form_validation->set_rules('opt[' . $id . '][bar]', 'Bar', 'required');
        }
    }
  

Ответ №3:

Вам следует взглянуть на функции обратного вызова для класса validating — это должно помочь вам выполнить то, что вам нужно для проверки.

Комментарии:

1. Функции обратного вызова здесь не проблема. Проблема в именах полей.