Ejemplo n.º 1
0
 public function isValid($datasource = null)
 {
     $filterchain = new A_Filter_Set();
     $validator = new A_Rule_Set();
     $validator->excludeRules($this->excludeRules);
     $validator->includeRules($this->includeRules);
     $this->error = false;
     $this->errorMsg = array();
     if ($this->includeRules) {
         $rule_names = $this->includeRules;
     } else {
         $rule_names = array_keys($this->fields);
     }
     if ($this->excludeRules) {
         $rule_names = array_diff($rule_names, $this->excludeRules);
     }
     $field_names = array_keys($this->fields);
     if ($field_names) {
         if (!$datasource) {
             $datasource = $this->datasource;
         }
         // set values from datasource
         foreach ($field_names as $name) {
             if ($datasource->has($name)) {
                 $this->fields[$name]->value = $datasource->get($name);
             }
         }
         // run global filters on all fields
         if ($this->filters) {
             foreach ($this->fields as $field) {
                 $field->value = $filterchain->doFilter($field->value, $this->filters);
             }
         }
         // run field filters
         foreach ($this->fields as $field) {
             if (isset($field->filters)) {
                 $field->value = $filterchain->doFilter($field->value, $field->filters);
             }
         }
         // run rules for each field
         foreach ($this->fields as $name => $field) {
             // clear errors
             $field->setErrorMsg();
             // check if there are rules and if included
             if (isset($field->rules) && in_array($name, $rule_names)) {
                 foreach ($field->rules as $rule) {
                     // check if set to override rule's optional setting
                     if ($field->optional !== null) {
                         $rule->setOptional($field->optional);
                     }
                     $validator->addRule($rule);
                 }
             }
         }
         // check if there are rules and run those as well
         if ($this->rules) {
             foreach ($this->rules as $name => $rule) {
                 $validator->addRule($rule);
             }
         }
         // if the validator is not valid get its errors
         if (!$validator->isValid($datasource)) {
             $this->error = true;
             $errors = $validator->getErrorMsg();
             foreach ($errors as $fieldname => $errorarray) {
                 $this->setErrorMsg($fieldname, $errorarray);
             }
         }
     }
     return !$this->error;
 }