cfwheels

CFWheels: Form Helper Radio Button


I am using CFWheels for form validation. I have presenseOf() validation checks in both objects models. I have a form with a textbox and a set of radio buttons.

However If I submit the form empty, the validation for supervisor works but validation for the user checklist does not work. It gives the error;

"uchecklist" is not defined in the params variable.

On further observation, I notice that when the form is submitted, params struct has the "supervisor[name]" object but its empty, however it doesn't even have the "uchecklist[cstatus]" object. Moreover only when I select one of the radio buttons then the "uchecklist[cstatus]" object is submitted with that radio button's value.

I need to validate if at least one of the radio button is select, I guest this functionality is different from the empty text box validation.

Can someone show me how a radio button is validated using CFWheels form helpers.

Controller

public function t_validate()
        {
            title = "Home";
            supervisor = model("supervisors");
            uchecklist = model("user_checklist");


        }

        public function t_validate_complete()
        {
            title = "Home";

            supervisor = model("supervisors").new(params.supervisor);
            supervisor.save();

            uchecklist = model("user_checklist").new(params.uchecklist);
            uchecklist.save();

            renderPage(action="t_validate");
        }

View

<cfoutput>
<cfdump var="#params#">

#errorMessagesFor("supervisor")#

#startFormTag(action="t_validate_complete")#

    <div>
        <label for="">Supervisor:</label>
        <input name="supervisor[name]" value="" />
    </div>

    <fieldset>

        <input type="radio" name="uchecklist[cstatus]" value="1" />
        <label for="profile-eyeColorId-2">Blue</label><br />

        <input type="radio" name="uchecklist[cstatus]" value="2" />
        <label for="profile-eyeColorId-1">Brown</label><br />

        <input type="radio" name="uchecklist[cstatus]" value="3" />
        <label for="profile-eyeColorId-3">Hazel</label><br />

    </fieldset>

    <div>
        <input type="submit" value="Save Changes" />
    </div>

#endFormTag()#

</cfoutput>

Solution

  • An unchecked radio button will submit no data to the server. This isn't a unique problem to ColdFusion or CFWheels.

    To fix, provide a default value for the struct at the beginning of your controller action:

    public function t_validate_complete()
    {
        // Provides an empty struct for the model to consume if none of the radio buttons are checked.
        param name="params.uchecklist" type="struct" default="#StructNew()#";
    
        title = "Home";
    
        supervisor = model("supervisors").new(params.supervisor);
        supervisor.save();
    
        uchecklist = model("user_checklist").new(params.uchecklist);
        uchecklist.save();
    
        renderPage(action="t_validate");
    }