CakePHP isUnique Validation во время редактирования пользователем - PullRequest
2 голосов
/ 02 января 2012

У меня обработан следующий проверочный код для моей модели пользователя.Он хорошо работает при создании пользователя, но не работает при обновлении.Мне известно о 'on' => 'create', но я хочу, чтобы правило также применялось и во время редактирования.Я разрешаю пользователю изменить свое имя пользователя, но если то, на что его изменяет пользователь, уже находится в Db, то в представлении должно быть отказано.

var $validate = array(
    'username' => array(
        'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'message' => 'Usa letras ou numeros como o teu << Usuario >>',
        ),
        'between' => array(
                'rule' => array('between' , 5, 15),
                'message' => 'O << Usuario >> tens que ter entre 5 a 15 letras/numeros',
        ),
        'isUnique' => array(
                'rule' => 'isUnique',
                'message' => 'O << Usuario >> que escolhestes ja foi utilizado. Escolhe um outro.'
        )
    )
);

Поскольку пользователю необходимо войти в систему, чтобы достичьОтредактируйте страницу, можно ли создать пользовательское правило проверки для:

  1. Проверьте, принадлежит ли введенное имя пользователя Auth-> User ('id') и отправлено ли оно нормально
  2. Однако, если представляемое имя пользователя отличается от Auth-> User ('username'), мы должны проверить, не имеет ли это имя пользователя никто другой.
  3. И если Auth-> User () имеет значение NULL, обработайтеisUnique как обычно, так как это применимо только при создании нового пользователя.

Спасибо

check

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Мне удалось исправить мою проблему, используя следующее:

var $validate = array(
    'username' => array(
        'third' => array(
                'rule' => array('checkUniqueName'),
                'message' => 'O << Usuario >> que escolhestes ja foi utilizado. Escolhe um outro.'
        )
    ),
    'email' => array(
        'second' => array(
            'rule' => array('checkUniqueEmail'),
            'message' => 'Este email ja foi registado anteriormente. Contacta-nos se foi por engano'
        )
    )
);  


function checkUniqueName($data) {

    $isUnique = $this->find(
                'first',
                array(
                    'fields' => array(
                        'User.id',
            'User.username'
                    ),
                    'conditions' => array(
                        'User.username' => $data['username']
                    )
                )
        );

    if(!empty($isUnique)){

        if($this->authUserId == $isUnique['User']['id']){
            return true; //Allow update
        }else{
            return false; //Deny update
        }
    }else{
        return true; //If there is no match in DB allow anyone to change
    }
    }

function checkUniqueEmail($data) {

    $isUnique = $this->find(
                'first',
                array(
                    'fields' => array(
                        'User.id'
                    ),
                    'conditions' => array(
                        'User.email' => $data['email']
                    )
                )
        );

    if(!empty($isUnique)){

        if($this->authUserId == $isUnique['User']['id']){
            return true; //Allow update
        }else{
            return false; //Deny update
        }
    }else{
        return true; //If there is no match in DB allow anyone to change
    }
    }
1 голос
/ 03 января 2012

Если ключ 'on' не указан для правила проверки или для него задано значение null, правило будет применяться как для операций создания, так и для операций обновления, как указано в 1.3 и 2.0 руководство:

Для клавиши «Вкл» можно установить одно из следующих значений: «обновить» или «создать». Это обеспечивает механизм, который позволяет применять определенное правило либо во время создания новой записи, либо во время обновления записи.

Если в правиле определено «on» => «create», правило будет применяться только при создании новой записи. Аналогично, если оно определено как «включено» => «обновить», оно будет применено только при обновлении записи.

Значением по умолчанию для «on» является ноль. Если значение «on» равно нулю, правило будет применяться при создании и обновлении.

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

<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->hidden('id', array('value' => AuthComponent::user('id'))); ?>
<?php echo $this->Form->input('username'); ?>
<?php echo $this->Form->end('Update Username'); ?>

Если форма является формой создания пользователя, вы не включите скрытое поле идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...