]> git.andy128k.dev Git - ipf.git/commitdiff
model form. extract field suggestion out of initialisation.
authorAndrey Kutejko <andy128k@gmail.com>
Sun, 29 Sep 2013 15:20:43 +0000 (18:20 +0300)
committerAndrey Kutejko <andy128k@gmail.com>
Sun, 29 Sep 2013 15:20:43 +0000 (18:20 +0300)
ipf/form/model.php

index 7c593ea5d3ccf1c3a6b2ac1af75abe2616883e8d..ea823c093d6d086e6ac5893618740360098f8c90 100644 (file)
@@ -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;
         }
     }