Почему set_value () не работает с входами массива foo [bar] [x] [lorem]? - PullRequest
2 голосов
/ 20 июля 2011

Допустим, у меня есть форма, в которой пользователь может добавить столько собак, сколько они хотят, нажав кнопку +.

Форма выглядит так:

Dog #1 <br/>
<input name="house[dogs][][name]" value="<?=set_value('house[dogs][0][name'])?>"/>
<input name="house[dogs][][age]" value="<?=set_value('house[dogs][0][age]')?>" />

Dog #2 <br/>
<input name="house[dogs][][name]" value="<?=set_value('house[dogs][1][name'])?>"/>
<input name="house[dogs][][age]" value="<?=set_value('house[dogs][1][age]')?>" />

В CodeIgniter я запускаю проверку формы для того, чтобы set_value() также работал:

$house = $this->input->post('house');
$dogs  = $house['dogs'];

$i = 0;
foreach($dogs AS $dog){
 $this->form_validation->set_rules("house[dogs][$i][name]", 'Dog Name', 'required');
 $this->form_validation->set_rules("house[dogs][$i][age]" , 'Dog Age' , 'required');
 $i++;
}

Все это не работает, Как заставить set_value() поддерживать входные данные массивавот так?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Возможно, вам придется сделать ввод name точно таким же, как первый параметр set_value().

Один может быть не в состоянии [], тогда как другой может использовать [0].

1 голос
/ 20 июля 2011

Очень связано: http://codeigniter.com/forums/viewthread/179581/ По иронии судьбы, пост, который я сделал несколько месяцев назад, был поднят сегодня утром.

Также связан: CodeIgniter: проверка формы с многомерными данными POST


<ignore>

Короче говоря, Codeigniter не очень хорошо обрабатывает индексированные имена полей по умолчанию.

Чтобы просто заполнить ввод и обойтиНедостатки set_value(), вы можете попробовать что-то вроде этого:

<?php
$value = isset($_POST['house']['dogs'][1]['age']) ?     // was the value posted?
         form_prep($_POST['house']['dogs'][1]['age']) : // if so, clean it
         '';                                            // if not, leave empty
?>
<input name="house[dogs][1][age]" value="<?php echo $value; ?>" />

Поскольку вы, вероятно, используете цикл для их вывода, я не думаю, что это будет слишком сложно.Вы можете заполнить отдельный массив значений и прочитать их вместо этого, если хотите, вы получите идею.set_value() автоматически запускает form_prep(), поэтому я добавил его.

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

if ($this->form_validation->valid_email($this->input->post('email')) {}

Вы можете просто выбрать легкий путь и изменить имена полей, используя один индекс, например dog_age[], который, как я полагаю, облегчит проверку для CI.Желаем удачи, надеясь на исправление на днях в ядре CI.

</ignore>


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

CodeIgniter: проверка формы с многомерными данными POST

Я проверил его (работает 2.0.2), и он действительно работает.Я ничего не вижу в журнале изменений , но я проверил это, и это сработало.Убедитесь, что у вас установлена ​​последняя версия, и, возможно, попробуйте еще раз, или дайте нам знать, если я что-то здесь упустил.

Как и В вашем другом ответе сказано, что вам, вероятно, просто нужно явно проиндексироватьимена полей, такие как name="house[dogs][1][name]" вместо name="house[dogs][][name]".

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