diff --git a/Form/PropelTypeGuesser.php b/Form/PropelTypeGuesser.php new file mode 100644 index 0000000..df03570 --- /dev/null +++ b/Form/PropelTypeGuesser.php @@ -0,0 +1,126 @@ + + */ +class PropelTypeGuesser implements FormTypeGuesserInterface +{ + private $cache = array(); + + /** + * {@inheritDoc} + */ + public function guessType($class, $property) + { + if (!$table = $this->getTable($class)) { + return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); + } + + foreach ($table->getRelations() as $relation) { + if (in_array($relation->getType(), array(\RelationMap::MANY_TO_ONE, \RelationMap::ONE_TO_MANY))) { + if ($property == $relation->getForeignTable()->getName()) { + return new TypeGuess('model', array( + 'class' => $class, + 'multiple' => \RelationMap::MANY_TO_ONE === $relation->getType() ? false : true, + ), Guess::HIGH_CONFIDENCE); + } + } + } + + if (!$column = $this->getColumn($class, $property)) { + return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); + } + + switch ($column->getType()) { + case \PropelColumnTypes::BOOLEAN: + case \PropelColumnTypes::BOOLEAN_EMU: + return new TypeGuess('checkbox', array(), Guess::HIGH_CONFIDENCE); + case \PropelColumnTypes::TIMESTAMP: + return new TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE); + case \PropelColumnTypes::DATE: + return new TypeGuess('date', array(), Guess::HIGH_CONFIDENCE); + case \PropelColumnTypes::TIME: + return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE); + case \PropelColumnTypes::FLOAT: + case \PropelColumnTypes::REAL: + case \PropelColumnTypes::DOUBLE: + case \PropelColumnTypes::DECIMAL: + return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE); + case \PropelColumnTypes::TINYINT: + case \PropelColumnTypes::SMALLINT: + case \PropelColumnTypes::INTEGER: + case \PropelColumnTypes::BIGINT: + case \PropelColumnTypes::NUMERIC: + return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE); + case \PropelColumnTypes::CHAR: + case \PropelColumnTypes::VARCHAR: + return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE); + case \PropelColumnTypes::LONGVARCHAR: + return new TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE); + default: + return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); + } + } + + /** + * {@inheritDoc} + */ + public function guessRequired($class, $property) + { + if ($column = $this->getColumn($class, $property)) { + return new ValueGuess($column->isNotNull(), Guess::HIGH_CONFIDENCE); + } + } + + /** + * {@inheritDoc} + */ + public function guessMaxLength($class, $property) + { + if (($column = $this->getColumn($class, $property)) && $column->isText()) { + return new ValueGuess($column->getSize(), Guess::HIGH_CONFIDENCE); + } + } + + /** + * {@inheritDoc} + */ + public function guessMinLength($class, $property) + { + } + + protected function getTable($class) + { + if (isset($this->cache[$class])) { + return $this->cache[$class]; + } + + if (class_exists($queryClass = $class.'Query')) { + $query = new $queryClass(); + + return $this->cache[$class] = $query->getTableMap(); + } + } + + protected function getColumn($class, $property) + { + if (isset($this->cache[$class.'::'.$property])) { + return $this->cache[$class.'::'.$property]; + } + + $table = $this->getTable($class); + + if ($table && $table->hasColumn($property)) { + return $this->cache[$class.'::'.$property] = $table->getColumn($property); + } + } +} diff --git a/Resources/config/propel.xml b/Resources/config/propel.xml index 0c905b6..cd8c8f1 100644 --- a/Resources/config/propel.xml +++ b/Resources/config/propel.xml @@ -12,6 +12,7 @@ Propel\PropelBundle\DependencyInjection\Properties Propel\PropelBundle\Form\Type\ModelType Propel\PropelBundle\Twig\Extension\SyntaxExtension + Propel\PropelBundle\Form\PropelTypeGuesser @@ -38,5 +39,9 @@ + + + +