[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,37 +113,39 @@
{% block choice__widget %}
{% 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 %}>
{% if not field.required %}
<option value="">{{ empty_value }}</option>
{% endif %}
{% if preferred_choices|length > 0 %}
{% set options = preferred_choices %}
{{ block('options') }}
<option disabled="disabled">{{ separator }}</option>
{% endif %}
{% set options = choices %}
<select {{ block('field_attributes') }}{% if field.isMultipleChoice %} multiple="multiple"{% endif %}>
{% if not field.required %}
<option value="">{{ empty_value }}</option>
{% endif %}
{% if preferred_choices|length > 0 %}
{% set options = preferred_choices %}
{{ block('options') }}
</select>
{% endif %}
<option disabled="disabled">{{ separator }}</option>
{% endif %}
{% set options = choices %}
{{ block('options') }}
</select>
{% endspaceless %}
{% 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 %}
{% 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 %}
{% endblock checkbox__widget %}
{% block radio__widget %}
{% 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 %}
{% endblock radio__widget %}

View File

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

View File

@ -12,15 +12,26 @@
namespace Symfony\Component\Form;
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\Theme\ThemeInterface;
use Symfony\Component\Form\Renderer\Plugin\IdPlugin;
use Symfony\Component\Form\Renderer\Plugin\NamePlugin;
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
{
private $theme;
public function __construct(ThemeInterface $theme)
{
$this->setTheme($theme);
}
public function setTheme(ThemeInterface $theme)
{
$this->theme = $theme;
@ -31,9 +42,9 @@ class FormFactory
return $this->theme;
}
protected function getField($name, $template)
protected function getField($key, $template)
{
$field = new Field($name);
$field = new Field($key);
return $field
->setRenderer(new DefaultRenderer($this->theme, $template))
@ -41,19 +52,89 @@ class FormFactory
->addRendererPlugin(new NamePlugin($field));
}
public function getCheckboxField($name, $value = '1')
protected function getForm($key, $template)
{
return $this->getField($name, 'checkbox')
->setValueTransformer(new BooleanToStringTransformer())
->addRendererPlugin(new ValuePlugin($value));
$field = new Form($key);
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
->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;
}
}