166 lines
5.4 KiB
PHP
166 lines
5.4 KiB
PHP
<?
|
|
|
|
class patForms_Definition_Propel extends patForms_Definition {
|
|
|
|
private static $creoleTypeMap = array(
|
|
CreoleTypes::BOOLEAN => 'Switch', // BOOLEAN = 1;
|
|
CreoleTypes::BIGINT => 'String', // BIGINT = 2;
|
|
CreoleTypes::SMALLINT => 'String', // SMALLINT = 3;
|
|
CreoleTypes::TINYINT => 'String', // TINYINT = 4;
|
|
CreoleTypes::INTEGER => 'String', // INTEGER = 5;
|
|
CreoleTypes::CHAR => 'String', // CHAR = 6;
|
|
CreoleTypes::VARCHAR => 'String', // VARCHAR = 7;
|
|
CreoleTypes::FLOAT => 'String', // FLOAT = 8;
|
|
CreoleTypes::DOUBLE => 'String', // DOUBLE = 9;
|
|
CreoleTypes::DATE => 'String', // DATE = 10;
|
|
CreoleTypes::TIME => 'String', // TIME = 11;
|
|
CreoleTypes::TIMESTAMP => 'Date', // TIMESTAMP = 12;
|
|
CreoleTypes::VARBINARY => 'String', // VARBINARY = 13;
|
|
CreoleTypes::NUMERIC => 'String', // NUMERIC = 14;
|
|
CreoleTypes::BLOB => 'Text', // BLOB = 15;
|
|
CreoleTypes::CLOB => 'Text', // CLOB = 16;
|
|
CreoleTypes::TEXT => 'Text', // TEXT = 17;
|
|
CreoleTypes::LONGVARCHAR => 'Text', // LONGVARCHAR = 17;
|
|
CreoleTypes::DECIMAL => 'String', // DECIMAL = 18;
|
|
CreoleTypes::REAL => 'String', // REAL = 19;
|
|
CreoleTypes::BINARY => 'String', // BINARY = 20;
|
|
CreoleTypes::LONGVARBINARY => 'Text', // LONGVARBINARY = 21;
|
|
CreoleTypes::YEAR => 'String', // YEAR = 22;
|
|
CreoleTypes::ARR => 'String',
|
|
CreoleTypes::OTHER => 'String'
|
|
);
|
|
|
|
private static $validatorTypeMap = array(
|
|
'unique' => null,
|
|
'minLength' => 'patForms_Rule_MinLength',
|
|
'maxLength' => 'patForms_Rule_MaxLength',
|
|
'minValue' => 'patForms_Rule_MinValue',
|
|
'maxValue' => 'patForms_Rule_MaxValue',
|
|
'match' => 'patForms_Rule_Match',
|
|
'notMatch' => 'patForms_Rule_NotMatch',
|
|
'required' => null, // will be done by the elements "required" attribute
|
|
'validValues' => 'patForms_Rule_ValidValues',
|
|
);
|
|
|
|
/**
|
|
* @param array $conf an assoc array of parameters. these are:
|
|
* - string name => $name of the propel object class
|
|
* - string filename => $filename of the form definition xml file
|
|
*/
|
|
|
|
static public function create($conf) {
|
|
|
|
extract($conf);
|
|
|
|
$autoValidate = isset($autoValidate) ? $autoValidate : 'save';
|
|
|
|
$definition = new patForms_Definition_Propel($name, $autoValidate);
|
|
|
|
if (0 AND file_exists($filename)) {
|
|
// load definition from xml file
|
|
$definition->load($filename);
|
|
} else {
|
|
// populate definition from table map and save it to xml file
|
|
$definition = self::populateFromTableMap($definition, $conf);
|
|
$definition->save($filename);
|
|
}
|
|
|
|
return $definition;
|
|
}
|
|
|
|
private function populateFromTableMap($definition, $conf) {
|
|
|
|
extract($conf);
|
|
|
|
$mapBuilder = call_user_func(array($name . 'Peer', 'getMapBuilder'));
|
|
$tablename = constant($name . 'Peer::TABLE_NAME');
|
|
$tableMap = $mapBuilder->getDatabaseMap()->getTable($tablename);
|
|
$cols = $tableMap->getColumns();
|
|
|
|
foreach ($cols as $col) {
|
|
|
|
$phpname = $col->getPhpName();
|
|
// this would need a patched version of patForms in order
|
|
// to retrieve request vars after having submitted the form
|
|
// TODO - ask patForms developers to enable this
|
|
// $elementName = $tablename . '[' . $phpname . ']';
|
|
$elementName = $phpname;
|
|
|
|
$elementType = self::$creoleTypeMap[$col->getCreoleType()];
|
|
|
|
// TODO somehow retrieve element type specific default values?
|
|
$elementAttributes = array(
|
|
'name' => $elementName,
|
|
'title' => $phpname,
|
|
'label' => $phpname,
|
|
'description' => $phpname,
|
|
'edit' => 'yes',
|
|
'display' => $col->isPrimaryKey() ? 'no' : 'yes',
|
|
// Is the element required?
|
|
// TODO Can we retrieve this info from the Column object?
|
|
'required' => true,
|
|
);
|
|
|
|
switch ($col->getCreoleType()) {
|
|
case CreoleTypes::BOOLEAN: {
|
|
$elementAttributes['value'] = 1;
|
|
break;
|
|
}
|
|
case CreoleTypes::DATE: {
|
|
// TODO doesn't seem to work for some reason
|
|
// $elementAttributes['format'] = 'date';
|
|
// $elementAttributes['dateformat'] = 'Ymd';
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ($col->isForeignKey()) {
|
|
|
|
$relColname = $col->getRelatedColumnName();
|
|
$relTablename = $col->getRelatedTableName();
|
|
$relColPhpname =
|
|
Propel::getDatabaseMap(constant($relTablename . 'Peer::DATABASE_NAME'))->
|
|
getTable($relTablename)->getColumn($relColname)->getPhpname();
|
|
|
|
$elementAttributes['datasource'] = array (
|
|
'name' => 'patForms_Datasource_Propel',
|
|
'peername' => $relTablename . 'Peer',
|
|
'label' => array(
|
|
'initial' => 'Please select one ...',
|
|
'members' => array($relColPhpname),
|
|
'mask' => '%s',
|
|
),
|
|
'value' => array(
|
|
'members' => array($relColPhpname),
|
|
'mask' => '%s',
|
|
),
|
|
);
|
|
$elementType = 'Enum';
|
|
}
|
|
|
|
$rules = array();
|
|
if ($col->hasValidators()) {
|
|
foreach ($col->getValidators() as $validator) {
|
|
$name = $validator->getName();
|
|
$type = self::$validatorTypeMap[$name];
|
|
if (!is_null($type)) {
|
|
$rules[$name] = array (
|
|
'table' => $col->getTablename(),
|
|
'col' => $col->getColumnName(),
|
|
'name' => $name,
|
|
'type' => self::$validatorTypeMap[$name],
|
|
'value' => $validator->getValue(),
|
|
'class' => $validator->getClass(),
|
|
'message' => $validator->getMessage(),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
$definition->addElement($phpname, $elementType, $elementAttributes, $rules);
|
|
}
|
|
|
|
return $definition;
|
|
}
|
|
}
|