* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Propel\Bundle\PropelBundle\Form\Type; use Propel\Bundle\PropelBundle\Form\ChoiceList\ModelChoiceList; use Propel\Bundle\PropelBundle\Form\DataTransformer\CollectionToArrayTransformer; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; /** * ModelType class. * * @author William Durand * @author Toni Uebernickel * * Example using the preferred_choices option. * * * public function buildForm(FormBuilderInterface $builder, array $options) * { * $builder * ->add('product', 'model', array( * 'class' => 'Model\Product', * 'query' => ProductQuery::create() * ->filterIsActive(true) * ->useI18nQuery($options['locale']) * ->orderByName() * ->endUse() * , * 'preferred_choices' => ProductQuery::create() * ->filterByIsTopProduct(true) * , * )) * ; * } * */ class ModelType extends AbstractType { /** * @var PropertyAccessorInterface */ private $propertyAccessor; public function __construct(PropertyAccessorInterface $propertyAccessor = null) { $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); } public function buildForm(FormBuilderInterface $builder, array $options) { if ($options['multiple']) { $builder->addViewTransformer(new CollectionToArrayTransformer(), true); } } public function configureOptions(OptionsResolver $resolver) { $propertyAccessor = $this->propertyAccessor; $choiceList = function (Options $options) use ($propertyAccessor) { return new ModelChoiceList( $options['class'], $options['property'], $options['choices'], $options['query'], $options['group_by'], $options['preferred_choices'], $propertyAccessor, $options['index_property'] ); }; $resolver->setDefaults(array( 'template' => 'choice', 'multiple' => false, 'expanded' => false, 'class' => null, 'property' => null, 'query' => null, 'choices' => null, 'choice_list' => $choiceList, 'group_by' => null, 'by_reference' => false, 'index_property' => null, 'choice_translation_domain' => false, )); } // BC for SF < 2.7 public function setDefaultOptions(OptionsResolverInterface $resolver) { $this->configureOptions($resolver); } public function getParent() { return 'choice'; } public function getName() { return 'model'; } }