[Form] Removed dependency from renderer plugins on fields. The field instance is now passed to setUp() instead.

This commit is contained in:
Bernhard Schussek 2011-03-17 11:18:50 +01:00
parent cb283d3783
commit eba602ed1b
20 changed files with 70 additions and 132 deletions

View File

@ -20,7 +20,7 @@ class CheckboxFieldConfig extends AbstractFieldConfig
public function configure(FieldInterface $field, array $options) public function configure(FieldInterface $field, array $options)
{ {
$field->setValueTransformer(new BooleanToStringTransformer()) $field->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new CheckedPlugin($field)) ->addRendererPlugin(new CheckedPlugin())
->setRendererVar('value', $options['value']); ->setRendererVar('value', $options['value']);
} }

View File

@ -56,7 +56,7 @@ class ChoiceFieldConfig extends AbstractFieldConfig
} }
if ($options['multiple'] && !$options['expanded']) { if ($options['multiple'] && !$options['expanded']) {
$field->addRendererPlugin(new SelectMultipleNamePlugin($field)); $field->addRendererPlugin(new SelectMultipleNamePlugin());
} }
} }

View File

@ -41,8 +41,8 @@ class FieldConfig extends AbstractFieldConfig
->setValueTransformer($options['value_transformer']) ->setValueTransformer($options['value_transformer'])
->setNormalizationTransformer($options['normalization_transformer']) ->setNormalizationTransformer($options['normalization_transformer'])
->setData($options['data']) ->setData($options['data'])
->setRenderer(new DefaultRenderer($this->theme, $options['template'])) ->setRenderer(new DefaultRenderer($field, $this->theme, $options['template']))
->addRendererPlugin(new FieldPlugin($field)) ->addRendererPlugin(new FieldPlugin())
->setRendererVar('class', null) ->setRendererVar('class', null)
->setRendererVar('max_length', null) ->setRendererVar('max_length', null)
->setRendererVar('size', null) ->setRendererVar('size', null)

View File

