diff --git a/UPGRADE-2.1.md b/UPGRADE-2.1.md index 29baddf4f6..e8f9ca869b 100644 --- a/UPGRADE-2.1.md +++ b/UPGRADE-2.1.md @@ -102,7 +102,7 @@ ``` * The custom factories for the firewall configuration are now registered during the build method of bundles instead of being registered - by the end-user. This means that you will you need to remove the 'factories' + by the end-user. This means that you will you need to remove the 'factories' keys in your security configuration. * The Firewall listener is now registered after the Router listener. This @@ -313,29 +313,29 @@ return isset($options['widget']) && 'single_text' === $options['widget'] ? 'text' : 'choice'; } ``` - + * The methods `getDefaultOptions()` and `getAllowedOptionValues()` of form types no longer receive an option array. - + You can specify options that depend on other options using closures instead. - + Before: - + ``` public function getDefaultOptions(array $options) { $defaultOptions = array(); - + if ($options['multiple']) { $defaultOptions['empty_data'] = array(); } - + return $defaultOptions; } ``` - + After: - + ``` public function getDefaultOptions() { @@ -346,7 +346,7 @@ ); } ``` - + The second argument `$previousValue` does not have to be specified if not needed. @@ -366,29 +366,92 @@ (or any other of the BIND events). In case you used the CallbackValidator class, you should now pass the callback directly to `addEventListener`. - * simplified CSRF protection and removed the csrf type + * Since FormType and FieldType were merged, you need to adapt your form + themes. - * deprecated FieldType and merged it into FormType + The "field_widget" and all references to it should be renamed to + "form_widget_primitive": + + Before: + + ``` + {% block url_widget %} + {% spaceless %} + {% set type = type|default('url') %} + {{ block('field_widget') }} + {% endspaceless %} + {% endblock url_widget %} + ``` + + After: + + ``` + {% block url_widget %} + {% spaceless %} + {% set type = type|default('url') %} + {{ block('form_widget_primitive') }} + {% endspaceless %} + {% endblock url_widget %} + ``` + + All other "field_*" blocks and references to them should be renamed to + "form_*". If you previously defined both a "field_*" and a "form_*" + block, you can merge them into a single "form_*" block and check the new + Boolean variable "primitive": + + Before: + + ``` + {% block form_errors %} + {% spaceless %} + ... form code ... + {% endspaceless %} + {% endblock form_errors %} + + {% block field_errors %} + {% spaceless %} + ... field code ... + {% endspaceless %} + {% endblock field_errors %} + ``` + + After: + + ``` + {% block form_errors %} + {% spaceless %} + {% if primitive %} + ... field code ... + {% else %} + ... form code ... + {% endif %} + {% endspaceless %} + {% endblock form_errors %} + ``` + + Furthermore, the block "generic_label" was merged into "form_label". You + should now override "form_label" in order to customize labels. + + Last but not least, the block "widget_choice_options" was renamed to + "choice_widget_options" to be consistent with the rest of the default + theme. - * [BC BREAK] renamed "field_*" theme blocks to "form_*" and "field_widget" to - "input" - * The method `guessMinLength()` of FormTypeGuesserInterface was deprecated and will be removed in Symfony 2.3. You should use the new method `guessPattern()` instead which may return any regular expression that is inserted in the HTML5 attribute "pattern". - + Before: - + public function guessMinLength($class, $property) { if (/* condition */) { return new ValueGuess($minLength, Guess::LOW_CONFIDENCE); } } - + After: - + public function guessPattern($class, $property) { if (/* condition */) { @@ -470,7 +533,7 @@ `validate` and its return value was dropped. `ConstraintValidator` still contains the deprecated `isValid` method and - forwards `validate` calls to `isValid` by default. This BC layer will be + forwards `validate` calls to `isValid` by default. This BC layer will be removed in Symfony 2.3. You are advised to rename your methods. You should also remove the return values, which have never been used by the framework. @@ -500,7 +563,7 @@ $this->context->addViolation($constraint->message, array( '{{ value }}' => $value, )); - + return; } } diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig index 46420a7122..8fe3d004fa 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig @@ -2,17 +2,30 @@ {% block form_widget %} {% spaceless %} - {% if form.children|length > 0 %} -
- {{ block('form_rows') }} - {{ form_rest(form) }} -
+ {% if primitive %} + {{ block('form_widget_primitive') }} {% else %} - {{ block('input') }} + {{ block('form_widget_complex') }} {% endif %} {% endspaceless %} {% endblock form_widget %} +{% block form_widget_primitive %} +{% spaceless %} + {% set type = type|default('text') %} + +{% endspaceless %} +{% endblock form_widget_primitive %} + +{% block form_widget_complex %} +{% spaceless %} +
+ {{ block('form_rows') }} + {{ form_rest(form) }} +
+{% endspaceless %} +{% endblock form_widget_complex %} + {% block collection_widget %} {% spaceless %} {% if prototype is defined %} @@ -28,7 +41,47 @@ {% endspaceless %} {% endblock textarea_widget %} -{% block widget_choice_options %} +{% block choice_widget %} +{% spaceless %} + {% if expanded %} + {{ block('choice_widget_expanded') }} + {% else %} + {{ block('choice_widget_collapsed') }} + {% endif %} +{% endspaceless %} +{% endblock choice_widget %} + +{% block choice_widget_expanded %} +{% spaceless %} +
+ {% for child in form %} + {{ form_widget(child) }} + {{ form_label(child) }} + {% endfor %} +
+{% endspaceless %} +{% endblock choice_widget_expanded %} + +{% block choice_widget_collapsed %} +{% spaceless %} + +{% endspaceless %} +{% endblock choice_widget_collapsed %} + +{% block choice_widget_options %} {% spaceless %} {% for index, choice in options %} {% if _form_is_choice_group(choice) %} @@ -42,35 +95,7 @@ {% endif %} {% endfor %} {% endspaceless %} -{% endblock widget_choice_options %} - -{% block choice_widget %} -{% spaceless %} - {% if expanded %} -
- {% for child in form %} - {{ form_widget(child) }} - {{ form_label(child) }} - {% endfor %} -
- {% else %} - - {% endif %} -{% endspaceless %} -{% endblock choice_widget %} +{% endblock choice_widget_options %} {% block checkbox_widget %} {% spaceless %} @@ -87,7 +112,7 @@ {% block datetime_widget %} {% spaceless %} {% if widget == 'single_text' %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% else %}
{{ form_errors(form.date) }} @@ -102,7 +127,7 @@ {% block date_widget %} {% spaceless %} {% if widget == 'single_text' %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% else %}
{{ date_pattern|replace({ @@ -118,7 +143,7 @@ {% block time_widget %} {% spaceless %} {% if widget == 'single_text' %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% else %}
{{ form_widget(form.hour, { 'attr': { 'size': '1' } }) }}:{{ form_widget(form.minute, { 'attr': { 'size': '1' } }) }}{% if with_seconds %}:{{ form_widget(form.second, { 'attr': { 'size': '1' } }) }}{% endif %} @@ -131,81 +156,77 @@ {% spaceless %} {# type="number" doesn't work with floats #} {% set type = type|default('text') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% endspaceless %} {% endblock number_widget %} {% block integer_widget %} {% spaceless %} {% set type = type|default('number') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% endspaceless %} {% endblock integer_widget %} {% block money_widget %} {% spaceless %} - {{ money_pattern|replace({ '{{ widget }}': block('input') })|raw }} + {{ money_pattern|replace({ '{{ widget }}': block('form_widget_primitive') })|raw }} {% endspaceless %} {% endblock money_widget %} {% block url_widget %} {% spaceless %} {% set type = type|default('url') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% endspaceless %} {% endblock url_widget %} {% block search_widget %} {% spaceless %} {% set type = type|default('search') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% endspaceless %} {% endblock search_widget %} {% block percent_widget %} {% spaceless %} {% set type = type|default('text') %} - {{ block('input') }} % + {{ block('form_widget_primitive') }} % {% endspaceless %} {% endblock percent_widget %} {% block password_widget %} {% spaceless %} {% set type = type|default('password') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% endspaceless %} {% endblock password_widget %} {% block hidden_widget %} +{% spaceless %} {% set type = type|default('hidden') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} +{% endspaceless %} {% endblock hidden_widget %} {% block email_widget %} {% spaceless %} {% set type = type|default('email') %} - {{ block('input') }} + {{ block('form_widget_primitive') }} {% endspaceless %} {% endblock email_widget %} {# Labels #} -{% block generic_label %} +{% block form_label %} {% spaceless %} + {% if primitive %} + {% set attr = attr|merge({'for': id}) %} + {% endif %} {% if required %} {% set attr = attr|merge({'class': attr.class|default('') ~ ' required'}) %} {% endif %} {{ label|trans({}, translation_domain) }} {% endspaceless %} -{% endblock %} - -{% block form_label %} -{% spaceless %} - {% if form.children|length == 0 %} - {% set attr = attr|merge({'for': id}) %} - {% endif %} - {{ block('generic_label') }} -{% endspaceless %} {% endblock form_label %} {# Rows #} @@ -220,7 +241,9 @@ {% spaceless %}
{{ form_label(form, label|default(null)) }} - {% if form.children|length == 0 %} + {# If the child is a form, the errors are rendered inside the container #} + {# see block form_rows #} + {% if primitive %} {{ form_errors(form) }} {% endif %} {{ form_widget(form) }} @@ -247,10 +270,8 @@ {% for error in errors %}
  • {{ error.messagePluralization is null - ? - error.messageTemplate|trans(error.messageParameters, 'validators') - : - error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'validators') + ? error.messageTemplate|trans(error.messageParameters, 'validators') + : error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'validators') }}
  • {% endfor %} @@ -279,13 +300,6 @@ {% endspaceless %} {% endblock form_rows %} -{% block input %} -{% spaceless %} - {% set type = type|default('text') %} - -{% endspaceless %} -{% endblock input %} - {% block widget_attributes %} {% spaceless %} id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %} @@ -302,44 +316,12 @@ {# Deprecated in Symfony 2.1, to be removed in 2.3 #} -{% block field_widget %} -{% spaceless %} - {{ block('input') }} -{% endspaceless %} -{% endblock field_widget %} - -{% block field_label %} -{% spaceless %} - {{ block('form_label') }} -{% endspaceless %} -{% endblock field_label %} - -{% block field_row %} -{% spaceless %} - {{ block('form_row') }} -{% endspaceless %} -{% endblock field_row %} - -{% block field_enctype %} -{% spaceless %} - {{ block('form_enctype') }} -{% endspaceless %} -{% endblock field_enctype %} - -{% block field_errors %} -{% spaceless %} - {{ block('form_errors') }} -{% endspaceless %} -{% endblock field_errors %} - -{% block field_rest %} -{% spaceless %} - {{ block('form_rest') }} -{% endspaceless %} -{% endblock field_rest %} - -{% block field_rows %} -{% spaceless %} - {{ block('form_rows') }} -{% endspaceless %} -{% endblock field_rows %} \ No newline at end of file +{% block generic_label %}{{ block('form_label') }}{% endblock %} +{% block widget_choice_options %}{{ block('choice_widget_options') }}{% endblock %} +{% block field_widget %}{{ block('form_widget_primitive') }}{% endblock %} +{% block field_label %}{{ block('form_label') }}{% endblock %} +{% block field_row %}{{ block('form_row') }}{% endblock %} +{% block field_enctype %}{{ block('form_enctype') }}{% endblock %} +{% block field_errors %}{{ block('form_errors') }}{% endblock %} +{% block field_rest %}{{ block('form_rest') }}{% endblock %} +{% block field_rows %}{{ block('form_rows') }}{% endblock %} \ No newline at end of file diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig index b053c59e6f..69ef373fdd 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig @@ -7,7 +7,7 @@ {{ form_label(form, label|default(null)) }} - {% if form.children|length == 0 %} + {% if primitive %} {{ form_errors(form) }} {% endif %} {{ form_widget(form) }} @@ -18,7 +18,9 @@ {% block form_errors %} {% spaceless %} - {% if form.children|length > 0 %} + {% if primitive %} + {{ parent() }} + {% else %} {% if errors|length > 0 %} @@ -26,8 +28,6 @@ {% endif %} - {% else %} - {{ parent() }} {% endif %} {% endspaceless %} {% endblock form_errors %} @@ -42,15 +42,11 @@ {% endspaceless %} {% endblock hidden_row %} -{% block form_widget %} +{% block form_widget_complex %} {% spaceless %} - {% if form.children|length > 0 %} - - {{ block('form_rows') }} - {{ form_rest(form) }} -
    - {% else %} - {{ parent() }} - {% endif %} + + {{ block('form_rows') }} + {{ form_rest(form) }} +
    {% endspaceless %} -{% endblock form_widget %} +{% endblock form_widget_complex %} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/theme.html.twig b/src/Symfony/Bridge/Twig/Tests/Extension/theme.html.twig index ee5b19e073..517dd4549b 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/theme.html.twig +++ b/src/Symfony/Bridge/Twig/Tests/Extension/theme.html.twig @@ -1,6 +1,6 @@ -{% block input %} +{% block form_widget_primitive %} {% spaceless %} {% set type = type|default('text') %} - + {% endspaceless %} -{% endblock input %} +{% endblock form_widget_primitive %} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig b/src/Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig index f58e589498..c34955139c 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig +++ b/src/Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig @@ -1,8 +1,8 @@ {% extends 'form_div_layout.html.twig' %} -{% block input %} +{% block form_widget_primitive %} {% spaceless %} {% set type = type|default('text') %} - + {% endspaceless %} -{% endblock input %} +{% endblock form_widget_primitive %} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig b/src/Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig index 9304e9dcfa..ef7025efcc 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig +++ b/src/Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig @@ -1,8 +1,8 @@ {% use 'form_div_layout.html.twig' %} -{% block input %} +{% block form_widget_primitive %} {% spaceless %} {% set type = type|default('text') %} - + {% endspaceless %} -{% endblock input %} +{% endblock form_widget_primitive %} diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php index fe4afa01d2..12366d6e44 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/attributes.html.php @@ -1,9 +1 @@ -id="escape($id) ?>" -name="escape($full_name) ?>" -readonly="readonly" -disabled="disabled" -required="required" -maxlength="escape($max_length) ?>" -pattern="escape($pattern) ?>" - $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?> - +renderBlock('widget_attributes') ?> \ No newline at end of file diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/checkbox_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/checkbox_widget.html.php index 921f4af25b..fff427db11 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/checkbox_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/checkbox_widget.html.php @@ -1,5 +1,5 @@ renderBlock('attributes') ?> + renderBlock('widget_attributes') ?> value="escape($value) ?>" checked="checked" /> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_options.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_options.html.php index 66c664fb1d..298df7b300 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_options.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_options.html.php @@ -1,11 +1 @@ - $choice): ?> - isChoiceGroup($choice)): ?> - - - - - - - - - +renderBlock('choice_widget_options') ?> \ No newline at end of file diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget.html.php index e54bdb4df8..99db4acfae 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget.html.php @@ -1,22 +1,5 @@ -
    renderBlock('container_attributes') ?>> - - widget($child) ?> - label($child) ?> - -
    +renderBlock('choice_widget_expanded') ?> - +renderBlock('choice_widget_collapsed') ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_collapsed.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_collapsed.html.php new file mode 100644 index 0000000000..b0c601ea8f --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_collapsed.html.php @@ -0,0 +1,13 @@ + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_expanded.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_expanded.html.php new file mode 100644 index 0000000000..58de38d646 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_expanded.html.php @@ -0,0 +1,6 @@ +
    renderBlock('widget_container_attributes') ?>> + + widget($child) ?> + label($child) ?> + +
    diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_options.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_options.html.php new file mode 100644 index 0000000000..66c664fb1d --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_options.html.php @@ -0,0 +1,11 @@ + $choice): ?> + isChoiceGroup($choice)): ?> + + + + + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/container_attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/container_attributes.html.php index a36cfbbdfc..e132ed73c4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/container_attributes.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/container_attributes.html.php @@ -1,2 +1 @@ -id="escape($id) ?>" - $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?> +renderBlock('widget_container_attributes') ?> \ No newline at end of file diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/date_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/date_widget.html.php index bd2c2769af..14ef80f00f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/date_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/date_widget.html.php @@ -1,7 +1,7 @@ - renderBlock('input'); ?> + renderBlock('form_widget_primitive'); ?> -
    renderBlock('container_attributes') ?>> +
    renderBlock('widget_container_attributes') ?>> widget($form['year']), $view['form']->widget($form['month']), diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/datetime_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/datetime_widget.html.php index f71bd64e37..fdb1258c14 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/datetime_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/datetime_widget.html.php @@ -1,7 +1,7 @@ - renderBlock('input'); ?> + renderBlock('form_widget_primitive'); ?> -
    renderBlock('container_attributes') ?>> +
    renderBlock('widget_container_attributes') ?>> widget($form['date']).' '.$view['form']->widget($form['time']) ?>
    diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/email_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/email_widget.html.php index a00dda278e..388259f2d0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/email_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/email_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : 'email')) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : 'email')) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/field_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/field_widget.html.php index f1ca2edadb..d47f413bf4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/field_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/field_widget.html.php @@ -1 +1 @@ -renderBlock('input') ?> \ No newline at end of file +renderBlock('form_widget_primitive') ?> \ No newline at end of file diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php index 3ddc300fd4..f46d91bf45 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_label.html.php @@ -1,3 +1,3 @@ -hasChildren()) { $attr['for'] = $id; } ?> + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_row.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_row.html.php index 02fb9ae9b6..f837415297 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_row.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_row.html.php @@ -1,6 +1,6 @@
    label($form, isset($label) ? $label : null) ?> - hasChildren()): ?> + errors($form) ?> widget($form) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget.html.php index 1c9368693b..137a50eca5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget.html.php @@ -1,8 +1,5 @@ -hasChildren()): ?> -
    renderBlock('container_attributes') ?>> - renderBlock('form_rows') ?> - rest($form) ?> -
    + +renderBlock('form_widget_primitive')?> -renderBlock('input')?> +renderBlock('form_widget_complex')?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget_complex.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget_complex.html.php new file mode 100644 index 0000000000..ee349d1bd7 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget_complex.html.php @@ -0,0 +1,4 @@ +
    renderBlock('widget_container_attributes') ?>> + renderBlock('form_rows') ?> + rest($form) ?> +
    \ No newline at end of file diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget_primitive.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget_primitive.html.php new file mode 100644 index 0000000000..29649cfbd6 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget_primitive.html.php @@ -0,0 +1,5 @@ +value="escape($value) ?>" + renderBlock('widget_attributes') ?> +/> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/hidden_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/hidden_widget.html.php index 50a42451ae..e1354a64a0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/hidden_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/hidden_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : "hidden")) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "hidden")) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/input.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/input.html.php deleted file mode 100644 index 0c86483386..0000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/input.html.php +++ /dev/null @@ -1,5 +0,0 @@ -" - value="escape($value) ?>" - renderBlock('attributes') ?> -/> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/integer_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/integer_widget.html.php index 1fc6ace34b..6dee8dea13 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/integer_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/integer_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : "number")) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "number")) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/money_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/money_widget.html.php index a68ad5ddac..1dcf72d463 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/money_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/money_widget.html.php @@ -1 +1 @@ -renderBlock('input'), $money_pattern) ?> +renderBlock('form_widget_primitive'), $money_pattern) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/number_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/number_widget.html.php index 7e1a2776a7..7b5152d468 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/number_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/number_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : "text")) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "text")) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/password_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/password_widget.html.php index 7aff242ef4..469bdd667d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/password_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/password_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : "password")) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "password")) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/percent_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/percent_widget.html.php index 328321f21f..d67bb38246 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/percent_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/percent_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : "text")) ?> % +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "text")) ?> % diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/radio_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/radio_widget.html.php index daa16dbc62..3ecad14ca2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/radio_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/radio_widget.html.php @@ -1,5 +1,5 @@ renderBlock('attributes') ?> + renderBlock('widget_attributes') ?> value="escape($value) ?>" checked="checked" /> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/search_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/search_widget.html.php index d8a773544e..2678205f36 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/search_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/search_widget.html.php @@ -1 +1 @@ -renderBlock('input', array('type' => isset($type) ? $type : "search")) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "search")) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/textarea_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/textarea_widget.html.php index 11a786d69c..a82744b8e0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/textarea_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/textarea_widget.html.php @@ -1 +1 @@ - + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/time_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/time_widget.html.php index 2178974c74..ade5582b66 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/time_widget.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/time_widget.html.php @@ -1,7 +1,7 @@ - renderBlock('input'); ?> + renderBlock('form_widget_primitive'); ?> -
    renderBlock('container_attributes') ?>> +
    renderBlock('widget_container_attributes') ?>> renderBlock('input', array('type' => isset($type) ? $type : "url")) ?> +renderBlock('form_widget_primitive', array('type' => isset($type) ? $type : "url")) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php new file mode 100644 index 0000000000..fe4afa01d2 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php @@ -0,0 +1,9 @@ +id="escape($id) ?>" +name="escape($full_name) ?>" +readonly="readonly" +disabled="disabled" +required="required" +maxlength="escape($max_length) ?>" +pattern="escape($pattern) ?>" + $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?> + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_container_attributes.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_container_attributes.html.php new file mode 100644 index 0000000000..a36cfbbdfc --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_container_attributes.html.php @@ -0,0 +1,2 @@ +id="escape($id) ?>" + $v) { printf('%s="%s" ', $view->escape($k), $view->escape($v)); } ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_errors.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_errors.html.php index 05d8c4aea8..b3e732ef96 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_errors.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_errors.html.php @@ -1,4 +1,26 @@ -hasChildren()): ?> + + +
      + +
    • getMessagePluralization()) { + echo $view['translator']->trans( + $error->getMessageTemplate(), + $error->getMessageParameters(), + 'validators' + ); + } else { + echo $view['translator']->transChoice( + $error->getMessageTemplate(), + $error->getMessagePluralization(), + $error->getMessageParameters(), + 'validators' + ); + }?>
    • + +
    + + 0): ?> @@ -26,26 +48,4 @@ - - -
      - -
    • getMessagePluralization()) { - echo $view['translator']->trans( - $error->getMessageTemplate(), - $error->getMessageParameters(), - 'validators' - ); - } else { - echo $view['translator']->transChoice( - $error->getMessageTemplate(), - $error->getMessagePluralization(), - $error->getMessageParameters(), - 'validators' - ); - }?>
    • - -
    - \ No newline at end of file diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_row.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_row.html.php index 9262a1bae1..3e6d7ba05f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_row.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_row.html.php @@ -3,7 +3,7 @@ label($form, isset($label) ? $label : null) ?> - hasChildren()): ?> + errors($form) ?> widget($form) ?> diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_widget.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_widget.html.php deleted file mode 100644 index 171f1eb40c..0000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_widget.html.php +++ /dev/null @@ -1,8 +0,0 @@ -hasChildren()): ?> -renderBlock('container_attributes') ?>> - renderBlock('form_rows') ?> - rest($form) ?> -
    - -renderBlock('input')?> - diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_widget_complex.html.php b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_widget_complex.html.php new file mode 100644 index 0000000000..9c90f15e58 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/views/FormTable/form_widget_complex.html.php @@ -0,0 +1,4 @@ +renderBlock('widget_container_attributes') ?>> + renderBlock('form_rows') ?> + rest($form) ?> +
    diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Parent/input.html.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Parent/form_widget_primitive.html.php similarity index 60% rename from src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Parent/input.html.php rename to src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Parent/form_widget_primitive.html.php index 64f43ddf6e..6506f9140e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Parent/input.html.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Parent/form_widget_primitive.html.php @@ -1,2 +1,2 @@ -renderBlock('attributes') ?> value="" rel="theme" /> +renderBlock('widget_attributes') ?> value="" rel="theme" /> diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index f6f32633e5..c1849cb7b0 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -25,16 +25,12 @@ CHANGELOG * [BC BREAK] removed EntitiesToArrayTransformer and EntityToIdTransformer. The former has been replaced by CollectionToArrayTransformer in combination with EntityChoiceList, the latter is not required in the core anymore. - * [BC BREAK] renamed - * ArrayToBooleanChoicesTransformer to ChoicesToBooleanArrayTransformer * ScalarToBooleanChoicesTransformer to ChoiceToBooleanArrayTransformer * ArrayToChoicesTransformer to ChoicesToValuesTransformer * ScalarToChoiceTransformer to ChoiceToValueTransformer - - to be consistent with the naming in ChoiceListInterface. - + to be consistent with the naming in ChoiceListInterface. * [BC BREAK] removed FormUtil::toArrayKey() and FormUtil::toArrayKeys(). They were merged into ChoiceList and have no public equivalent anymore. * choice fields now throw a FormException if neither the "choices" nor the @@ -62,8 +58,13 @@ CHANGELOG by event subscribers * simplified CSRF protection and removed the csrf type * deprecated FieldType and merged it into FormType - * [BC BREAK] renamed "field_*" theme blocks to "form_*" and "field_widget" to - "input" + * [BC BREAK] renamed theme blocks + * "field_*" to "form_*" + * "field_widget" to "form_widget_primitive" + * "widget_choice_options" to "choice_widget_options" + * "generic_label" to "form_label" + * added theme blocks "form_widget_complex", "choice_widget_expanded" and + "choice_widget_collapsed" to make theming more modular * ValidatorTypeGuesser now guesses "collection" for array type constraint * added method `guessPattern` to FormTypeGuesserInterface to guess which pattern to use in the HTML5 attribute "pattern" * deprecated method `guessMinLength` in favor of `guessPattern` diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php b/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php index 8ab2c6843d..cd48c2952c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php @@ -46,11 +46,14 @@ class CheckboxType extends AbstractType */ public function getDefaultOptions() { + $emptyData = function (FormInterface $form, $clientData) { + return $clientData; + }; + return array( - 'value' => '1', - 'empty_data' => function (FormInterface $form, $clientData) { - return $clientData; - }, + 'value' => '1', + 'empty_data' => $emptyData, + 'primitive' => true, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php index 1a8ba2d1be..09cacecb52 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php @@ -165,6 +165,10 @@ class ChoiceType extends AbstractType return $options['required'] ? null : ''; }; + $primitive = function (Options $options) { + return !$options['expanded']; + }; + return array( 'multiple' => false, 'expanded' => false, @@ -174,6 +178,7 @@ class ChoiceType extends AbstractType 'empty_data' => $emptyData, 'empty_value' => $emptyValue, 'error_bubbling' => false, + 'primitive' => $primitive, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php index f428054ede..cbd23ea2ad 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php @@ -21,6 +21,7 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransfo use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\ArrayToPartsTransformer; +use Symfony\Component\Form\Options; class DateTimeType extends AbstractType { @@ -130,6 +131,10 @@ class DateTimeType extends AbstractType */ public function getDefaultOptions() { + $primitive = function (Options $options) { + return $options['widget'] === 'single_text'; + }; + return array( 'input' => 'datetime', 'data_timezone' => null, @@ -158,6 +163,7 @@ class DateTimeType extends AbstractType // representation is not \DateTime, but an array, we need to unset // this option. 'data_class' => null, + 'primitive' => $primitive, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index c506714c7f..a6f74c81c5 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -11,18 +11,18 @@ namespace Symfony\Component\Form\Extension\Core\Type; -use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList; - use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormBuilder; use Symfony\Component\Form\Exception\CreationException; use Symfony\Component\Form\FormView; +use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer; use Symfony\Component\Form\ReversedTransformer; +use Symfony\Component\Form\Options; class DateType extends AbstractType { @@ -163,6 +163,10 @@ class DateType extends AbstractType */ public function getDefaultOptions() { + $primitive = function (Options $options) { + return $options['widget'] === 'single_text'; + }; + return array( 'years' => range(date('Y') - 5, date('Y') + 5), 'months' => range(1, 12), @@ -182,6 +186,7 @@ class DateType extends AbstractType // representation is not \DateTime, but an array, we need to unset // this option. 'data_class' => null, + 'primitive' => $primitive, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php index 468c65a0f3..ac44c5d8bd 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php @@ -38,6 +38,16 @@ class FileType extends AbstractType ; } + /** + * {@inheritdoc} + */ + public function getDefaultOptions() + { + return array( + 'primitive' => true, + ); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index ec5870acff..29d5ed240c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -61,6 +61,7 @@ class FormType extends AbstractType ->setAttribute('invalid_message_parameters', $options['invalid_message_parameters']) ->setAttribute('translation_domain', $options['translation_domain']) ->setAttribute('virtual', $options['virtual']) + ->setAttribute('primitive', $options['primitive']) ->setData($options['data']) ->setDataMapper(new PropertyPathMapper($options['data_class'])) ->addEventSubscriber(new ValidationListener()) @@ -125,6 +126,7 @@ class FormType extends AbstractType ->set('label', $form->getAttribute('label')) ->set('multipart', false) ->set('attr', $form->getAttribute('attr')) + ->set('primitive', $form->getAttribute('primitive')) ->set('types', $types) ->set('translation_domain', $form->getAttribute('translation_domain')) ; @@ -201,6 +203,7 @@ class FormType extends AbstractType 'label' => null, 'attr' => array(), 'virtual' => false, + 'primitive' => false, 'invalid_message' => 'This value is not valid.', 'invalid_message_parameters' => array(), 'translation_domain' => 'messages', diff --git a/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php b/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php index 7106625062..2d2c3e61d1 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/HiddenType.php @@ -25,6 +25,7 @@ class HiddenType extends AbstractType 'required' => false, // Pass errors to the parent 'error_bubbling' => true, + 'primitive' => true, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php b/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php index 9beaed5102..286bc4dfbf 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/IntegerType.php @@ -41,6 +41,7 @@ class IntegerType extends AbstractType 'grouping' => false, // Integer cast rounds towards 0, so do the same when displaying fractions 'rounding_mode' => \NumberFormatter::ROUND_DOWN, + 'primitive' => true, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php b/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php index 1f87f3a2a6..cba4f8fe6f 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php @@ -55,6 +55,7 @@ class MoneyType extends AbstractType 'grouping' => false, 'divisor' => 1, 'currency' => 'EUR', + 'primitive' => true, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php b/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php index 21ea17046e..cac3024990 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/NumberType.php @@ -39,6 +39,7 @@ class NumberType extends AbstractType 'precision' => null, 'grouping' => false, 'rounding_mode' => \NumberFormatter::ROUND_HALFUP, + 'primitive' => true, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php index ea6550869a..2ef7449186 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php @@ -33,6 +33,7 @@ class PercentType extends AbstractType return array( 'precision' => 0, 'type' => 'fractional', + 'primitive' => true, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php index 2800311934..dd23e7b38f 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php @@ -27,6 +27,16 @@ class TextType extends AbstractType ; } + /** + * {@inheritdoc} + */ + public function getDefaultOptions() + { + return array( + 'primitive' => true, + ); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index 546220d0ab..7e5892d7d6 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -20,6 +20,7 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransf use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer; use Symfony\Component\Form\FormView; +use Symfony\Component\Form\Options; class TimeType extends AbstractType { @@ -136,6 +137,10 @@ class TimeType extends AbstractType */ public function getDefaultOptions() { + $primitive = function (Options $options) { + return $options['widget'] === 'single_text'; + }; + return array( 'hours' => range(0, 23), 'minutes' => range(0, 59), @@ -155,6 +160,7 @@ class TimeType extends AbstractType // representation is not \DateTime, but an array, we need to unset // this option. 'data_class' => null, + 'primitive' => $primitive, ); } diff --git a/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php index 0781306188..19c9b60bc6 100644 --- a/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php @@ -277,6 +277,19 @@ abstract class AbstractDivLayoutTest extends AbstractLayoutTest ); } + public function testEmptyCollection() + { + $form = $this->factory->createNamed('collection', 'name', array(), array( + 'type' => 'text', + )); + + $this->assertWidgetMatchesXpath($form->createView(), array(), +'/div + [count(./div)=0] +' + ); + } + public function testCollectionRow() { $collection = $this->factory->createNamedBuilder( diff --git a/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php index f6edbce25a..d786cdec01 100644 --- a/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php @@ -170,6 +170,19 @@ abstract class AbstractTableLayoutTest extends AbstractLayoutTest ); } + public function testEmptyCollection() + { + $form = $this->factory->createNamed('collection', 'name', array(), array( + 'type' => 'text', + )); + + $this->assertWidgetMatchesXpath($form->createView(), array(), +'/table + [count(./tr[./td/input])=0] +' + ); + } + public function testForm() { $view = $this->factory->createNamedBuilder('form', 'name') diff --git a/src/Symfony/Component/Form/Tests/FormFactoryTest.php b/src/Symfony/Component/Form/Tests/FormFactoryTest.php index 206fa5eccf..a45395921c 100644 --- a/src/Symfony/Component/Form/Tests/FormFactoryTest.php +++ b/src/Symfony/Component/Form/Tests/FormFactoryTest.php @@ -619,8 +619,8 @@ class FormFactoryTest extends \PHPUnit_Framework_TestCase '"attr", "by_reference", "data", "data_class", "disabled", ' . '"empty_data", "error_bubbling", "error_mapping", "invalid_message", ' . '"invalid_message_parameters", "label", "max_length", "pattern", ' . - '"property_path", "read_only", "required", "translation_domain", ' . - '"trim"' + '"primitive", "property_path", "read_only", "required", ' . + '"translation_domain", "trim"' ); $factory->createNamedBuilder($type, "text", "value", array("invalid" => "opt", "unknown" => "opt")); } @@ -636,8 +636,8 @@ class FormFactoryTest extends \PHPUnit_Framework_TestCase '"by_reference", "data", "data_class", "disabled", "empty_data", ' . '"error_bubbling", "error_mapping", "invalid_message", ' . '"invalid_message_parameters", "label", "max_length", "pattern", ' . - '"property_path", "read_only", "required", "translation_domain", ' . - '"trim"' + '"primitive", "property_path", "read_only", "required", ' . + '"translation_domain", "trim"' ); $factory->createNamedBuilder($type, "text", "value", array("unknown" => "opt")); }