Example #1
0
 /**
  * Recurse the given form and return the hints for it and all of its subforms
  *
  * @param   Form    $form               The form to recurse
  * @param   mixed   $entirelyRequired   Set by reference, true means all elements in the hierarchy are
  *                                       required, false only a partial subset and null none at all
  * @param   bool    $elementsPassed     Whether there were any elements passed during the recursion until now
  *
  * @return  array
  */
 protected function recurseForm(Form $form, &$entirelyRequired = null, $elementsPassed = false)
 {
     $requiredLabels = array();
     if ($form->getRequiredCue() !== null) {
         $partiallyRequired = $partiallyOptional = false;
         foreach ($form->getElements() as $element) {
             if (!in_array($element->getType(), $this->blacklist)) {
                 if (!$element->isRequired()) {
                     $partiallyOptional = true;
                     if ($entirelyRequired) {
                         $entirelyRequired = false;
                     }
                 } else {
                     $partiallyRequired = true;
                     if (($label = $element->getDecorator('label')) !== false) {
                         $requiredLabels[] = $label;
                     }
                 }
             }
         }
         if (!$elementsPassed) {
             $elementsPassed = $partiallyRequired || $partiallyOptional;
             if ($entirelyRequired === null && $partiallyRequired) {
                 $entirelyRequired = !$partiallyOptional;
             }
         } elseif ($entirelyRequired === null && $partiallyRequired) {
             $entirelyRequired = false;
         }
     }
     $hints = array($form->getHints());
     foreach ($form->getSubForms() as $subForm) {
         $hints[] = $this->recurseForm($subForm, $entirelyRequired, $elementsPassed);
     }
     if ($entirelyRequired) {
         foreach ($requiredLabels as $label) {
             $label->setRequiredSuffix('');
         }
     }
     return call_user_func_array('array_merge', $hints);
 }