* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * */ namespace Sonata\AdminBundle\Form\Type; use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Sonata\AdminBundle\Form\EventListener\MergeCollectionListener; use Sonata\AdminBundle\Form\ChoiceList\ModelChoiceList; use Sonata\AdminBundle\Form\DataTransformer\ModelsToArrayTransformer; use Sonata\AdminBundle\Form\DataTransformer\ModelToIdTransformer; use Sonata\AdminBundle\Model\ModelManagerInterface; class ModelType extends AbstractType { /** * {@inheritDoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { if ($options['multiple']) { $builder ->addEventSubscriber(new MergeCollectionListener($options['model_manager'])) ->prependClientTransformer(new ModelsToArrayTransformer($options['choice_list'])); } else { $builder->prependClientTransformer(new ModelToIdTransformer($options['model_manager'], $options['class'])); } } public function createBuilder($name, FormFactoryInterface $factory, array $options) { return parent::createBuilder($name, $factory, $options); } public function setDefaultOptions(OptionsResolverInterface $resolver) { parent::setDefaultOptions($resolver); $compound = function (Options $options) { return isset($options['parent']) ? $options['parent'] : 'choice'; }; $resolver->setDefaults(array( 'compound' => $compound, )); } /** * {@inheritDoc} */ public function getDefaultOptions() { $options = array( 'template' => 'choice', 'multiple' => false, 'expanded' => false, 'model_manager' => null, 'class' => null, 'property' => null, 'query' => null, 'choices' => null, 'parent' => 'choice', 'preferred_choices' => array(), 'choice_list' => function (Options $options, $previousValue) { if ($previousValue instanceof ChoiceListInterface && count($choices = $previousValue->getChoices())) { return $choices; } return new ModelChoiceList( $options['model_manager'], $options['class'], $options['property'], $options['query'], $options['choices'] ); } ); return $options; } /** * {@inheritDoc} */ public function getParent() { return 'choice'; } /** * {@inheritDoc} */ public function getName() { return 'sonata_type_model'; } }