From 4f5b44bd3bd490309eb2ba7b44df4769816ba729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Sat, 3 Aug 2013 19:26:54 +0200 Subject: twig implementation --- .../form/Symfony/Component/Form/FormFactory.php | 156 +++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 vendor/symfony/form/Symfony/Component/Form/FormFactory.php (limited to 'vendor/symfony/form/Symfony/Component/Form/FormFactory.php') diff --git a/vendor/symfony/form/Symfony/Component/Form/FormFactory.php b/vendor/symfony/form/Symfony/Component/Form/FormFactory.php new file mode 100644 index 00000000..a5fd9cc0 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/FormFactory.php @@ -0,0 +1,156 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form; + +use Symfony\Component\Form\Exception\UnexpectedTypeException; + +class FormFactory implements FormFactoryInterface +{ + /** + * @var FormRegistryInterface + */ + private $registry; + + /** + * @var ResolvedFormTypeFactoryInterface + */ + private $resolvedTypeFactory; + + public function __construct(FormRegistryInterface $registry, ResolvedFormTypeFactoryInterface $resolvedTypeFactory) + { + $this->registry = $registry; + $this->resolvedTypeFactory = $resolvedTypeFactory; + } + + /** + * {@inheritdoc} + */ + public function create($type = 'form', $data = null, array $options = array()) + { + return $this->createBuilder($type, $data, $options)->getForm(); + } + + /** + * {@inheritdoc} + */ + public function createNamed($name, $type = 'form', $data = null, array $options = array()) + { + return $this->createNamedBuilder($name, $type, $data, $options)->getForm(); + } + + /** + * {@inheritdoc} + */ + public function createForProperty($class, $property, $data = null, array $options = array()) + { + return $this->createBuilderForProperty($class, $property, $data, $options)->getForm(); + } + + /** + * {@inheritdoc} + */ + public function createBuilder($type = 'form', $data = null, array $options = array()) + { + $name = $type instanceof FormTypeInterface || $type instanceof ResolvedFormTypeInterface + ? $type->getName() + : $type; + + return $this->createNamedBuilder($name, $type, $data, $options); + } + + /** + * {@inheritdoc} + */ + public function createNamedBuilder($name, $type = 'form', $data = null, array $options = array()) + { + if (null !== $data && !array_key_exists('data', $options)) { + $options['data'] = $data; + } + + if ($type instanceof FormTypeInterface) { + $type = $this->resolveType($type); + } elseif (is_string($type)) { + $type = $this->registry->getType($type); + } elseif (!$type instanceof ResolvedFormTypeInterface) { + throw new UnexpectedTypeException($type, 'string, Symfony\Component\Form\ResolvedFormTypeInterface or Symfony\Component\Form\FormTypeInterface'); + } + + return $type->createBuilder($this, $name, $options); + } + + /** + * {@inheritdoc} + */ + public function createBuilderForProperty($class, $property, $data = null, array $options = array()) + { + if (null === $guesser = $this->registry->getTypeGuesser()) { + return $this->createNamedBuilder($property, 'text', $data, $options); + } + + $typeGuess = $guesser->guessType($class, $property); + $maxLengthGuess = $guesser->guessMaxLength($class, $property); + $requiredGuess = $guesser->guessRequired($class, $property); + $patternGuess = $guesser->guessPattern($class, $property); + + $type = $typeGuess ? $typeGuess->getType() : 'text'; + + $maxLength = $maxLengthGuess ? $maxLengthGuess->getValue() : null; + $pattern = $patternGuess ? $patternGuess->getValue() : null; + + if (null !== $pattern) { + $options = array_merge(array('pattern' => $pattern), $options); + } + + if (null !== $maxLength) { + $options = array_merge(array('max_length' => $maxLength), $options); + } + + if ($requiredGuess) { + $options = array_merge(array('required' => $requiredGuess->getValue()), $options); + } + + // user options may override guessed options + if ($typeGuess) { + $options = array_merge($typeGuess->getOptions(), $options); + } + + return $this->createNamedBuilder($property, $type, $data, $options); + } + + /** + * Wraps a type into a ResolvedFormTypeInterface implementation and connects + * it with its parent type. + * + * @param FormTypeInterface $type The type to resolve. + * + * @return ResolvedFormTypeInterface The resolved type. + */ + private function resolveType(FormTypeInterface $type) + { + $parentType = $type->getParent(); + + if ($parentType instanceof FormTypeInterface) { + $parentType = $this->resolveType($parentType); + } elseif (null !== $parentType) { + $parentType = $this->registry->getType($parentType); + } + + return $this->resolvedTypeFactory->createResolvedType( + $type, + // Type extensions are not supported for unregistered type instances, + // i.e. type instances that are passed to the FormFactory directly, + // nor for their parents, if getParent() also returns a type instance. + array(), + $parentType + ); + } +} -- cgit v1.2.3