From 8016d1156af62d79342a10024b164f3b8d6d90cb Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Tue, 30 Aug 2011 15:17:46 +0200 Subject: [PATCH 1/3] added a Propel Type guesser --- Form/PropelTypeGuesser.php | 126 ++++++++++++++++++++++++++++++++++++ Resources/config/propel.xml | 5 ++ 2 files changed, 131 insertions(+) create mode 100644 Form/PropelTypeGuesser.php 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 @@ + + + + From 00715ec1bd77df8819c0c9dab6f1ae344dd76796 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 31 Aug 2011 07:42:16 +0200 Subject: [PATCH 2/3] added missing types in the guesser --- Form/PropelTypeGuesser.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Form/PropelTypeGuesser.php b/Form/PropelTypeGuesser.php index df03570..b5dca9f 100644 --- a/Form/PropelTypeGuesser.php +++ b/Form/PropelTypeGuesser.php @@ -45,8 +45,10 @@ class PropelTypeGuesser implements FormTypeGuesserInterface case \PropelColumnTypes::BOOLEAN_EMU: return new TypeGuess('checkbox', array(), Guess::HIGH_CONFIDENCE); case \PropelColumnTypes::TIMESTAMP: + case \PropelColumnTypes::BU_TIMESTAMP: return new TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE); case \PropelColumnTypes::DATE: + case \PropelColumnTypes::BU_DATE: return new TypeGuess('date', array(), Guess::HIGH_CONFIDENCE); case \PropelColumnTypes::TIME: return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE); @@ -65,6 +67,9 @@ class PropelTypeGuesser implements FormTypeGuesserInterface case \PropelColumnTypes::VARCHAR: return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE); case \PropelColumnTypes::LONGVARCHAR: + case \PropelColumnTypes::BLOB: + case \PropelColumnTypes::CLOB: + case \PropelColumnTypes::CLOB_EMU: return new TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE); default: return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); From 89fc4821358060892baca39209a76facae4707c9 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 31 Aug 2011 07:47:55 +0200 Subject: [PATCH 3/3] fixed guesser for foreign keys --- Form/PropelTypeGuesser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Form/PropelTypeGuesser.php b/Form/PropelTypeGuesser.php index b5dca9f..a76e174 100644 --- a/Form/PropelTypeGuesser.php +++ b/Form/PropelTypeGuesser.php @@ -29,7 +29,7 @@ class PropelTypeGuesser implements FormTypeGuesserInterface 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, + 'class' => $relation->getForeignTable()->getClassName(), 'multiple' => \RelationMap::MANY_TO_ONE === $relation->getType() ? false : true, ), Guess::HIGH_CONFIDENCE); }