2015-10-22 28 views
3

由於某些原因,我在保存多個記錄時沒有收到任何驗證錯誤。我可以使用print_r($ user-> errors())獲取錯誤;但它們不會像添加單個用戶時那樣自動注入到表單中。根據docs「在使用newEntity(),newEntities()」時自動完成保存前的驗證實體。「我不確定是否有特定的方法來設置表單以使其返回多個記錄的驗證,或者如果您必須在模型中對具有索引或什麼的輸入進行特殊驗證?如何使用newEntities()CakePhp 3.x保存多個記錄時進行驗證?

視圖:

<div class="page-wrap"> 
    <div class="form"> 
     <h1>Join Now</h1> 
     <?php 
      echo $this->Form->create(null, ['controller' => 'users', 'action' => 'addMultiple']); 
      echo $this->Form->input('1.full_name'); 
      echo $this->Form->input('1.username'); 
      echo $this->Form->input('1.email'); 
      echo $this->Form->input('1.password'); 
      echo $this->Form->input('1.password_confirmation', array('type' => 'password')); 

      if ($current_user['role'] === 1 && isset($logged_in)) { 
       echo $this->Form->input('1.role', ['type' => 'select', 'options' => ['1' => 'Admin', '2' => 'Editor', '3' => 'Author', '4' => 'Reader'], 'default' => '4']); 
      } 
      echo $this->Form->input('2.full_name'); 
      echo $this->Form->input('2.username'); 
      echo $this->Form->input('2.email'); 
      echo $this->Form->input('2.password'); 
      echo $this->Form->input('2.password_confirmation', array('type' => 'password')); 

      if ($current_user['role'] === 1 && isset($logged_in)) { 
       echo $this->Form->input('2.role', ['type' => 'select', 'options' => ['1' => 'Admin', '2' => 'Editor', '3' => 'Author', '4' => 'Reader'], 'default' => '4']); 
      } 

      echo $this->Form->button(__('Sign Up')); 
      echo $this->Form->end(); 
     ?> 
    </div> 
</div> 

控制器:

public function addMultiple() 
{ 
    $users = $this->Users->newEntities($this->request->data()); 
    if ($this->request->is('post')) { 
     foreach($users as $user) { 
      if(empty($this->request->session()->read('Auth.User')) || $this->request->session()->read('Auth.User.role') !== 1) { 
       $user->role = 4; 
      } 
      if ($this->Users->save($user)) { 
       $this->Flash->success(__('You have been added.')); 
      } else { 
       $this->Flash->error(__('You could not be added. Please, try again.')); 
      } 
     } 
    } 
} 

表:

公共函數初始化(數組$配置) { 父::初始化($配置);

$this->table('users'); 
    $this->displayField('id'); 
    $this->primaryKey('id'); 
    $this->addBehavior('Timestamp'); 

    $this->hasMany('MembershipOrders', [ 
     'foreignKey' => 'user_id', 
     'joinType' => 'INNER' 
    ]); 
    $this->hasMany('MembershipOrders', [ 
     'foreignKey' => 'affiliate_token', 
     'joinType' => 'INNER' 
    ]); 
} 
public function validationDefault(Validator $validator) 
{ 
    $validator 
     ->notEmpty('full_name', 'A full name is required') 
     ->add('full_name', 'notBlank', [ 
      'rule' => 'notBlank', 
      'message' => __('A full name is required'), 
     ]); 

    $validator 
     ->notEmpty('username', 'A username is required') 
     ->add('username', [ 
      'notBlank' => [ 
       'rule' => 'notBlank', 
       'message' => __('A username is required'), 
       ] 
     ]); 

    $validator 
     ->notEmpty('email', 'An email is required') 
     ->add('email', [ 
      'notBlank' => [ 
       'rule' => 'notBlank', 
       'message' => __('A full name is required'), 
       ], 
      'unique' => [ 
       'rule' => 'validateUnique', 
       'provider' => 'table', 
       'message' => __('That email has already been used.'), 
       ] 
     ]); 

    $validator 
     ->notEmpty('old_password', 'You must enter your old password is required') 
     ->add('old_password', 'notBlank', [ 
      'rule' => 'notBlank', 
      'message' => __('Your old password is required'), 
     ]); 

    $validator 
     ->notEmpty('password', 'A password is required') 
     ->add('password', 'notBlank', [ 
      'rule' => 'notBlank', 
      'message' => __('A full name is required'), 
     ]); 

    $validator 
     ->notEmpty('password_confirmation', 'Password confirmation is required') 
     ->add('password_confirmation', 
      'comareWith', [ 
       'rule' => ['compareWith', 'password'], 
       'message' => 'Passwords do not match.' 
     ]); 

    $validator 
     ->notEmpty('role', 'A role is required') 
     ->add('role', 'inList', [ 
      'rule' => ['inList', ['1', '2', '3', '4']], 
      'message' => 'Please enter a valid role' 
     ]); 
    return $validator; 
} 
+0

我想通了如何得到一些驗證工作,但我必須手動完成所有工作。有沒有更好的辦法?我喜歡在添加單個記錄時自動插入驗證的事實。爲什麼多記錄不是這種情況? – Battousai

回答

-1

您對實體對象傳遞給Form->create(...功能,而不是傳遞null如下所示:

echo $this->Form->create($user, ..... 
+1

如果嘗試添加多個用戶,則這不起作用。 – Battousai