1

我正在使用 cakePHP 编写一个客户管理系统(我尝试使用此框架构建的第一件事),并且我正在努力弄清楚如何在添加新客户时验证某些字段。每个客户都有一个我需要手动添加的 ID,以及一个必须唯一但可以为空的用户名。这是我想要发生的事情:

  1. 添加新客户时:
    • 检查 id 是否已经存在,如果存在则提醒用户(而不是添加用户)
    • 检查用户名是否已经存在,如果存在则提醒用户(而不是添加用户)
  2. 更新客户资料时(此时无法修改 id):
    • 如果用户名被修改,检查是否已经存在并提醒用户。

就目前而言,每当我尝试添加具有现有 id 的用户时,cakePHP 只会用新信息覆盖现有 id 的信息。

我尝试了几个验证选项,但似乎没有任何效果。

这是第一个:

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);
    }

第二个(仅用于 id):

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

下面是控制器的 add() 和 edit() 方法:

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'));
    }

任何和所有提示将不胜感激!

4

1 回答 1

0

如果您尝试保存的数据包含一个 id,CakePHP 假定您正在更新现有记录。对于在“创建”时触发的验证规则,不应设置 id。如果设置了 id,Cake 将检查“更新”规则。

因此,您应该让您的数据库通过自动增量影响新记录的 id,然后仅在编辑现有用户时管理验证。

于 2013-07-25T08:59:31.000 回答