user648198
user648198

Reputation: 2020

Need Help with Zend Form dropdown menu validation

I'm working on a zend framework project and I needed the user to select school and then it goes to the next form then select the grade.

Eg User select ABC High School and then select "Grade 8"

Both School and Grade dropdown menu is soft coded fetching the data from the database.

My problem is that when the user selected a school and then on the next grade form if they don't select any values and click onto "submit" it return a validation error "Value is required and can't be empty" which is correct but the dropdown menu then goes empty.

I wanted to know how to repopulate the values back to the grade dropdown menu if the form doesn't validate.

Thanks so much

Here is my code

Here is the function i generate the grade values (Fetching from the database)

  public function processSchoolSelectionAction()
    {

        $form = $this->getSchoolSelectionForm();


                if ($form->isValid($_POST))
                    {


                     // getting the values



                       $schoolId = $form->getValue('school');

                       $schoolYear = new Application_Model_DbTable_SchoolYear();

                      $schoolYearValues =  $schoolYear->getYearValues($schoolId);


                      array_unshift($schoolYearValues, array ('key' =>'' , 'value' =>'Please Specify'));


                      $form = $this->getYearSelectionForm();
                      $form->year->addMultiOptions($schoolYearValues);
                      $form->schoolId->setValue($schoolId);

                      $this->view->form = $form;

                    }
               else
             {
                 $data = $form->getValues();
                 $form->populate($data);
                 $this->view->form = $form;

             }

    }

Code processing the year selection form

public function processYearSelectionAction() {

$form = $this->getYearSelectionForm();


        if ($form->isValid($_POST))
            {


             // getting the values



               $schoolId = $form->getValue('schoolId');

               $yearId = $form->getValue('year');



               $textbookList = new Application_Model_DbTable_TextbookList();

               if ($textbookList->checkTextbookExist($schoolId, $yearId))
                    { // check if textbookExist




                    }
               else
                   {


                           $this->view->message = "Sorry, But the list you requested is currently not available for ordering online.";
                   }





            }
       else
     {

           $data = $form->getValues();
           $form->populate($data);
        $this->view->form = $form;

     }

}

School selection form

<?php

class Application_Form_SchoolSelection extends ZendX_JQuery_Form
{
        public function init()
                {
                        $this->setName('schoolSelection');



                        $school = new Application_Model_DbTable_School;
                        $schoolValues = $school->getSchoolValues();

                        array_unshift($schoolValues, array ('key' =>'' , 'value' =>'Please Specify'));


                        $schoolElement = new Zend_Form_Element_Select('school');
                        $schoolElement->addMultiOptions($schoolValues);
                        $schoolElement->setLabel('School');
                        $schoolElement->setRequired(true);
                        $schoolElement->setRegisterInArrayValidator(false);



                        $submitElement = new Zend_Form_Element_Submit('submit');
                        $submitElement->setLabel("Next");


                        $this->addElements(array(
                        $schoolElement,
                        $submitElement
                        ));
                }

}
?>

Grade (Year) selection form

<?php

class Application_Form_YearSelection extends ZendX_JQuery_Form
{
        public function init()
                {
                        $this->setName('yearSelection');




                          $yearElement = new Zend_Form_Element_Select('year');

                          $yearElement->setLabel('Year');
                          $yearElement->setRequired(true);
                          $yearElement->setRegisterInArrayValidator(false);

                        $schoolIdElement = new Zend_Form_Element_Hidden('schoolId');

                        $submitElement = new Zend_Form_Element_Submit('submit');
                        $submitElement->setLabel("Next");


                        $this->addElements(array(
                        $yearElement,
                        $schoolIdElement,
                        $submitElement
                        ));
                }

}
?>

Upvotes: 1

Views: 1043

Answers (2)

tasmaniski
tasmaniski

Reputation: 4898

This is how I done that:

In Controller when form is creating, pass data from request:

$some_selected_data = $this->_getParam('param_from_request'); // you need to validate this

$form = new Application_Form_SchoolSelection( array('some_data' => $some_selected_data) );

Then, in Form Class get that value like this:

$data = $this->getAttrib('some_data'); // the key value of array above

and just ask

if($data) {

 // get value from DB and
 //SET VALUE TO Zend_Form_Element
}

Upvotes: 1

Frederik Eycheni&#233;
Frederik Eycheni&#233;

Reputation: 1253

Obviously, you need to repopulate the options of your Select field.

In your processYearSelectionAction, on the validation failure part just grab the schoolId you stored in the hidden field and use it the same way as you did in your processSchoolSelectionAction to populate your field options.

Upvotes: 0

Related Questions