@ -42,7 +42,7 @@ class FormConfig extends AbstractFieldConfig
->setValidationGroups($options['validation_groups']) ->setValidationGroups($options['validation_groups'])
->setVirtual($options['virtual']) ->setVirtual($options['virtual'])
->setValidator($options['validator']) ->setValidator($options['validator'])
->addRendererPlugin(new FormPlugin($field )); ->addRendererPlugin(new FormPlugin());
if ($options['csrf_protection']) { if ($options['csrf_protection']) {
$field->enableCsrfProtection($options['csrf_provider'], $options['csrf_field_name']); $field->enableCsrfProtection($options['csrf_provider'], $options['csrf_field_name']);

View File

@ -18,7 +18,7 @@ class PasswordFieldConfig extends AbstractFieldConfig
{ {
public function configure(FieldInterface $field, array $options) public function configure(FieldInterface $field, array $options)
{ {
$field->addRendererPlugin(new PasswordValuePlugin($field, $options['always_empty'])); $field->addRendererPlugin(new PasswordValuePlugin($options['always_empty']));
} }
public function getDefaultOptions(array $options) public function getDefaultOptions(array $options)

View File

@ -21,8 +21,8 @@ class RadioFieldConfig extends AbstractFieldConfig
public function configure(FieldInterface $field, array $options) public function configure(FieldInterface $field, array $options)
{ {
$field->setValueTransformer(new BooleanToStringTransformer()) $field->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new CheckedPlugin($field)) ->addRendererPlugin(new CheckedPlugin())
->addRendererPlugin(new ParentNamePlugin($field)) ->addRendererPlugin(new ParentNamePlugin())
->setRendererVar('value', $options['value']); ->setRendererVar('value', $options['value']);
} }

View File

@ -14,7 +14,7 @@ namespace Symfony\Component\Form;
use Symfony\Component\Form\ValueTransformer\ValueTransformerInterface; use Symfony\Component\Form\ValueTransformer\ValueTransformerInterface;
use Symfony\Component\Form\ValueTransformer\TransformationFailedException; use Symfony\Component\Form\ValueTransformer\TransformationFailedException;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\Renderer\Plugin\PluginInterface; use Symfony\Component\Form\Renderer\Plugin\RendererPluginInterface;
use Symfony\Component\Form\Event\DataEvent; use Symfony\Component\Form\Event\DataEvent;
use Symfony\Component\Form\Event\FilterDataEvent; use Symfony\Component\Form\Event\FilterDataEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@ -495,7 +495,7 @@ class Field implements FieldInterface
return $this->renderer; return $this->renderer;
} }
public function addRendererPlugin(PluginInterface $plugin) public function addRendererPlugin(RendererPluginInterface $plugin)
{ {
$this->renderer->addPlugin($plugin); $this->renderer->addPlugin($plugin);

View File

@ -13,7 +13,7 @@ namespace Symfony\Component\Form\Renderer;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\Theme\ThemeInterface; use Symfony\Component\Form\Renderer\Theme\ThemeInterface;
use Symfony\Component\Form\Renderer\Plugin\PluginInterface; use Symfony\Component\Form\Renderer\Plugin\RendererPluginInterface;
class DefaultRenderer implements RendererInterface, \ArrayAccess class DefaultRenderer implements RendererInterface, \ArrayAccess
{ {
@ -33,8 +33,9 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
private $children = array(); private $children = array();
public function __construct(ThemeInterface $theme, $template) public function __construct(FieldInterface $field, ThemeInterface $theme, $template)
{ {
$this->field = $field;
$this->theme = $theme; $this->theme = $theme;
$this->template = $template; $this->template = $template;
} }
@ -56,8 +57,8 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
// Make sure that plugins and set variables are applied in the // Make sure that plugins and set variables are applied in the
// order they were added // order they were added
foreach ($this->changes as $key => $value) { foreach ($this->changes as $key => $value) {
if ($value instanceof PluginInterface) { if ($value instanceof RendererPluginInterface) {
$value->setUp($this); $value->setUp($this->field, $this);
} else { } else {
$this->vars[$key] = $value; $this->vars[$key] = $value;
} }
@ -82,7 +83,7 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
return $this->theme; return $this->theme;
} }
public function addPlugin(PluginInterface $plugin) public function addPlugin(RendererPluginInterface $plugin)
{ {
$this->initialized = false; $this->initialized = false;
$this->changes[] = $plugin; $this->changes[] = $plugin;

View File

@ -14,17 +14,10 @@ namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
class CheckedPlugin implements PluginInterface class CheckedPlugin implements RendererPluginInterface
{ {
private $field; public function setUp(FieldInterface $field, RendererInterface $renderer)
public function __construct(FieldInterface $field)
{ {
$this->field = $field; $renderer->setVar('checked', (bool)$field->getData());
}
public function setUp(RendererInterface $renderer)
{
$renderer->setVar('checked', (bool)$this->field->getData());
} }
} }

View File

@ -11,10 +11,11 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\ChoiceList\ChoiceListInterface; use Symfony\Component\Form\ChoiceList\ChoiceListInterface;
class ChoicePlugin implements PluginInterface class ChoicePlugin implements RendererPluginInterface
{ {
private $choiceList; private $choiceList;
@ -23,7 +24,7 @@ class ChoicePlugin implements PluginInterface
$this->choiceList = $choiceList; $this->choiceList = $choiceList;
} }
public function setUp(RendererInterface $renderer) public function setUp(FieldInterface $field, RendererInterface $renderer)
{ {
$choiceList = $this->choiceList; $choiceList = $this->choiceList;

View File

@ -11,9 +11,10 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
class DatePatternPlugin implements PluginInterface class DatePatternPlugin implements RendererPluginInterface
{ {
private $formatter; private $formatter;
@ -22,7 +23,7 @@ class DatePatternPlugin implements PluginInterface
$this->formatter = $formatter; $this->formatter = $formatter;
} }
public function setUp(RendererInterface $renderer) public function setUp(FieldInterface $field, RendererInterface $renderer)
{ {
$renderer->setVar('date_pattern', $this->getPattern()); $renderer->setVar('date_pattern', $this->getPattern());
} }

View File

@ -11,29 +11,13 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class EnctypePlugin implements PluginInterface class EnctypePlugin implements RendererPluginInterface
{ {
private $field; public function setUp(FieldInterface $field, RendererInterface $renderer)
public function __construct(FieldInterface $field)
{ {
$this->field = $field; $renderer->setVar('enctype', $field->isMultipart() ? 'enctype="multipart/form-data"' : '');
}
/**
* Renders the HTML enctype in the field tag, if necessary
*
* Example usage in Twig templates:
*
* <field action="..." method="post" {{ field.render.enctype }}>
*
* @param Form $field The field for which to render the encoding type
*/
public function setUp(RendererInterface $renderer)
{
$renderer->setVar('enctype', $this->field->isMultipart() ? 'enctype="multipart/form-data"' : '');
} }
} }

View File

@ -14,15 +14,8 @@ namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
class FieldPlugin implements PluginInterface class FieldPlugin implements RendererPluginInterface
{ {
private $field;
public function __construct(FieldInterface $field)
{
$this->field = $field;
}
/** /**
* Renders the HTML enctype in the field tag, if necessary * Renders the HTML enctype in the field tag, if necessary
* *
@ -32,12 +25,12 @@ class FieldPlugin implements PluginInterface
* *
* @param Form $field The field for which to render the encoding type * @param Form $field The field for which to render the encoding type
*/ */
public function setUp(RendererInterface $renderer) public function setUp(FieldInterface $field, RendererInterface $renderer)
{ {
$fieldKey = $this->field->getName(); $fieldKey = $field->getName();
if ($this->field->hasParent()) { if ($field->hasParent()) {
$parentRenderer = $this->field->getParent()->getRenderer(); $parentRenderer = $field->getParent()->getRenderer();
$parentId = $parentRenderer->getVar('id'); $parentId = $parentRenderer->getVar('id');
$parentName = $parentRenderer->getVar('name'); $parentName = $parentRenderer->getVar('name');
$id = sprintf('%s_%s', $parentId, $fieldKey); $id = sprintf('%s_%s', $parentId, $fieldKey);
@ -50,13 +43,13 @@ class FieldPlugin implements PluginInterface
$renderer->setVar('this', $renderer); $renderer->setVar('this', $renderer);
$renderer->setVar('id', $id); $renderer->setVar('id', $id);
$renderer->setVar('name', $name); $renderer->setVar('name', $name);
$renderer->setVar('errors', $this->field->getErrors()); $renderer->setVar('errors', $field->getErrors());
$renderer->setVar('value', $this->field->getDisplayedData()); $renderer->setVar('value', $field->getDisplayedData());
$renderer->setVar('disabled', $this->field->isDisabled()); $renderer->setVar('disabled', $field->isDisabled());
$renderer->setVar('required', $this->field->isRequired()); $renderer->setVar('required', $field->isRequired());
$renderer->setVar('class', null); $renderer->setVar('class', null);
$renderer->setVar('max_length', null); $renderer->setVar('max_length', null);
$renderer->setVar('size', null); $renderer->setVar('size', null);
$renderer->setVar('label', ucfirst(strtolower(str_replace('_', ' ', $this->field->getName())))); $renderer->setVar('label', ucfirst(strtolower(str_replace('_', ' ', $field->getName()))));
} }
} }

View File

@ -11,20 +11,19 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
class FormPlugin implements PluginInterface class FormPlugin implements RendererPluginInterface
{ {
private $form; public function setUp(FieldInterface $form, RendererInterface $renderer)
public function __construct(FormInterface $form)
{ {
$this->form = $form; if (!$form instanceof FormInterface) {
} throw new UnexpectedTypeException($form, 'Symfony\Component\Form\FormInterface');
}
public function setUp(RendererInterface $renderer)
{
$fields = array(); $fields = array();
foreach ($this->form as $name => $field) { foreach ($this->form as $name => $field) {

View File

@ -11,10 +11,10 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class MaxLengthPlugin implements PluginInterface class MaxLengthPlugin implements RendererPluginInterface
{ {
private $maxLength; private $maxLength;
@ -23,16 +23,7 @@ class MaxLengthPlugin implements PluginInterface
$this->maxLength = $maxLength; $this->maxLength = $maxLength;
} }
/** public function setUp(FieldInterface $field, RendererInterface $renderer)
* Renders the HTML enctype in the field tag, if necessary
*
* Example usage in Twig templates:
*
* <field action="..." method="post" {{ field.render.enctype }}>
*
* @param Form $field The field for which to render the encoding type
*/
public function setUp(RendererInterface $renderer)
{ {
$renderer->setVar('max_length', $this->maxLength); $renderer->setVar('max_length', $this->maxLength);
} }

View File

@ -11,9 +11,10 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
class MoneyPatternPlugin implements PluginInterface class MoneyPatternPlugin implements RendererPluginInterface
{ {
private static $patterns = array(); private static $patterns = array();
@ -24,7 +25,7 @@ class MoneyPatternPlugin implements PluginInterface
$this->currency = $currency; $this->currency = $currency;
} }
public function setUp(RendererInterface $renderer) public function setUp(FieldInterface $field, RendererInterface $renderer)
{ {
$renderer->setVar('money_pattern', self::getPattern($this->currency)); $renderer->setVar('money_pattern', self::getPattern($this->currency));
} }

View File

@ -11,31 +11,15 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class ParentNamePlugin implements PluginInterface class ParentNamePlugin implements RendererPluginInterface
{ {
private $field; public function setUp(FieldInterface $field, RendererInterface $renderer)
public function __construct(FieldInterface $field)
{ {
$this->field = $field; if ($field->hasParent()) {
} $parentRenderer = $field->getParent()->getRenderer();
/**
* Renders the HTML enctype in the field tag, if necessary
*
* Example usage in Twig templates:
*
* <field action="..." method="post" {{ field.render.enctype }}>
*
* @param Form $field The field for which to render the encoding type
*/
public function setUp(RendererInterface $renderer)
{
if ($this->field->hasParent()) {
$parentRenderer = $this->field->getParent()->getRenderer();
$renderer->setVar('name', $parentRenderer->getVar('name')); $renderer->setVar('name', $parentRenderer->getVar('name'));
} }
} }

View File

@ -11,35 +11,23 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface; use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class PasswordValuePlugin implements PluginInterface class PasswordValuePlugin implements RendererPluginInterface
{ {
private $field;
private $alwaysEmpty; private $alwaysEmpty;
public function __construct(FieldInterface $field, $alwaysEmpty = true) public function __construct($alwaysEmpty = true)
{ {
$this->field = $field;
$this->alwaysEmpty = $alwaysEmpty; $this->alwaysEmpty = $alwaysEmpty;
} }
/** public function setUp(FieldInterface $field, RendererInterface $renderer)
* Renders the HTML enctype in the field tag, if necessary
*
* Example usage in Twig templates:
*
* <field action="..." method="post" {{ field.render.enctype }}>
*
* @param Form $field The field for which to render the encoding type
*/
public function setUp(RendererInterface $renderer)
{ {
$value = $this->alwaysEmpty || !$this->field->isSubmitted() $value = $this->alwaysEmpty || !$field->isSubmitted()
? '' ? ''
: $this->field->getDisplayedData(); : $field->getDisplayedData();
$renderer->setVar('value', $value); $renderer->setVar('value', $value);
} }

View File

@ -11,9 +11,10 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
interface PluginInterface interface RendererPluginInterface
{ {
function setUp(RendererInterface $renderer); function setUp(FieldInterface $field, RendererInterface $renderer);
} }

View File

@ -11,11 +11,12 @@
namespace Symfony\Component\Form\Renderer\Plugin; namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface; use Symfony\Component\Form\Renderer\RendererInterface;
class SelectMultipleNamePlugin implements PluginInterface class SelectMultipleNamePlugin implements RendererPluginInterface
{ {
public function setUp(RendererInterface $renderer) public function setUp(FieldInterface $field, RendererInterface $renderer)
{ {
// Add "[]" to the name in case a select tag with multiple options is // Add "[]" to the name in case a select tag with multiple options is
// displayed. Otherwise only one of the selected options is sent in the // displayed. Otherwise only one of the selected options is sent in the