Dollique
Dollique

Reputation: 1012

PHP: Hide Form after validation (class)

I have a form that is mostly generated by a class named "buildform". Now every part of the form validates itself on the position it is. This looks like this:

echo $frm->create_input("customer_nr", "Customer Nr.", "text:empty:int");

The third attribute here are the conditions (here: text field, not empty only integer). The function "create_input" calls some more function that are validating the form field directly on place when the form is submitted. I do it this way for multiple reasons:

This is really comfortable and until now has made creating forms very easy.

The validation errors for then the users will be stored in a class variable like this:

function add_err($n_errmsg) {
    $this->errmsgs[] = $n_errmsg;
    return;
}

At the end of the form I show the errors like this:

if(isset($_POST["sbm"])) {
    $ret_err = $frm->ret_err();
    if(!empty($ret_err)) {
        echo $ret_err;
    }
    else {
       // send success mail
    }
}

This all works without any problems. Now I had the idea to hide the form when it's submitted. But then I would have to make sure there are no errors before the form even is loaded!

I wanted to something like

else {
    $hideform = true;
    // send success mail
}

This currently is not possible as the errors are generated while "generating" the form fields. If I move the errors to the top the errors are always "empty" there because the validation is done later below...

Do you have an idea how I can solve this? Do I have to validate the forms before loading them or is there another way?

Thanks! Best Regards Toby

Upvotes: 0

Views: 247

Answers (1)

Steve
Steve

Reputation: 20459

Ok, well there are a few ways to solve this.

Basically you are echoing the form html as you go along:

echo $frm->create_input(...);
echo $frm->create_input(...);

what you could do instead is save the html into a string:

$formhtml = '';
$formhtml .= $frm->create_input(...);
$formhtml .= $frm->create_input(...);

if($frm->ret_error()){
    echo $formhtml;
    //other logic
}else{
    //send mail
}

Along the same lines, you could change your form class, so that this is done internaly, and add a show method:

private $html = '';
function create_input(...){
    //retrun $ret;
    $this->html .= $ret;
function show(){
    echo $this->html;
}


$frm->create_input(...);
$frm->create_input(...);

if($frm->ret_error()){
    $frm->show();
    //other logic
}else{
    //send mail
}

Upvotes: 1

Related Questions