views:

60

answers:

1

Hi there, i'll try and be as clear as possible.

I'm working on some form validation using the wonderful kohana framework. However i have come at a crossroads and not sure whether the way i have taken is a wise choice.

Basically, i have a date selector using several select boxes (i toyed with the idea of using javascript date pickers but the select boxes proved to be more suitable for my purpose) and a date field in a database. I wanted to concatenate these select boxes into the date field so it can be checked to make sure its valid.

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

Now to me, it makes most sense to include the validation in the model, since that's where the data layer is in the MVC pattern, so i decided to create some class attributes named $_rules, $_filters and $_callbacks, each set as protected and with my basic rules applied. And then a function in the model that sets up a validation object using these attributes and returning it to whatever controller is calling it, then the controller can just run the validation and the job is done.

My problem comes when i want to concat these select boxes, to me it makes most sense to make a custom filter and pass in the post data, but with the filters rules and callbacks being attributes, i can't add any variables to them. My current solution is to manually add the extra filter in when the validation setup function is being run something similar to this:

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

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

But i don't feel this is the cleanest solution, i'm probably nit picking as the solution works the way i require it to. However i'm not sure whether a filter was ever intended to do such a thing as this, or whether this should be a callback as the callback has access to the array by default, but then again callbacks are called last, which would mean i couldn't apply any rules like, 'not_empty' (not important in this case since they are pre populated select boxes, but might be in another case)

So i guess my question is, am i using filters as they were intended to be used?

I hope i've managed to explain this clearly.

Thanks

+2  A: 

you need to keep in mind that you should only validate fields inside the $_rules that are very important to your database or business logic.

so for example if you would try to setup other form somewhere else in your app or you would provide a restfull api for your app, validation of the field 'day_field_(that_doesnt_exists_in_the_database_and_is_used_to_privide_a_better_ux_in_this_one_form)' => array('not_empty' => NULL) will give you a hard time to do that.

so i suggest you to keep your $_rules like they are now and provide some logic to your values() method:

// 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');
}
antpaw
Genius! Yeah, this is what i started to think last night after posting my question. Im just trying out pretty much what you've described, in my values looking for keys containing *_day *_month *_year, then taking * (would be some word in the arrays case i just use it as a wildcard here). It's gonna require me to adhere to a naming convention with my forms but it's worth it for the time saving later on. Thanks for the reassurance :)
Rob