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) {
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);
}
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]))
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;
}
}