Связанная модель не проверяется - PullRequest
0 голосов
/ 23 декабря 2010

В настоящее время у меня есть следующие модели:

class Category extends AppModel {
    var $name = 'Category';
    /*var $validate = array(
        'name' => 'multiple'
    );
        no idea how to use this
        */
    var $hasAndBelongsToMany = array(
        'Post' => array(
            'className' => 'Post'
        )
    );

class Post extends AppModel {
    var $name = 'Post';
    var $hasAndBelongsToMany = array(
        'Category' => array(
            'className' => 'Category'
        )
    );
    var $belongsTo = array(
        'Page' => array(
            'className' => 'Page'
        )
    );

class Page extends AppModel {
    var $name = 'Page';
    var $order = array('Page.modified' => 'desc');

    var $hasOne = array(
        'Post' => array(
            'className' => 'Post'
        ));

У меня также есть эта форма в представлении:

<div id="content-wrap">
    <div id="main">
            <h2>Add Post</h2>
            <?php echo $this->Session->flash();?>
            <div>
            <?php
            echo $this->Form->create('Post');
            echo $this->Form->input('Post.title');
            echo $this->Form->input('Category.Category', array('multiple' => 'checkbox'));
            echo $this->Form->input('Post.body', array('rows' => '3'));

            echo $this->Form->input('Page.meta_keywords');
            echo $this->Form->input('Page.meta_description');

            echo $this->Form->end('Save Post');
            ?>
            </div>
    <!-- main ends -->
    </div>

Мой контроллер:

function admin_add() {
    // pr(Debugger::trace());
    $this->set('categories', $this->Post->Category->find('list'));

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

        $this->data['Page']['title'] = $this->data['Post']['title'];
        $this->data['Page']['layout'] = 'index';

        if ($this->Post->saveAll($this->data)) {
            $this->Session->setFlash('Your post has been saved', 'flash_good');
            $this->redirect($this->here);
        }
    }
}

Проблема в том, что я могу сохранить сообщение, не выбрав для него категорию.

Я пытался добавить, как правило, в модель категории:

var $validate = array(
    'rule' => array('multiple', array('in' => array(1, 2, 3, 4))),
        'required' => TRUE,
        'message' => 'Please select one, two or three options'
);

Модель сообщений и страниц проверяется. Как активировать проверку для категории?

1 Ответ

1 голос
/ 23 декабря 2010

Во-первых, вы неправильно настроили переменную $validate. Ключами в массиве $validate должны быть имена полей . Во-вторых, правило multiple используется для проверки того, находится ли значение (я) поля в наборе значений.

var $validate = array(
    'color' => array(
        'multiple' => array(
            'rule' => array('multiple', array('in' => array('Red', 'Blue', 'Green'))),
            'required' => false,
            'message' => 'Please select one, two or three options'
         ),
    ),
);

Я проверил пример в книге на multiple, и это опечатка. Код выше верен.

Далее, если вы хотите проверить связанные модели, я предлагаю вам сделать это в вашей функции beforeSave():

function beforeSave(){
    if (isset($this->data['Category']['Category']) && empty($this->data['Category']['Category'])) {
        return false;
    }
    return true;
}

Здесь возвращение false из beforeSave () будет препятствовать выполнению сохранения. Итак, вы успешно подтвердите свое требование.

...