[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)
{
$field->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new CheckedPlugin($field))
->addRendererPlugin(new CheckedPlugin())
->setRendererVar('value', $options['value']);
}

View File

@ -56,7 +56,7 @@ class ChoiceFieldConfig extends AbstractFieldConfig
}
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'])
->setNormalizationTransformer($options['normalization_transformer'])
->setData($options['data'])
->setRenderer(new DefaultRenderer($this->theme, $options['template']))
->addRendererPlugin(new FieldPlugin($field))
->setRenderer(new DefaultRenderer($field, $this->theme, $options['template']))
->addRendererPlugin(new FieldPlugin())
->setRendererVar('class', null)
->setRendererVar('max_length', null)
->setRendererVar('size', null)

View File

@ -42,7 +42,7 @@ class FormConfig extends AbstractFieldConfig
->setValidationGroups($options['validation_groups'])
->setVirtual($options['virtual'])
->setValidator($options['validator'])
->addRendererPlugin(new FormPlugin($field ));
->addRendererPlugin(new FormPlugin());
if ($options['csrf_protection']) {
$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)
{
$field->addRendererPlugin(new PasswordValuePlugin($field, $options['always_empty']));
$field->addRendererPlugin(new PasswordValuePlugin($options['always_empty']));
}
public function getDefaultOptions(array $options)

View File

@ -21,8 +21,8 @@ class RadioFieldConfig extends AbstractFieldConfig
public function configure(FieldInterface $field, array $options)
{
$field->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new CheckedPlugin($field))
->addRendererPlugin(new ParentNamePlugin($field))
->addRendererPlugin(new CheckedPlugin())
->addRendererPlugin(new ParentNamePlugin())
->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\TransformationFailedException;
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\FilterDataEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@ -495,7 +495,7 @@ class Field implements FieldInterface
return $this->renderer;
}
public function addRendererPlugin(PluginInterface $plugin)
public function addRendererPlugin(RendererPluginInterface $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\Renderer\Theme\ThemeInterface;
use Symfony\Component\Form\Renderer\Plugin\PluginInterface;
use Symfony\Component\Form\Renderer\Plugin\RendererPluginInterface;
class DefaultRenderer implements RendererInterface, \ArrayAccess
{
@ -33,8 +33,9 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
private $children = array();
public function __construct(ThemeInterface $theme, $template)
public function __construct(FieldInterface $field, ThemeInterface $theme, $template)
{
$this->field = $field;
$this->theme = $theme;
$this->template = $template;
}
@ -56,8 +57,8 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
// Make sure that plugins and set variables are applied in the
// order they were added
foreach ($this->changes as $key => $value) {
if ($value instanceof PluginInterface) {
$value->setUp($this);
if ($value instanceof RendererPluginInterface) {
$value->setUp($this->field, $this);
} else {
$this->vars[$key] = $value;
}
@ -82,7 +83,7 @@ class DefaultRenderer implements RendererInterface, \ArrayAccess
return $this->theme;
}
public function addPlugin(PluginInterface $plugin)
public function addPlugin(RendererPluginInterface $plugin)
{
$this->initialized = false;
$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\FieldInterface;
class CheckedPlugin implements PluginInterface
class CheckedPlugin implements RendererPluginInterface
{
private $field;
public function __construct(FieldInterface $field)
public function setUp(FieldInterface $field, RendererInterface $renderer)
{
$this->field = $field;
}
public function setUp(RendererInterface $renderer)
{
$renderer->setVar('checked', (bool)$this->field->getData());
$renderer->setVar('checked', (bool)$field->getData());
}
}

View File

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

View File

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

View File

@ -11,29 +11,13 @@
namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class EnctypePlugin implements PluginInterface
class EnctypePlugin implements RendererPluginInterface
{
private $field;
public function __construct(FieldInterface $field)
public function setUp(FieldInterface $field, RendererInterface $renderer)
{
$this->field = $field;
}
/**
* 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"' : '');
$renderer->setVar('enctype', $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\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
*
@ -32,12 +25,12 @@ class FieldPlugin implements PluginInterface
*
* @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()) {
$parentRenderer = $this->field->getParent()->getRenderer();
if ($field->hasParent()) {
$parentRenderer = $field->getParent()->getRenderer();
$parentId = $parentRenderer->getVar('id');
$parentName = $parentRenderer->getVar('name');
$id = sprintf('%s_%s', $parentId, $fieldKey);
@ -50,13 +43,13 @@ class FieldPlugin implements PluginInterface
$renderer->setVar('this', $renderer);
$renderer->setVar('id', $id);
$renderer->setVar('name', $name);
$renderer->setVar('errors', $this->field->getErrors());
$renderer->setVar('value', $this->field->getDisplayedData());
$renderer->setVar('disabled', $this->field->isDisabled());
$renderer->setVar('required', $this->field->isRequired());
$renderer->setVar('errors', $field->getErrors());
$renderer->setVar('value', $field->getDisplayedData());
$renderer->setVar('disabled', $field->isDisabled());
$renderer->setVar('required', $field->isRequired());
$renderer->setVar('class', null);
$renderer->setVar('max_length', 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;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface;
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 __construct(FormInterface $form)
public function setUp(FieldInterface $form, RendererInterface $renderer)
{
$this->form = $form;
}
if (!$form instanceof FormInterface) {
throw new UnexpectedTypeException($form, 'Symfony\Component\Form\FormInterface');
}
public function setUp(RendererInterface $renderer)
{
$fields = array();
foreach ($this->form as $name => $field) {

View File

@ -11,10 +11,10 @@
namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class MaxLengthPlugin implements PluginInterface
class MaxLengthPlugin implements RendererPluginInterface
{
private $maxLength;
@ -23,16 +23,7 @@ class MaxLengthPlugin implements PluginInterface
$this->maxLength = $maxLength;
}
/**
* 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)
public function setUp(FieldInterface $field, RendererInterface $renderer)
{
$renderer->setVar('max_length', $this->maxLength);
}

View File

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

View File

@ -11,31 +11,15 @@
namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class ParentNamePlugin implements PluginInterface
class ParentNamePlugin implements RendererPluginInterface
{
private $field;
public function __construct(FieldInterface $field)
public function setUp(FieldInterface $field, RendererInterface $renderer)
{
$this->field = $field;
}
/**
* 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();
if ($field->hasParent()) {
$parentRenderer = $field->getParent()->getRenderer();
$renderer->setVar('name', $parentRenderer->getVar('name'));
}
}

View File

@ -11,35 +11,23 @@
namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\Renderer\RendererInterface;
use Symfony\Component\Form\FieldInterface;
use Symfony\Component\Form\Renderer\RendererInterface;
class PasswordValuePlugin implements PluginInterface
class PasswordValuePlugin implements RendererPluginInterface
{
private $field;
private $alwaysEmpty;
public function __construct(FieldInterface $field, $alwaysEmpty = true)
public function __construct($alwaysEmpty = true)
{
$this->field = $field;
$this->alwaysEmpty = $alwaysEmpty;
}
/**
* 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)
public function setUp(FieldInterface $field, RendererInterface $renderer)
{
$value = $this->alwaysEmpty || !$this->field->isSubmitted()
$value = $this->alwaysEmpty || !$field->isSubmitted()
? ''
: $this->field->getDisplayedData();
: $field->getDisplayedData();
$renderer->setVar('value', $value);
}

View File

@ -11,9 +11,10 @@
namespace Symfony\Component\Form\Renderer\Plugin;
use Symfony\Component\Form\FieldInterface;
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;
use Symfony\Component\Form\FieldInterface;
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
// displayed. Otherwise only one of the selected options is sent in the