06.27
php
saved
jakub
Note
very first version of cross model validation behavior.
very first version of cross model validation behavior.
- <?php
- class CrossModelValidationBehavior extends ModelBehavior {
- $this->defaultValidationMessage = "Wrong data given!";
- }
- function getValidationError($modelObjectName, $fieldName, $validationRule) {
- return ife($this->validation->$validationRule($this->model->data[$modelObjectName][$fieldName]) == false, $this->defaultValidationMessage, null);
- }else {
- if($validationRule['allowEmpty'] === false) {
- return ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage);
- } else {
- return null;
- }
- }
- if($validationRule['required'] === true) {
- return ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage);
- } else {
- return null;
- }
- }
- return ife($this->validation->$validationRule['rule']($this->model->data[$modelObjectName][$fieldName]) == false,ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage), null);
- } else {
- switch($validationRule['rule'][0]) : // asumming that rule name will be given as a first element of array
- case 'between':
- return ife($this->validation->$validationRule['rule'][0]($this->model->data[$modelObjectName][$fieldName], $validationRule['rule'][1], $validationRule['rule'][2]) == false, ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage), null);
- case 'custom':
- case 'decimal':
- case 'email':
- case 'equalTo':
- case 'extension':
- case 'maxlegth':
- case 'minlegth':
- case 'multiple':
- return ife($this->validation->$validationRule['rule'][0]($this->model->data[$modelObjectName][$fieldName], $validationRule['rule'][1]) == false, ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage), null);
- case 'comparison':
- case 'phone':
- case 'postal':
- case 'range':
- case 'ssn':
- return ife($this->validation->$validationRule['rule'][0]($this->model->data[$modelObjectName][$fieldName], $validationRule['rule'][1],$validationRule['rule'][2]) == false, ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage), null);
- case 'cc':
- return ife($this->validation->$validationRule['rule'][0]($this->model->data[$modelObjectName][$fieldName], $validationRule['rule'][1],$validationRule['rule'][2],$validationRule['rule'][3]) == false, ife(!empty($validationRule['message']),$validationRule['message'], $this->defaultValidationMessage), null);
- endswitch;
- }
- } else {
- foreach($validationRule as $rule):
- $this->getValidationError($modelObjectName, $fieldName, $rule);
- endforeach;
- }
- }
- }
- function crossValidate(&$modelObject) {
- $validationRules = $modelObject->validate;
- foreach($validationRules as $fieldName => $validationRule):
- $modelObject->validationErrors[$fieldName] = $this->getValidationError($modelObject->name, $fieldName, $validationRule);
- } else {
- foreach($validationRule as $rule):
- $error = $this->getValidationError($modelObject->name, $fieldName, $rule);
- endif;
- endforeach;
- // zamienic na maa litere pierwszy znak kazdego stringa
- endfor;
- endif;
- $modelObject->validationErrors[$fieldName] = $errorMessage;
- }
- endforeach;
- $this->model->validationErrors['crossValidaionErrosOccured'] = true;
- endif;
- endif;
- }
- function searchForModelObject(&$modelObject, $searchedModel) {
- // get all associated models to currently fetched model object
- $modelObjectAssociations = $modelObject->getAssociated();
- // lets see if $searchedModel was already fetched, if not - continue
- // was $searchedModel just found ?
- // has it any validation rules that needs to be performed ?
- $this->crossValidate($modelObject->$searchedModel);
- endif;
- // put just found model into $this->alreadyFound to avoid multiple searching for same model
- } else {
- // we didn't find model, so serach for it in all models associated to current one
- foreach($modelObjectAssociations as $associatedModel => $assotiationType):
- $this->searchForModelObject($modelObject->$associatedModel, $searchedModel);
- endforeach;
- }
- endif;
- }
- function beforeValidate(&$model) {
- // create some reference to our model
- $this->model = & $model;
- $this->validation = & Validation::getInstance();
- // keeps names of already found models, just to avoid looping, for the begining just skip our primary model.
- $modelBindigs = $model->getAssociated();
- foreach($model->data as $modelName => $modelData):
- $this->searchForModelObject($model, $modelName);
- endforeach;
- //$model->validationErrors['crossValidaionErrosOccured'] = true;
- }
- }
Parsed in 0.342 seconds, using GeSHi 1.0.7.14