/** * 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; } }
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(); }