Модель проверки CakePHP всегда верна, но сообщения об ошибках все еще отображаются - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь проверить форму и сохранить ее в базе данных, но ItemType-> validates () всегда имеет значение true, даже при вводе неверных данных.

ItemTypesController.php

<?php
App::uses('AppController', 'Controller');

class ItemTypesController extends AppController {

public function add() {
    if ($this->request->is('post')) {
        $this->ItemType->set($this->request->data);
        $this->ItemType->create();
        if($this->ItemType->validates()){
            debug($this->ItemType->validates());
            if ($this->ItemType->save($this->request->data)) {
                $this->Flash->success(__('The item type has been saved.'));
                return $this->redirect(array('action' => 'index'));
            } else {

                $this->Flash->warning(__('The item type could not be saved. Please, try again.'));
            }
        }
        debug($this->ItemType->validationErrors);
        $this->Flash->warning($this->ItemType->validationErrors);

    }
}




}

ItemType.php

class ItemType extends AppModel {


public $validate = array(
    'code' => array(
        'required' => array(
            'rule' => 'notBlank',
            'message' => 'A code is required'
        ),
        'alphanum' => array(
            'rule' => 'alphanumeric',
            'message' => 'A code must be an alphanumeric value'
        ),
        'unique' => array(
            'rule' => 'isUnique',
            'message' => 'This code already exists!'
        )
    ),
    'name' => array(
        'required' => array(
            'rule' => 'notBlank',
            'message' => 'A name is required'
        ),
        'unique' => array(
            'rule' => 'isUnique',
            'message' => 'This name already exists!'
        )
    ),
    'class' => array(
        'valid' => array(
            'rule' => array('inList', array('product', 'material', 'kit', 'semi_product', 'service_product', 'service_supplier','consumable','inventory','goods','other')),
            'message' => 'Please enter a valid class',
            'allowEmpty' => false
        )
    ));

public $hasMany = array(
    'Item' => array(
        'className' => 'Item',
        'foreignKey' => 'item_type_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

}

add.ctp

<div class="itemTypes form">
<?php echo $this->Form->create('ItemType'); ?>
<fieldset>
    <legend><?php echo __('Add Item Type'); ?></legend>
<?php
    echo $this->Form->input('code');
    echo $this->Form->input('name');
    echo $this->Form->input('class');
    echo $this->Form->input('tangible');
    echo $this->Form->input('active');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>
<div class="actions">

Итак, когда я вводю данные в форму и отправляю, она всегда пытается сохранить в БД, хотя проверка не должна разрешать, я отлаживал с помощью функции debug (), и $ this-> ItemType-> validates () всегда имеет значение true. Что делает это более странным, когда я пытаюсь отправить те же данные, но для отладки сообщений об ошибках в блоке else, они присутствуют в том виде, в каком они должны быть (но validates () имеет значение true):

array(
'code' => array(
    (int) 0 => 'This code already exists!'
),
'name' => array(
    (int) 0 => 'A name is required'
),
'class' => array(
    (int) 0 => 'Please enter a valid class'
)
)

Я не знаючтобы получить, как $ this-> ItemType-> validates может быть истинным, а $ this-> ItemType-> validationErrors одновременно имеют значение.

1 Ответ

1 голос
/ 13 октября 2019

Это происходит потому, что вы устанавливаете данные для проверки с использованием метода set, но в следующей строке вы вызываете create. Метод create очищает все, и вы не получаете никаких ошибок проверки. Согласно Docs

Он фактически не создает запись в базе данных, но очищает Model :: $ id и устанавливает данные Model :: $ на основе значений по умолчанию в вашей базе данных. Если вы не определили значения по умолчанию для полей вашей базы данных, Model :: $ data будет установлен в пустой массив.

Вам необходимо переместить строку $this->ItemType->create(); непосредственно передваш save метод.

Ваш код должен быть таким, как показано ниже:

        $this->ItemType->set($this->request->data);
        //$this->ItemType->create();           //Commented this
        if($this->ItemType->validates()){
            debug($this->ItemType->validates());
            $this->ItemType->create();  //Move your create here.
            if ($this->ItemType->save($this->request->data)) {
                $this->Flash->success(__('The item type has been saved.'));
                return $this->redirect(array('action' => 'index'));
            } else {

                $this->Flash->warning(__('The item type could not be saved. Please, try again.'));
            }
        }
...