[Form] Refactored ChoiceField to FormFactory::getChoiceField()
This commit is contained in:
parent
6edff6b8a9
commit
b148a2a7ed
@ -113,12 +113,6 @@
|
||||
|
||||
{% 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>
|
||||
@ -131,19 +125,27 @@
|
||||
{% set options = choices %}
|
||||
{{ block('options') }}
|
||||
</select>
|
||||
{% endif %}
|
||||
{% 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 %}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user