105 lines
3.0 KiB
PHP
105 lines
3.0 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Form\Extension\Core\Type;
|
|
|
|
use Symfony\Component\Form\AbstractType;
|
|
use Symfony\Component\Form\FormBuilderInterface;
|
|
use Symfony\Component\Form\FormViewInterface;
|
|
use Symfony\Component\Form\FormInterface;
|
|
use Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener;
|
|
use Symfony\Component\OptionsResolver\Options;
|
|
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
|
|
|
|
class CollectionType extends AbstractType
|
|
{
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
|
{
|
|
if ($options['allow_add'] && $options['prototype']) {
|
|
$prototype = $builder->create($options['prototype_name'], $options['type'], array_replace(array(
|
|
'label' => $options['prototype_name'] . 'label__',
|
|
), $options['options']));
|
|
$builder->setAttribute('prototype', $prototype->getForm());
|
|
}
|
|
|
|
$resizeListener = new ResizeFormListener(
|
|
$builder->getFormFactory(),
|
|
$options['type'],
|
|
$options['options'],
|
|
$options['allow_add'],
|
|
$options['allow_delete']
|
|
);
|
|
|
|
$builder->addEventSubscriber($resizeListener);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function buildView(FormViewInterface $view, FormInterface $form, array $options)
|
|
{
|
|
$view->addVars(array(
|
|
'allow_add' => $options['allow_add'],
|
|
'allow_delete' => $options['allow_delete'],
|
|
));
|
|
|
|
if ($form->getConfig()->hasAttribute('prototype')) {
|
|
$view->setVar('prototype', $form->getConfig()->getAttribute('prototype')->createView($view));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function finishView(FormViewInterface $view, FormInterface $form, array $options)
|
|
{
|
|
if ($form->getConfig()->hasAttribute('prototype') && $view->getVar('prototype')->getVar('multipart')) {
|
|
$view->setVar('multipart', true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function setDefaultOptions(OptionsResolverInterface $resolver)
|
|
{
|
|
$optionsNormalizer = function (Options $options, $value) {
|
|
$value['block_name'] = 'entry';
|
|
|
|
return $value;
|
|
};
|
|
|
|
$resolver->setDefaults(array(
|
|
'allow_add' => false,
|
|
'allow_delete' => false,
|
|
'prototype' => true,
|
|
'prototype_name' => '__name__',
|
|
'type' => 'text',
|
|
'options' => array(),
|
|
));
|
|
|
|
$resolver->setNormalizers(array(
|
|
'options' => $optionsNormalizer,
|
|
));
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getName()
|
|
{
|
|
return 'collection';
|
|
}
|
|
}
|