Проверка не работает. Все поля формы идут динамически. Это зависит от пользователя, сколько полей он выбирает. Если он выберет 2 и отобразит 2 поля в представлении. Если выбрать 3, тогда отобразится 3 поля и т. Д. У меня есть более 30 полей
Я установил 3 массива (для целей тестирования я установил только 3. Это будет полное количество полей) на моей странице проверки формы. Если я удаляю последний массив, чем работает проверка, потому что я получаю только 2 поля в представлении. Я не могу использовать более двух массивов на моей странице проверки формы.
Обязательно ли требовать, чтобы количество полей в представлении равно количеству наборов массивов правил в форме проверки?
Посмотреть
Это моя динамическая страница просмотра
<?php echo form_open('formbuilder_control/enxample_from_view'); foreach ($data as $key) {// I am getting output $exp_fields_name=$key->fields_name; $exp_fields_type=$key->fields_type; $exp_form_elements=$key->form_elements; $abc=explode(',',$exp_form_elements); foreach ($abc as $value) { if ($exp_fields_name == $value) {?> <div class="form-group row label-capitals"> <label class="col-sm-5 col-form-label"><?php echo $exp_fields_name;?></label> <div class="col-sm-7"> <input type="<?php echo $exp_fields_type;?>" name="<?php echo $exp_fields_name;?>" placeholder="<?php echo $value;?>" class="form-control" /> <?php echo form_error($exp_fields_name); ?> </div> </div> <?php }}}?> <div class="form-buttons-w btn_strip"> <input type="submit" name="submit" value="Save" class="btn btn-primary margin-10"> </div> <?php echo form_close(); ?>
Form_validation.php
$config = array( 'test'=>array( array('field' =>'firstname', 'label' => 'First Name', 'rules' => 'required' ), array('field' => 'lastname', 'label' => 'lastname', 'rules' => 'required' ), array('field' => 'middlename', 'label' => 'middlename', 'rules' => 'required' ) ), );
контроллер
public function test() { if($this->form_validation->run('test') == TRUE) { echo "working"; } $this->load->view('test1'); }
Конечно, это провалится. Ваши правила проверки определяют поле «middlename» по мере required
, и это поле даже не существует в форме.
Недопустимое поле не может удовлетворять required
правилу.
Можно иметь гибкие наборы правил с минимальным кодом. Рассмотрим этот пример form_validation.php
<?php $first_last = array( array('field' => 'firstname', 'label' => 'First Name', 'rules' => 'required' ), array('field' => 'lastname', 'label' => 'lastname', 'rules' => 'required' ), ); $middle_name = array( array('field' => 'middlename', 'label' => 'middlename', 'rules' => 'required' ) ); $config = array( 'fullname' => array_merge($first_last, $middle_name), //first, middle and last name fields 'shortname' => $first_last, //only first and last name fields );
Это предоставляет два разных набора полей для использования с form_validation->run()
.
Например: в форме, использующей поля с первым, средним и последним именем
if($this->form_validation->run('fullname')) { ...
Или, когда форма содержит только поля первого и последнего имени
if($this->form_validation->run('shortname')) { ...
имяif($this->form_validation->run('shortname')) { ...
Как уже говорили другие, вам требуется поле, которого не существует. Вам либо необходимо:
middlename
middlename
существовало Не внося свой вклад в вашу проблему, но в аспекте юзабилити вы, скорее всего, захотите изменить ярлык в своих правилах middlename
и middlename
чтобы сделать их более удобными для пользователя.
$config = array('test'=>array( array('field' =>'firstname', 'label' => 'First Name', 'rules' => 'required' ), array('field' => 'lastname', 'label' => 'lastname', 'rules' => 'required' ), array('field' => 'middlename', 'label' => 'middlename', 'rules' => 'required' ) ), );
Кроме того, в документации есть другие полезные советы для разных пользовательских правил, если вы не пытаетесь потребовать имя middlename
но хотите дезинформировать или подтвердить свой формат перед вставкой в базу данных.
https://www.codeigniter.com/userguide3/libraries/form_validation.html#form-validation-tutorial
Ну, так как вы хотите иметь один набор правил проверки, и у вас есть две различные формы для проверки, вы можете сделать это, используя очень хороший вариант с функцией callback
проверки Codeigniter. Я собираюсь опубликовать простой пример:
Ваш файл вида:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <?php echo form_open('formbuilder_control/test');?> <input type="text" name="firstname"> <input type="hidden" name="which_form" value="first_form"> <?php echo form_error('firstname'); ?> <input type="text" name="lastname"> <?php echo form_error('lastname'); ?> <input type="submit" name="submit" value="submit"> <?php echo form_close(); ?> <?php echo form_open('formbuilder_control/test');?> <input type="text" name="firstname"> <input type="hidden" name="which_form" value="second_form"> <?php echo form_error('firstname'); ?> <input type="text" name="lastname"> <?php echo form_error('lastname'); ?> <input type="text" name="middlename"> <?php echo form_error('middlename'); ?> <input type="submit" name="submit" value="submit"> <?php echo form_close(); ?> </body> </html> <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class YourController extends CI_Controller { public function save() { //.... Your controller method called on submit $this->load->library('form_validation'); // Build validation rules array $validation_rules = array( array( 'field' => 'A', 'label' => 'Field A', 'rules' => 'trim|xss_clean' ), array( 'field' => 'B', 'label' => 'Field B', 'rules' => 'trim|xss_clean' ), array( 'field' => 'C', 'label' => 'Field C', 'rules' => 'trim|xss_clean|callback_required_inputs' ) ); $this->form_validation->set_rules($validation_rules); $valid = $this->form_validation->run(); // Handle $valid success (true) or failure (false) } public function required_inputs() { if( $this->input->post('which_form') == "second_form" && !$this->input->post('middlename')) { $this->form_validation->set_message('middlename', 'Middle name is required!'); return FALSE; } return TRUE; } }
Из приведенного выше примера вы можете видеть, что функция required_inputs
похожа на обычную функцию, где вы можете написать любой PHP-код. Так что бы я советовал, у вас есть одно скрытое поле в обеих формах, jus, чтобы проверить, какая форма была отправлена, а затем установить функцию обратного вызова для middlename
проверки правильности middlename
и в этой функции, проверить, какая форма отправлена пользователем, и на основе он возвращает TRUE или FALSE.
Надеюсь, это даст вам всю идею, что вы можете сделать.
Вам просто нужно добавить скрытое поле с различным значением в каждой форме и проверить значение в функции обратного вызова, чтобы решить, следует ли применять третье правило проверки или нет.