при обновлении вставляет еще одну строку - PullRequest
0 голосов
/ 26 апреля 2011

Я проверяю данные ниже и, если данные есть в поле формы, обновляет таблицу. Проблема в том, что если я дважды нажму на кнопку (ее ajax), она вставит вторую строку. Как я могу предотвратить это. спасибо

function update() { 
if (!empty($this->data)) {

                $this->Test->saveAll($this->data['Test'])


        }
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Проблема в том, что в форме нет поля id, поэтому cakephp вставляет новую строку.

Самый простой способ - проверить, существует ли еще одна запись с такими же значениями перед сохранением.

Вы можете включить функцию beforeSave () модели вместо действия Controller.

http://book.cakephp.org/#!/view/1052/beforeSave

0 голосов
/ 26 апреля 2011

Вы должны принять двусторонний подход, чтобы предотвратить это:

Во-первых, отключите кнопку отправки при отправке. Например, в jQuery:

$('#form_id').submit(function(event) {
    event.preventDefault();
    $('input[type=submit]', this).attr('disabled', 'disabled');
    // submit form via ajax...
}

Во-вторых, выполните рациональную проверку на стороне сервера, чтобы предотвратить повторные сохранения. Например, две идентичные записи, представленные в течение минуты или около того, будут считаться ошибкой. Вероятно, я бы сделал это, создав пользовательское правило проверки для одного из полей, которое всегда требуется. В вашей модели:

var $validate = array(
    'myfield' => array(
        'rule' => 'duplicateCheck',
        'message' => 'Duplicate record'
    )
);

function duplicateCheck() {
    $conditions = array(
        'Model.field1' => $this->data['Model']['field1'],
        ...
        'Model.created >' => date("Y-m-d H:i:s", time() - 60)
    );
    return !$this->hasAny($conditions);
}

Затем в вашем контроллере я перенаправил бы пользователя к существующей записи, если сохранение не удалось, и это было из-за этого конкретного правила проверки. Это позволяет пользователю двигаться вперед, не заботясь о том, что что-то пошло не так.

function add() {
    if(isset($this->data)) {
        if($this->Model->save($this->data)) {
            ...
        } else {
            if(isset($this->Model->validationErrors['myfield'])) {
                // find the existing record and redirect user to view it
            }
        }
    }
}
...