[Form] Refactored ChoiceField to FormFactory::getChoiceField()

This commit is contained in:
Bernhard Schussek 2011-02-19 15:26:07 +01:00
parent 6edff6b8a9
commit b148a2a7ed
3 changed files with 115 additions and 29 deletions

View File

@ -113,12 +113,6 @@
{% block choice__widget %} {% block choice__widget %}
{% spaceless %} {% spaceless %}
{% if field.isExpanded %}
{% for choice, child in field %}
{{ child.renderer.widget }}
<label for="{{ id }}">{{ choice_list.label(choice) }}</label>
{% endfor %}
{% else %}
<select {{ block('field_attributes') }}{% if field.isMultipleChoice %} multiple="multiple"{% endif %}> <select {{ block('field_attributes') }}{% if field.isMultipleChoice %} multiple="multiple"{% endif %}>
{% if not field.required %} {% if not field.required %}
<option value="">{{ empty_value }}</option> <option value="">{{ empty_value }}</option>
@ -131,19 +125,27 @@
{% set options = choices %} {% set options = choices %}
{{ block('options') }} {{ block('options') }}
</select> </select>
{% endif %}
{% endspaceless %} {% endspaceless %}
{% endblock choice__widget %} {% endblock choice__widget %}
{% block choice_expanded__widget %}
{% spaceless %}
{% for choice, child in field %}
{{ child.renderer.widget }}
{{ child.renderer.label(choice_list.label(choice)) }}
{% endfor %}
{% endspaceless %}
{% endblock choice_expanded__widget %}
{% block checkbox__widget %} {% block checkbox__widget %}
{% spaceless %} {% spaceless %}
<input type="checkbox" {{ block('field_attributes') }}{% if field.hasValue %} value="{{ field.value }}"{% endif %}{% if field.ischecked %} checked="checked"{% endif %} /> <input type="checkbox" {{ block('field_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if field.data %} checked="checked"{% endif %} />
{% endspaceless %} {% endspaceless %}
{% endblock checkbox__widget %} {% endblock checkbox__widget %}
{% block radio__widget %} {% block radio__widget %}
{% spaceless %} {% spaceless %}
<input type="radio" {{ block('field_attributes') }}{% if field.hasValue %} value="{{ field.value }}"{% endif %}{% if field.ischecked %} checked="checked"{% endif %} /> <input type="radio" {{ block('field_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if field.data %} checked="checked"{% endif %} />
{% endspaceless %} {% endspaceless %}
{% endblock radio__widget %} {% endblock radio__widget %}

View File

@ -483,6 +483,9 @@ class Field extends Configurable implements FieldInterface
*/ */
public function setRenderer(RendererInterface $renderer) public function setRenderer(RendererInterface $renderer)
{ {
$renderer->setParameter('field', $this);
$renderer->setParameter('label', ucfirst(strtolower(str_replace('_', ' ', $this->getKey()))));
$this->renderer = $renderer; $this->renderer = $renderer;
return $this; return $this;

View File

@ -12,15 +12,26 @@
namespace Symfony\Component\Form; namespace Symfony\Component\Form;
use Symfony\Component\Form\ValueTransformer\BooleanToStringTransformer; use Symfony\Component\Form\ValueTransformer\BooleanToStringTransformer;
use Symfony\Component\Form\ChoiceList\DefaultChoiceList;
use Symfony\Component\Form\DataProcessor\RadioToArrayConverter;
use Symfony\Component\Form\Renderer\DefaultRenderer; use Symfony\Component\Form\Renderer\DefaultRenderer;
use Symfony\Component\Form\Renderer\Theme\ThemeInterface;
use Symfony\Component\Form\Renderer\Plugin\IdPlugin; use Symfony\Component\Form\Renderer\Plugin\IdPlugin;
use Symfony\Component\Form\Renderer\Plugin\NamePlugin; use Symfony\Component\Form\Renderer\Plugin\NamePlugin;
use Symfony\Component\Form\Renderer\Plugin\ValuePlugin; use Symfony\Component\Form\Renderer\Plugin\ValuePlugin;
use Symfony\Component\Form\Renderer\Plugin\ChoicePlugin;
use Symfony\Component\Form\Renderer\Plugin\ParentNamePlugin;
use Symfony\Component\Form\ValueTransformer\ScalarToChoicesTransformer;
class FormFactory class FormFactory
{ {
private $theme; private $theme;
public function __construct(ThemeInterface $theme)
{
$this->setTheme($theme);
}
public function setTheme(ThemeInterface $theme) public function setTheme(ThemeInterface $theme)
{ {
$this->theme = $theme; $this->theme = $theme;
@ -31,9 +42,9 @@ class FormFactory
return $this->theme; return $this->theme;
} }
protected function getField($name, $template) protected function getField($key, $template)
{ {
$field = new Field($name); $field = new Field($key);
return $field return $field
->setRenderer(new DefaultRenderer($this->theme, $template)) ->setRenderer(new DefaultRenderer($this->theme, $template))
@ -41,19 +52,89 @@ class FormFactory
->addRendererPlugin(new NamePlugin($field)); ->addRendererPlugin(new NamePlugin($field));
} }
public function getCheckboxField($name, $value = '1') protected function getForm($key, $template)
{ {
return $this->getField($name, 'checkbox') $field = new Form($key);
->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new ValuePlugin($value)); return $field
->setRenderer(new DefaultRenderer($this->theme, $template))
->addRendererPlugin(new IdPlugin($field))
->addRendererPlugin(new NamePlugin($field));
} }
public function getRadioField($name) public function getCheckboxField($key, array $options = array())
{ {
$field = $this->getField($name, 'radio'); $options = array_replace(array(
'value' => '1',
), $options);
return $this->getField($key, 'checkbox')
->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new ValuePlugin($options['value']));
}
public function getRadioField($key, array $options = array())
{
$options = array_replace(array(
'value' => null,
), $options);
$field = $this->getField($key, 'radio');
return $field return $field
->setValueTransformer(new BooleanToStringTransformer()) ->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new ParentNamePlugin($field)); ->addRendererPlugin(new ParentNamePlugin($field))
->addRendererPlugin(new ValuePlugin($options['value']));
}
public function getChoiceField($key, array $options = array())
{
$options = array_replace(array(
'choices' => array(),
'preferred_choices' => array(),
'multiple' => false,
'expanded' => false,
), $options);
$choiceList = new DefaultChoiceList(
$options['choices'],
$options['preferred_choices']
);
if (!$options['expanded']) {
$field = $this->getField($key, 'choice');
} else {
$field = $this->getForm($key, 'choice_expanded');
$choices = array_merge($choiceList->getPreferredChoices(), $choiceList->getOtherChoices());
foreach ($choices as $choice => $value) {
if ($options['multiple']) {
$field->add($this->getCheckboxField($choice, array(
'value' => $choice,
)));
} else {
$field->add($this->getRadioField($choice, array(
'value' => $choice,
)));
}
}
}
$field->addRendererPlugin(new ChoicePlugin($choiceList));
if ($options['multiple'] && $options['expanded']) {
$field->setValueTransformer(new ArrayToChoicesTransformer($choiceList));
}
if (!$options['multiple'] && $options['expanded']) {
$field->setValueTransformer(new ScalarToChoicesTransformer($choiceList));
$field->setDataPreprocessor(new RadioToArrayConverter());
}
if ($options['multiple'] && !$options['expanded']) {
$field->addRendererPlugin(new SelectMultipleNamePlugin($field));
}
return $field;
} }
} }