2010-07-09 55 views
0

我会尝试尽可能清楚。在kohana验证中访问数据

我正在使用美妙的kohana框架进行一些表单验证。然而,我已经走到了十字路口,并不确定我采取的方式是否是明智的选择。基本上,我有一个日期选择器,使用几个选择框(我玩弄了使用JavaScript日期选择器的想法,但选择框被证明更适合我的目的)和数据库中的日期字段。我想将这些选择框连接到日期字段,因此可以检查它以确保其有效。

protected $_rules = array(
    'mydate'  => array(
     'not_empty'  => NULL, 
     'date'   => NULL, 
    ), 
); 

现在对我来说,最有意义包括在模型验证,因为这是在数据层是MVC模式,所以我决定创建一个名为$ _rules一些类属性,$ _filters和$ _callbacks,每个都被设置为受保护的并且应用了我的基本规则。然后在模型中使用这些属性设置验证对象并将其返回给任何控制器的函数调用它,然后控制器可以运行验证并完成作业。

我的问题来了,当我想连接这些选择框,对我来说最有意义的是做一个自定义过滤器和传递数据,但过滤器规则和回调是属性,我不能添加任何变量给他们。我目前的解决方案是,当验证设置功能正在运行类似这种在手动添加额外的过滤器:

public function setupValid($post) { 
    $this->_filters['mydatefield'] = array(
     'MyClass::MyConcat' => array($post); 
    ); 

    //creates a validation object and adds all the filters rules and callbacks 
} 

但我不觉得这是最干净的解决方案,我可能NIT采摘为该解决方案以我需要的方式工作。然而,我不确定过滤器是否曾打算做这样的事情,或者这是否应该是回调,因为回调默认访问数组,但随后再次调用回调,这将意味着我不适用任何规则,如'not_empty'(在这种情况下不重要,因为它们是预先填充的选择框,但可能在另一种情况下)

所以我想我的问题是,我是否使用过滤器打算使用?

我希望我已经设法解释清楚。

感谢

回答

2

你需要记住,你应该只验证$ _rules是您的数据库或业务逻辑非常重要的内场。

因此,例如,如果您尝试在应用程序的其他位置设置其他表单,或者您将为应用程序提供restfull api,那么字段'day_field_(that_doesnt_exists_in_the_database_and_is_used_to_privide_a_better_ux_in_this_one_form)' => array('not_empty' => NULL)的验证将使您很难做到这一点。

,所以我建议你保持你的$ _rules像他们现在并提供一些逻辑,你的价值观()方法:

// MODEL: 
public function values($values) 
{ 
    if (! empty($values['day']) && ! empty($values['month']) && ! empty($values['year'])) 
    { 
     $values['mydate'] = $values['year'].'-'.$values['month'].'-'.$values['day']; 
    } 

    return parent::values($values); 
} 


// CONTROLLER: 
if ($orm->values($form['form_array'])->check()) 
{ 
    $orm->save(); 
} 
else 
{ 
    $this->template->errors = $orm->validate()->errors('validation'); 
} 
+0

天才!是的,这是我发布我的问题后昨天开始想到的。我只是尝试了几乎所描述的,在我的值中寻找包含* _day * _month * _year的键,然后取*(在数组中的情况下,我只是将它用作通配符)。这将要求我坚持使用我的表格命名约定,但是为了节省时间,它是值得的。感谢您的再保证:) – studioromeo 2010-07-10 10:17:04