[Form] Refactored ChoiceField to FormFactory::getChoiceField()
This commit is contained in:
parent
6edff6b8a9
commit
b148a2a7ed
@ -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 %}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user