Welcome Guest, Not a member yet? Register   Sign In
Validation - Custom callback not behaving as expected?
#1

[eluser]NBrepresent[/eluser]
Hi, I might just be doing this wrong... but I have a situation where one of two fields must be set, so neither are required, but it is required that at least one is set.

Here's the custom callback I'm using:

Code:
//ratings check
function ratings_check() {
    if (!$this->input->post('us_rating') && !$this->input->post('cdn_rating')) {
        $this->validation->set_message('ratings_check','You must specify at least one rating (US or Canada).');
        return FALSE;
        } else {
        return TRUE;
    }
}

Here's how I set the rules:
Code:
$rules['us_rating']    =    "numeric|callback_ratings_check";
$rules['cdn_rating']    =    "numeric|callback_ratings_check";

Submitting the form with neither of them set is NOT returning false and triggering the error (as it should).

Can anyone offer any advice on this?
#2

[eluser]wiredesignz[/eluser]
I usually set the error message before the test.

Code:
function ratings_check() {
    $this->validation->set_message('ratings_check','You must specify at least one rating (US or Canada).');
    return (bool)(!$this->input->post('us_rating') && !$this->input->post('cdn_rating')) ;
}

Of course if the numeric check fails first the callback won't be run

EDIT: Validation is not carried out on an empty input unless the "required" switch is used.

You may want to add the callback test to the submit button or some other field instead.
#3

[eluser]tonanbarbarian[/eluser]
i would try debugging this in stages
first i would change the function to
Code:
function ratings_check() {
    $this->validation->set_message('ratings_check','You must specify at least one rating (US or Canada).');
    return false;
}
This will always return false but you can then determine if the validation code is even being called

Then once you know if it is being called you can further test the code
#4

[eluser]Unknown[/eluser]
I just experienced the same problem. One my fields is not required but I still want to validate it through a custom callback function.

Quote:Validation is not carried out on an empty input unless the “required” switch is used.

Is this a bug that should be reported? Or is this supposed to be normal behavior? I'd like to have someone's input on this.
#5

[eluser]ardinotow[/eluser]
[quote author="ianolito" date="1203898898"]I just experienced the same problem. One my fields is not required but I still want to validate it through a custom callback function.

Quote:Validation is not carried out on an empty input unless the “required” switch is used.

Is this a bug that should be reported? Or is this supposed to be normal behavior? I'd like to have someone's input on this.[/quote]

I also have same problem. Callback function will not work on empty field so here is my trick:
1. Set the default value of your field that need to validate to '-' (without qoute)

2. Add this javascript to make sure that '-' will still the default value eventhough a user delete '-':

onFocus="if (this.value=='-'){this.value='';};return false;" onBlur="if (this.value==''){this.value='-';return false;}"

--> copy-paste the javascript to text or textarea identifier. Example:
<textarea name="address" cols="40" rows="4" id="address" onFocus="if (this.value=='-'){this.value='';};return false;" onBlur="if (this.value==''){this.value='-';return false;}">-</textarea>

Now, your callback function should be work!
#6

[eluser]Silvrbak[/eluser]
I was just about to post about this. The javascript is cool but I wouldn't want to have to use that in all my views. Any other ideas?
#7

[eluser]ardinotow[/eluser]
I have new solution. Instead of declare default value with javascript like I mentioned before, hacking the Validation library is seems to be work.

Open Validation.php where located in system/libraries/Validation.php. In function run() find this line:

Code:
if ( ! isset($_POST[$field]) OR $_POST[$field] == '')
    {
       continue;
    }

Delete 'continue;' or just give double slash on it, here is that line should like:

Code:
if ( ! isset($_POST[$field]) OR $_POST[$field] == '')
    {
       //continue;
    }
Now, whether the field that need custom validation is empty or not your callback function should be executed.
If you think this solution has potential problem or side effect please let me know....
#8

[eluser]jppi_Stu[/eluser]
Came across this thread almost two years later, while learning about form validation with CI and needing a similar solution (at least one of two fields must be filled, but neither by itself is required). Using code similar to the OP's code, but with the current form_validation library, seems to work. It was necessary, however, to call it only on one of the two fields, otherwise the message would appear once for each field (which makes sense, of course).
#9

[eluser]InsiteFX[/eluser]
You should not be hacking the CodeIgniter Core!
Instead extend the library and customize it.

Enjoy
InsiteFX
#10

[eluser]jppi_Stu[/eluser]
[quote author="InsiteFX" date="1269316718"]You should not be hacking the CodeIgniter Core![/quote]
I assume this is in reply to ardinotow since neither the OP nor I am hacking the core... (?)




Theme © iAndrew 2016 - Forum software by © MyBB