示例#1
0
/**
 * Add properties
 *
 * Adds properties to an object from array.
 */
function add_props(&$obj, $arr, $rec = true, $pretty_props = true, $sufix = '_')
{
    foreach ($arr as $k => $v) {
        is_array($v) && $rec && ($v = array2obj($v));
        preg_match('~^[\\d]~', $k) && ($k = $sufix . $k);
        $pretty_props && ($k = preg_replace('~[\\W]~', '', $k));
        $obj->{$k} = $v;
    }
}
示例#2
0
 private function validate_data($data = null, $action)
 {
     # TODO: $data could be removed and be always $this.
     if (!$data) {
         $data = $this;
     } else {
         $data = array2obj($data);
     }
     $this->run_callbacks('before_validation');
     $error = false;
     if (self::model_data()->has_validations()) {
         foreach (self::model_data()->get_validations() as $model_property => $model_validations) {
             foreach ($model_validations as $prop => $opts) {
                 check_array($opts);
                 # Check action
                 if (isset($opts['on'])) {
                     if ($action != $opts['on']) {
                         continue;
                     }
                     unset($opts['on']);
                 }
                 # Check conditionals
                 if (isset($opts['if'])) {
                     foreach ($opts['if'] as $condition => $condition_param) {
                         switch ($condition) {
                             case 'property_exists':
                                 if (empty($this->{$condition_param})) {
                                     continue 3;
                                 }
                                 break;
                         }
                     }
                     unset($opts['if']);
                 }
                 if ($data->{$model_property} === null) {
                     if (empty($opts['accept_null'])) {
                         # Some validations, like confirmation, should only activate if the model property is present.
                         # So we're skipping it here.
                         if ($prop == 'confirmation') {
                             continue;
                         }
                         return false;
                     }
                     unset($opts['accept_null']);
                     continue;
                 }
                 // # Check message
                 // if (isset($opts['message'])) {
                 // $message = $opts['message'];
                 // unset($opts['message']);
                 // } else
                 // $message = null;
                 switch ($prop) {
                     // case ($param == 'acceptance' && $opts):
                     // if (empty($data->$prop)) {
                     // break 4;
                     // }
                     // break;
                     case 'confirmation':
                         $prop_confirm = $model_property . '_confirmation';
                         if ($this->{$prop_confirm} === null) {
                             continue;
                         }
                         !isset($opts['message']) && ($opts['message'] = 'doesn\'t match confirmation.');
                         $validation_result = $this->{$model_property} === $this->{$prop_confirm};
                         break;
                     case 'presence':
                         !isset($opts['message']) && ($opts['message'] = 'cannot be empty.');
                         $validation_result = property_exists($data, $model_property);
                         break;
                     case 'uniqueness':
                         if ($action != 'create') {
                             $validation_result = true;
                             continue;
                         }
                         !isset($opts['message']) && ($opts['message'] = 'must be unique.');
                         $validation_result = $this->check_data_uniqueness($model_property, $data->{$model_property});
                         break;
                     case 'exclusion':
                         $validation_result = validate_data($data->{$model_property}, array('in' => $opts), true);
                         if ($validation_result === true) {
                             $validation_result = isset($opts['message']) ? $opts['message'] : 'is not valid.';
                         } else {
                             $validation_result = true;
                         }
                         break;
                     case 'inclusion':
                         $validation_result = validate_data($data->{$model_property}, array('in' => $opts), true);
                         break;
                     default:
                         $validation_result = validate_data($data->{$model_property}, array($prop => $opts), true);
                         break;
                 }
                 if ($validation_result !== true) {
                     if (isset($opts['message'])) {
                         $message = $opts['message'];
                     } else {
                         if (!is_string($validation_result)) {
                             $message = 'is not valid';
                         } else {
                             $message = $validation_result;
                         }
                     }
                     $this->record_errors->add($model_property, $message);
                     $error = true;
                 }
             }
         }
     }
     if ($error) {
         return false;
     }
     $this->run_callbacks('after_validation');
     return true;
 }
 private function register_assocs()
 {
     if (!System::$assocs_temp) {
         return;
     }
     foreach (System::$assocs_temp as $assoc_type => $assocs) {
         foreach ($assocs as $assoc) {
             $prop_name = array_shift($assoc);
             if ($assoc) {
                 $params = array_shift($assoc);
             } else {
                 $params = array();
             }
             if (!isset($params['model_name'])) {
                 if ($assoc_type == 'has_many') {
                     $model_name = ApplicationModel::filename_to_modelname(substr($prop_name, 0, -1));
                 } else {
                     $model_name = ApplicationModel::filename_to_modelname($prop_name);
                 }
             } else {
                 $model_name = $params['model_name'];
                 unset($params['model_name']);
             }
             $this->assocs->{$prop_name} = array2obj(array('model_name' => $model_name, 'type' => $assoc_type, 'params' => $params));
         }
     }
     System::$assocs_temp = array();
 }