function __construct($config_name = 'default', $udi = null, $model = null, $has_file = null, $must = false) { parent::__construct('form_' . $config_name, url($udi), 'post'); if ($has_file) { $this->enctype = self::ENCTYPE_MULTIPART; $this->has_file = $has_file; $this->must = $must; } $file_name = $config_name . '_form.yaml'; $filename = rtrim(dirname(__FILE__), '/\\') . DS . $file_name; $this->loadFromConfig(Helper_YAML::loadCached($filename)); $this->addValidations(QDB_ActiveRecord_Meta::instance($model)); }
/** * 构造函数 * * @param array $data * @param int $names_style * @param boolean $from_storage */ function __construct(array $data = null, $names_style = QDB::PROP, $from_storage = false) { $this->_class_name = get_class($this); if (!isset(self::$_meta[$this->_class_name])) { self::$_meta[$this->_class_name] = QDB_ActiveRecord_Meta::instance($this->_class_name); } $meta = self::$_meta[$this->_class_name]; /* @var $meta QDB_ActiveRecord_Meta */ // 设置对象属性默认值 $this->_props = $meta->default_props; if (is_array($data)) { $this->setProps($data, $names_style, null, $from_storage); } // 触发 after_initialize 事件 $this->_after_initialize(); $this->_event(self::AFTER_INITIALIZE); $this->_after_initialize_post(); }
function init() { if ($this->_inited) { return $this; } parent::init(); $p = $this->_init_config; if (empty($p['mid_class'])) { // 如果没有指定中间表对应的 ActiveRecord 类,则使用表数据入口直接处理中间表 $this->mid_meta = null; if (empty($p['mid_table_name'])) { // 尝试自动确定中间表名称 $t1 = $this->source_meta->table->name; $t2 = $this->target_meta->table->name; if ($t1 <= $t2) { $mid_table_name = $t1 . '_has_' . $t2; } else { $mid_table_name = $t2 . '_has_' . $t1; } } else { $mid_table_name = $p['mid_table_name']; } $this->mid_table = new QDB_Table(array('name' => $mid_table_name)); } else { // 如果中间表作为实体,则由指定的 ActiveRecord 继承类负责处理中间表 $this->mid_meta = QDB_ActiveRecord_Meta::instance($p['mid_class']); $this->mid_table = $this->mid_meta->table; } $this->source_key = !empty($p['source_key']) ? $p['source_key'] : reset($this->source_meta->idname); $this->target_key = !empty($p['target_key']) ? $p['target_key'] : reset($this->target_meta->idname); $this->mid_source_key = !empty($p['mid_source_key']) ? $p['mid_source_key'] : reset($this->source_meta->idname); $this->mid_target_key = !empty($p['mid_target_key']) ? $p['mid_target_key'] : reset($this->target_meta->idname); $this->mid_mapping_to = !empty($p['mid_mapping_to']) ? $p['mid_mapping_to'] : 'mid_data'; $class = $this->target_meta->class_name; // $this->source_meta->addDynamicMethod("bind{$class}", array($this, 'bindTarget')); // $this->source_meta->addDynamicMethod("unbind{$class}", array($this, 'unbindTarget')); unset($this->_init_config); return $this; }
/** * 返回当前 ActiveRecord 类的元数据对象 * * @static * * @return QDB_ActiveRecord_Meta */ static function meta() { return QDB_ActiveRecord_Meta::instance(__CLASS__); }
/** * 指示将查询结果封装为特定的 ActiveRecord 对象 * * 通常对于从 ActiveRecord 发起的查询不需要再调用该方法,QeePHP 会确保此类查询都返回对象。 * 但如果是从表数据入口发起的查询,并且希望返回对象,就应该调用这个方法指定一个类名称。 * * 类名称所指定的 ActiveRecord 继承类应该是一个适合返回结果数据结构的对象,否则会导致构造对象失败。 * * @param string $class_name * * @return QDB_Select */ function asObject($class_name) { $this->_meta = QDB_ActiveRecord_Meta::instance($class_name); $this->_query_params[self::AS_ARRAY] = false; return $this; }
/** * 初始化关联 * * @return QDB_ActiveRecord_Association_Abstract */ function init() { if (!$this->_inited) { $this->target_meta = QDB_ActiveRecord_Meta::instance($this->_init_config['target_class']); $this->source_key_alias = $this->mapping_name . '_source_key'; $this->target_key_alias = $this->mapping_name . '_target_key'; $this->_inited = true; } return $this; }
/** * 从模型载入验证规则 * * @param array|string $models * * @return QForm */ function loadValidationsFromModel($models) { $models = Q::normalize($models); foreach ($models as $model_class) { $meta = QDB_ActiveRecord_Meta::instance($model_class); $validations = $meta->getAllValidation(); foreach ($validations as $id => $policy) { $this->appendValidation($id, $policy['rules']); } } return $this; }