Я новичок в CakePHP. Когда я использую Model Field Validations
он показывает сообщение об ошибке в каждом поле необходимой формы. Я хочу показать его в div в верхней части формы. Как я могу это реализовать. Заранее спасибо. Вот мой код: Модель:
<?php class User extends AppModel { public $validate = array( 'username' => array( 'required' => array( 'rule' => array('notEmpty'), 'message' => 'A username is required' ), array( 'rule' => array('minLength', 8), 'message' => 'Username must be at least 6 characters long' ) ), 'password' => array( 'required' => array( 'rule' => array('notEmpty'), 'message' => 'A password is required' ) ), 'city' => array( 'required' => array( 'rule' => array('notEmpty'), 'message' => 'A City is required' ) ), 'state' => array( 'required' => array( 'rule' => array('notEmpty'), 'message' => 'A State is required' ) ), 'role' => array( 'valid' => array( 'rule' => array('inList', array('admin', 'author')), 'message' => 'Please enter a valid role', 'allowEmpty' => false ) ) ); }
UsersController.php
public function add() { $this->set('states_options', $this->State->find('list', array('fields' =>array('id','name') ))); $this->set('cities_options', array()); if ($this->request->is('post')) { $this->User->set($this->request->data); if($this->User->validates()) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->Session->setFlash(__('The user has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The user could not be saved. Please, try again.')); } } else { $errors = $this->User->validationErrors; $this->set('ValidateAjay',$errors); //pr($errors);die; } } }
Пользовательский вид:
<!--<script src="http://code.jquery.com/jquery-1.7.2.js"></script>--> <script> $(document).ready(function(){ $('#UserState').change(function(){ var stateid=$(this).val(); $.ajax({ type: "POST", url: "checkcity", data:'stateid='+stateid+'&part=checkcity', success: function(data) { $("#city_div").html(data); } }); }); }); </script> <div class="users form"> <?php if(!empty($ValidateAjay)){ pr($ValidateAjay); } echo $this->Form->create('User'); ?> <fieldset> <legend><?php echo __('Add User'); ?></legend> <?php echo $this->Form->input('username'); echo $this->Form->input('password'); echo $this->Form->input('state', array('options' => $states_options , 'empty' => 'Select State' )); ?> <div id="city_div"> <?php echo $this->Form->input('city', array('options' => $cities_options, 'empty' => 'Select City' )); ?> </div> <?php echo $this->Form->input('role', array( 'options' => array('admin' => 'Admin', 'author' => 'Author') )); ?> </fieldset> <?php echo $this->Form->end(__('Submit')); ?> </div>
Вы можете получить все ошибки проверки из переменной $this->validationErrors
на представлении. Тогда не стесняйтесь проходить через них и показывать, как вам нравится. Они будут организованы по модели, например:
array( 'User' => array( 'username' => 'This field cannot be empty.', 'password' => 'This field cannot be empty.' ) );
Затем вы можете перебирать их на экране и отображать их как таковые. В этом примере они отображаются как неупорядоченный список:
$errors = ''; foreach ($this->validationErrors['User'] as $validationError) { $errors .= $this->Html->tag('li', $validationError); } echo $this->Html->tag('ul', $errors);
Наконец, вы можете скрыть автоматические сообщения об ошибках помощника формы, сокрыв их с помощью CSS или установив по умолчанию параметры FormHelper, чтобы их не показывать.
CSS
.input.error { display: none; }
или
в представлении
$this->Form->inputDefaults(array( 'error' => false ));
Пример jeremyharris имеет большой смысл, однако, если вы не хотите вручную устанавливать цикл для каждого поля формы, вы можете попробовать следующее:
$errors = ''; foreach($this->validationErrors as $assoc) { foreach ($assoc as $k => $v) { $errors .= $this->Html->tag('li', $v); } } echo $this->Html->tag('ul', $errors);
Поэтому, если ваша проверка возвращает несколько ошибок, результат будет выглядеть так:
- A username is required - A password is required