在CakePHP中运行时设置验证规则

时间:2010-12-02 02:49:58

标签: validation cakephp

我现在的问题是,模型有一组验证规则,如下所示:

var $validate = array(
    'title' => array(
        'rule' => 'notEmpty'
    ),
    'uri' => array(
        'slugged' => array(
            'rule' => '/^[a-z0-9-_]+$/i',
            'message' => 'This field should only contain characters, numbers, dashes and underscores'
        ),
        'uniqueUrl' => array(
            'rule' => array('uniqueUrl'),
            'message' => 'A page has already acquired this url'
        )
    ),
    'meta_keywords' => array(
        'rule' => 'notEmpty'
    ),
    'meta_description' => array(
        'rule' => 'notEmpty'
    ),
    'layout' => array(
        'rule' => 'notEmpty'
    )
);

问题在于,在另一个具有hasOne关系的模型中,其控制器也会将数据插入其中。我想不要求该页面的标题,uri和布局。我该怎么做?

我有一个Post Model,我从那里设置了Page值。

Array
(
    [Post] => Array
        (
            [title] => data[Post][title]
            [body] => 

Post Body

        )

    [Category] => Array
        (
            [Category] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4
                )

        )

    [Page] => Array
        (
            [meta_keywords] => data[Page][meta_keywords]
            [meta_description] => data[Page][meta_description]
        )

)

我从控制器执行此操作以设置页面模型的信息

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

它变成了这样:

Array
(
    [Post] => Array
        (
            [title] => data[Post][title]
            [body] => 

Post Body

        )

    [Category] => Array
        (
            [Category] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4
                )

        )

    [Page] => Array
        (
            [meta_keywords] => data[Page][meta_keywords]
            [meta_description] => data[Page][meta_description]
            [title] => data[Post][title]
        )

)

我的问题是保存时我不需要Page字段。 Post belongsTo Page

保存帖子时我不需要[Page][layout]作为帖子使用Post Controller中方法的默认视图。页面使用静态页面并在创建页面时需要它们,而不是在创建帖子时。

1 个答案:

答案 0 :(得分:0)

您在进行验证之前对数据进行了预处理,因此您可以从验证中获取一些控制权。由于您似乎(在代码中)决定是否需要人工填充某些字段,因此您要将验证的那些部分呈现为冗余,您应该删除它们。如果你在php中有多个验证,那么你最终会感到困惑。

在哪里这样做或如何更干净地做到这一点?好beforeValidate可能是“正确”的地方,但我会在最符合你的应用程序逻辑的地方做到这一点。功能应该优雅。