Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Form/ResolvedFormType.php
Строк: 431
<?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 SymfonyComponentForm;

use 
SymfonyComponentFormExceptionInvalidArgumentException;
use 
SymfonyComponentFormExceptionUnexpectedTypeException;
use 
SymfonyComponentEventDispatcherEventDispatcher;
use 
SymfonyComponentOptionsResolverOptionsResolver;

/**
 * A wrapper for a form type and its extensions.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResolvedFormType implements ResolvedFormTypeInterface
{
    
/**
     * @var FormTypeInterface
     */
    
private $innerType;

    
/**
     * @var FormTypeExtensionInterface[]
     */
    
private $typeExtensions;

    
/**
     * @var ResolvedFormTypeInterface|null
     */
    
private $parent;

    
/**
     * @var OptionsResolver
     */
    
private $optionsResolver;

    public function 
__construct(FormTypeInterface $innerType, array $typeExtensions = array(), ResolvedFormTypeInterface $parent null)
    {
        if (!
preg_match('/^[a-z0-9_]*$/i'$innerType->getName())) {
            throw new 
InvalidArgumentException(sprintf(
                
'The "%s" form type name ("%s") is not valid. Names must only contain letters, numbers, and "_".',
                
get_class($innerType),
                
$innerType->getName()
            ));
        }

        foreach (
$typeExtensions as $extension) {
            if (!
$extension instanceof FormTypeExtensionInterface) {
                throw new 
UnexpectedTypeException($extension'SymfonyComponentFormFormTypeExtensionInterface');
            }
        }

        
$this->innerType $innerType;
        
$this->typeExtensions $typeExtensions;
        
$this->parent $parent;
    }

    
/**
     * {@inheritdoc}
     */
    
public function getName()
    {
        return 
$this->innerType->getName();
    }

    
/**
     * {@inheritdoc}
     */
    
public function getParent()
    {
        return 
$this->parent;
    }

    
/**
     * {@inheritdoc}
     */
    
public function getInnerType()
    {
        return 
$this->innerType;
    }

    
/**
     * {@inheritdoc}
     */
    
public function getTypeExtensions()
    {
        
// BC
        
if ($this->innerType instanceof AbstractType) {
            return 
$this->innerType->getExtensions();
        }

        return 
$this->typeExtensions;
    }

    
/**
     * {@inheritdoc}
     */
    
public function createBuilder(FormFactoryInterface $factory$name, array $options = array())
    {
        
$options $this->getOptionsResolver()->resolve($options);

        
// Should be decoupled from the specific option at some point
        
$dataClass = isset($options['data_class']) ? $options['data_class'] : null;

        
$builder $this->newBuilder($name$dataClass$factory$options);
        
$builder->setType($this);

        return 
$builder;
    }

    
/**
     * {@inheritdoc}
     */
    
public function createView(FormInterface $formFormView $parent null)
    {
        return 
$this->newView($parent);
    }

    
/**
     * Configures a form builder for the type hierarchy.
     *
     * @param FormBuilderInterface $builder The builder to configure.
     * @param array                $options The options used for the configuration.
     */
    
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (
null !== $this->parent) {
            
$this->parent->buildForm($builder$options);
        }

        
$this->innerType->buildForm($builder$options);

        foreach (
$this->typeExtensions as $extension) {
            
$extension->buildForm($builder$options);
        }
    }

    
/**
     * Configures a form view for the type hierarchy.
     *
     * This method is called before the children of the view are built.
     *
     * @param FormView      $view    The form view to configure.
     * @param FormInterface $form    The form corresponding to the view.
     * @param array         $options The options used for the configuration.
     */
    
public function buildView(FormView $viewFormInterface $form, array $options)
    {
        if (
null !== $this->parent) {
            
$this->parent->buildView($view$form$options);
        }

        
$this->innerType->buildView($view$form$options);

        foreach (
$this->typeExtensions as $extension) {
            
$extension->buildView($view$form$options);
        }
    }

    
/**
     * Finishes a form view for the type hierarchy.
     *
     * This method is called after the children of the view have been built.
     *
     * @param FormView      $view    The form view to configure.
     * @param FormInterface $form    The form corresponding to the view.
     * @param array         $options The options used for the configuration.
     */
    
public function finishView(FormView $viewFormInterface $form, array $options)
    {
        if (
null !== $this->parent) {
            
$this->parent->finishView($view$form$options);
        }

        
$this->innerType->finishView($view$form$options);

        foreach (
$this->typeExtensions as $extension) {
            
/* @var FormTypeExtensionInterface $extension */
            
$extension->finishView($view$form$options);
        }
    }

    
/**
     * Returns the configured options resolver used for this type.
     *
     * @return SymfonyComponentOptionsResolverOptionsResolverInterface The options resolver.
     */
    
public function getOptionsResolver()
    {
        if (
null === $this->optionsResolver) {
            if (
null !== $this->parent) {
                
$this->optionsResolver = clone $this->parent->getOptionsResolver();
            } else {
                
$this->optionsResolver = new OptionsResolver();
            }

            
$this->innerType->setDefaultOptions($this->optionsResolver);

            
$reflector = new ReflectionMethod($this->innerType'setDefaultOptions');
            
$isOverwritten = ($reflector->getDeclaringClass()->getName() !== 'SymfonyComponentFormAbstractType');

            if (
true === $isOverwritten) {
                
trigger_error('The FormTypeInterface::setDefaultOptions() method is deprecated since version 2.7 and will be removed in 3.0. Use configureOptions() instead. This method will be added to the FormTypeInterface with Symfony 3.0.'E_USER_DEPRECATED);
            }

            foreach (
$this->typeExtensions as $extension) {
                
$extension->setDefaultOptions($this->optionsResolver);

                
$reflector = new ReflectionMethod($extension'setDefaultOptions');
                
$isOverwritten = ($reflector->getDeclaringClass()->getName() !== 'SymfonyComponentFormAbstractTypeExtension');

                if (
true === $isOverwritten) {
                    
trigger_error('The FormTypeExtensionInterface::setDefaultOptions() method is deprecated since version 2.7 and will be removed in 3.0. Use configureOptions() instead. This method will be added to the FormTypeExtensionInterface with Symfony 3.0.'E_USER_DEPRECATED);
                }
            }
        }

        return 
$this->optionsResolver;
    }

    
/**
     * Creates a new builder instance.
     *
     * Override this method if you want to customize the builder class.
     *
     * @param string               $name      The name of the builder.
     * @param string               $dataClass The data class.
     * @param FormFactoryInterface $factory   The current form factory.
     * @param array                $options   The builder options.
     *
     * @return FormBuilderInterface The new builder instance.
     */
    
protected function newBuilder($name$dataClassFormFactoryInterface $factory, array $options)
    {
        if (
$this->innerType instanceof ButtonTypeInterface) {
            return new 
ButtonBuilder($name$options);
        }

        if (
$this->innerType instanceof SubmitButtonTypeInterface) {
            return new 
SubmitButtonBuilder($name$options);
        }

        return new 
FormBuilder($name$dataClass, new EventDispatcher(), $factory$options);
    }

    
/**
     * Creates a new view instance.
     *
     * Override this method if you want to customize the view class.
     *
     * @param FormView|null $parent The parent view, if available.
     *
     * @return FormView A new view instance.
     */
    
protected function newView(FormView $parent null)
    {
        return new 
FormView($parent);
    }
}
Онлайн: 3
Реклама