From: Andrey Kutejko Date: Sun, 29 Sep 2013 15:20:43 +0000 (+0300) Subject: model form. extract field suggestion out of initialisation. X-Git-Tag: 0.5~27 X-Git-Url: https://git.andy128k.dev/?a=commitdiff_plain;h=b9b53fb2a340b56e29b2fcf4aa9babb6423abb77;p=ipf.git model form. extract field suggestion out of initialisation. --- diff --git a/ipf/form/model.php b/ipf/form/model.php index 7c593ea..ea823c0 100644 --- a/ipf/form/model.php +++ b/ipf/form/model.php @@ -15,22 +15,30 @@ class IPF_Form_Model extends IPF_Form if (isset($extra['user_fields'])) $this->user_fields = $extra['user_fields']; - $user_fields = $this->fields(); - $db_columns = $this->model->getTable()->getColumns(); - $db_relations = $this->model->getTable()->getRelations(); + $exclude = ArrayTools::get($extra, 'exclude', array()); + $fields = $this->suggestFields($this->model->getTable(), $this->fields(), $exclude, $this); + foreach ($fields as $field) { + list($n, $f) = $field; + $this->fields[$n] = $f; + } + } + + public static function suggestFields($table, $fields=null, $exclude=array(), $form=null) + { + $result = array(); - if ($user_fields === null) { - if (isset($extra['exclude'])) - $exclude = $extra['exclude']; - else - $exclude = array(); + $db_columns = $table->getColumns(); + $db_relations = $table->getRelations(); + if ($fields === null) { foreach ($db_columns as $name => $col) { if (array_search($name, $exclude) !== false) continue; if (isset($col['exclude']) && $col['exclude']) continue; - $this->addDBField($name, $col); + $field = self::createDBField($name, $table, $col); + if ($field) + $result[] = $field; } foreach ($db_relations as $name => $relation) { @@ -38,28 +46,33 @@ class IPF_Form_Model extends IPF_Form continue; if (isset($relation['exclude']) && $relation['exclude']) continue; - $this->addDBRelation($name, $relation, $db_columns); + $field = self::createDBRelation($name, $relation, $db_columns); + if ($field) + $result[] = $field; } } else { - foreach ($user_fields as $uname) { - $add_method = 'add__'.$uname.'__field'; - if (method_exists($this, $add_method)) { - $this->$add_method(); + foreach ($fields as $uname) { + $field = null; + if ($form && method_exists($form, 'add__'.$uname.'__field')) { + $field = array($uname, array($form, 'add__'.$uname.'__field')); } elseif (array_key_exists($uname, $db_columns)) { - $this->addDBField($uname, $db_columns[$uname]); + $field = self::createDBField($uname, $table, $db_columns[$uname]); } elseif (array_key_exists($uname, $db_relations)) { - $this->addDBRelation($uname, $db_relations[$uname], $db_columns); + $field = self::createDBRelation($uname, $db_relations[$uname], $db_columns); } else { - throw new IPF_Exception_Form(sprintf(__("Model '%s' has no column '%s'."), $this->model->getTable()->getComponentName(), $uname)); + throw new IPF_Exception_Form(sprintf(__("Model '%s' has no column '%s'."), $table->getComponentName(), $uname)); } + if ($field) + $result[] = $field; } } + return $result; } - function addDBField($name, $col) + public static function createDBField($name, $table, $col) { - if ($name == $this->model->getTable()->getIdentifier()) - return; + if ($name == $table->getIdentifier()) + return null; $required = isset($col['notblank']) && $col['notblank']; $label = isset($col['verbose']) ? $col['verbose'] : IPF_Utils::humanTitle($name); @@ -116,14 +129,16 @@ class IPF_Form_Model extends IPF_Form } if ($form_field !== null) - $this->fields[$name] = $form_field; + return array($name, $form_field); + else + return null; } - function addDBRelation($name, $relation, $db_columns) + public static function createDBRelation($name, $relation, $db_columns) { $rt = $relation->getType(); if ($rt !== IPF_ORM_Relation::ONE_AGGREGATE && $rt !== IPF_ORM_Relation::MANY_AGGREGATE) - return; + return null; $lfn = $relation->getLocalFieldName(); if (isset($db_columns[$lfn])) @@ -142,10 +157,12 @@ class IPF_Form_Model extends IPF_Form if ($rt === IPF_ORM_Relation::ONE_AGGREGATE) { $name .= "_id"; $db_field = new IPF_Form_DB_Foreignkey('',$name); - $this->fields[$name] = $db_field->formField($defaults); - } else if ($rt === IPF_ORM_Relation::MANY_AGGREGATE) { + return array($name, $db_field->formField($defaults)); + } elseif ($rt === IPF_ORM_Relation::MANY_AGGREGATE) { $db_field = new IPF_Form_DB_Manytomany('',$name); - $this->fields[$name] = $db_field->formField($defaults); + return array($name, $db_field->formField($defaults)); + } else { + return null; } }