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 @@
+
+
+
+