2013-07-25 4 views
1

Я пишу систему управления клиентами, используя cakePHP (первое, что я когда-либо пытался построить с использованием этой структуры), и я изо всех сил пытаюсь выяснить, как проверять определенные поля, когда добавив нового клиента. У каждого клиента есть идентификатор, который мне нужно добавить вручную, и имя пользователя, которое должно быть уникальным, но может быть пустым. Вот что я хочу, чтобы это произошло:Проверка данных CakePHP при создании и обновлении

  1. При добавлении нового клиента:
    • Проверьте, существует ли уже идентификатор и предупреждает пользователя, если он делает (и не добавить пользователя)
    • Проверьте, правильно ли имя пользователя, уже существует и предупреждает пользователя, если он делает (и не добавить пользователя)
  2. при обновлении профиля клиента (идентификатор не может быть изменен на данный момент):
    • Если имя пользователя было изменено, проверьте, существует ли он и предупреждает пользователя.

Как теперь стоит всякий раз, когда я пытаюсь добавить пользователя с существующим идентификатором, CakePHP просто перезаписывает данные существующего идентификаторам с новой информацией.

Я пробовал несколько вариантов проверки, но ничего не работает.

Вот первый:

public $validate = array(
     'id' => array(
      'idRule-1' => array(
       'on' => 'create', 
       'rule' => 'uniqueID', 
       'message' => 'This Oracle ID already exists.', 
       'last' => false 
      ), 
      'idRule-2' => array(
       'rule' => 'numeric', 
       'message' => 'Oracle ID can only contain numbers.', 
       'last' => false 
      ), 
     ), 
     'username' => array(
      'userRule-1' => array(
       'on' => 'create', 
       'rule' => 'uniqueUser', 
       'message' => 'This username already exists', 
       'last' => false, 
      ), 
      'userRule-2' => array(
       'on' => 'update', 
       'rule' => 'oneUser', 
       'message' => 'The eBay username you are trying to modify already belongs to another seller', 
       'last' => false, 
      ), 
     ) 
    ); 

public function uniqueID() { 
     return ($this->find('count', array('conditions' =>array('Seller.id' => $this->data['Seller']['id']))) == 0); 
    } 

    public function uniqueUser() { 
     return ($this->find('count', array('conditions' =>array('Seller.username' => $this->data['Seller']['username']))) == 0); 
    } 

    public function oneUser() { 
     return ($this->find('count', array('conditions' =>array('Seller.username' => $this->data['Seller']['username']))) == 1); 
    } 

и второй (только для идентификатора):

public $validate = array(
     'id' => array(
      'unique' => array(
       'rule' => 'isUnique', 
       'on' => 'create', 
       'message' => 'This Oracle ID already exists.', 
      ) 
     ) 
    ); 

И здесь надстройка() и редактировать() метода контроллера:

public function add() { 
    if ($this->request->is('post')) { 
     $this->Seller->create(); 
     if ($this->Seller->save($this->request->data)) { 
      $this->Session->setFlash(__('The seller has been saved')); 
      $this->redirect(array('action' => 'index')); 
     } else { 
      $this->Session->setFlash(__('The seller could not be saved. Please, try again.')); 
     } 
    } 
    $accountManagers = $this->Seller->AccountManager->find('list'); 
    $primaries = $this->Seller->Primary->find('list'); 
    $thirdParties = $this->Seller->ThirdParty->find('list'); 
    $sites = $this->Seller->Site->find('list'); 
    $meetings = $this->Seller->Meeting->find('list'); 
    $this->set(compact('accountManagers', 'primaries', 'thirdParties', 'sites', 'meetings')); 
} 

/** 
* edit method 
* 
* @throws NotFoundException 
* @param string $id 
* @return void 
*/ 
    public function edit($id = null) { 
     if (!$this->Seller->exists($id)) { 
      throw new NotFoundException(__('Invalid seller')); 
     } 
     if ($this->request->is('post') || $this->request->is('put')) { 
      $this->Seller->id = $id; 
      if ($this->Seller->save($this->request->data)) { 
       $this->Session->setFlash(__('The seller has been saved')); 
       $this->redirect(array('action' => 'index')); 
      } else { 
       $this->Session->setFlash(__('The seller could not be saved. Please, try again.')); 
      } 
      debug($this->Seller->validationErrors); 
     } else { 
      $options = array('conditions' => array('Seller.' . $this->Seller->primaryKey => $id)); 
      $this->request->data = $this->Seller->find('first', $options); 
     } 
     $accountManagers = $this->Seller->AccountManager->find('list'); 
     $primaries = $this->Seller->Primary->find('list'); 
     $thirdParties = $this->Seller->ThirdParty->find('list'); 
     $sites = $this->Seller->Site->find('list'); 
     $meetings = $this->Seller->Meeting->find('list'); 
     $this->set(compact('accountManagers', 'primaries', 'thirdParties', 'sites', 'meetings')); 
    } 

Все советы будут очень благодарны!

ответ

0

Если данные, которые вы пытаетесь сохранить, содержат идентификатор, CakePHP предполагает, что вы обновляете существующую запись. Чтобы правило проверки было инициировано на «create», идентификатор не должен быть установлен. Если идентификатор установлен, Cake будет проверять правила «обновления».

Таким образом, вы должны позволить вашей базе данных влиять на идентификаторы новых записей с автоинкрементами, а затем управлять проверкой только при редактировании существующих пользователей.

+0

Ну, это расстраивает, так как id-вещь довольно не подлежит обсуждению (она использует идентификаторы из другой системы, и мне не разрешено изменять их). Есть ли способ проверить метод ссылки внутри проверки, чтобы я мог различать вызовы add() и edit()? – wonderv

+0

Почему вы просто не устанавливаете правило проверки подлинности при проверке идентификатора, если оно уникально или нет, не задаваясь вопросом, создаете ли вы или обновляете? То же самое касается имени пользователя. Вы всегда должны сохранять эти два поля уникальными в своей базе данных ... – Chris

+0

Когда я устанавливаю правило только для этого: public $ validate = array ( 'id' => array ( 'unique' => array ( 'rule '=>' isUnique ', ' message '=>' Этот идентификатор Oracle уже существует. ', ) ) ); Он по-прежнему создает дубликат id. Я что-то упускаю? – wonderv

Смежные вопросы