Commit Graph

16990 Commits

Author SHA1 Message Date
Bernhard Schussek
8be29031b2 bug #14162 [FrameworkBundle][TwigBridge] Fixed Composer dependencies (webmozart)
This PR was merged into the 2.7 branch.

Discussion
----------

[FrameworkBundle][TwigBridge] Fixed Composer dependencies

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

The tests were broken by #14050. This PR fixes that.

Commits
-------

7523f68 [TwigBridge] Pushed symfony/form dependency from ~2.6 to ~2.7
2b5efbb [FrameworkBundle] Pushed symfony/form dependency from ~2.6 to to ~2.7
2015-04-03 17:29:35 +02:00
Nicolas Grekas
0b39ce2315 Merge branch '2.6' into 2.7
* 2.6: (24 commits)
  [HttpKernel] Embed the original exception as previous to bounced exceptions
  [Enhancement] netbeans - force interactive shell when limited detection
  [FrameworkBundle] fixes displaying of deprecation notices.
  Revert "Added missing changelog entry"
  [Debug] Tweak docblocks
  [Debug] Rework a bit the PHP doc
  Added missing changelog entry
  [StringUtil] Fixed singularification of 'movies'
  [Debug] Renamed "context" key to "scope_vars" to avoid any ambiguity
  Fix some phpdocs for Twig extensions & templating helpers
  [Debug] Made code in ErrorHandler easier to read
  Use specialized config methods instead of the generic ifTrue() method
  Fix the AJAX profiling
  bumped Symfony version to 2.6.7
  updated VERSION for 2.6.6
  updated CHANGELOG for 2.6.6
  Safe escaping of fragments for eval()
  bumped Symfony version to 2.3.28
  updated VERSION for 2.3.27
  update CONTRIBUTORS for 2.3.27
  ...

Conflicts:
	src/Symfony/Component/Debug/ErrorHandler.php
	src/Symfony/Component/HttpKernel/Kernel.php
2015-04-03 17:24:01 +02:00
Nicolas Grekas
7adba99975 Merge branch '2.3' into 2.6
* 2.3:
  [HttpKernel] Embed the original exception as previous to bounced exceptions
  [Enhancement] netbeans - force interactive shell when limited detection
  [StringUtil] Fixed singularification of 'movies'
  Fix some phpdocs for Twig extensions & templating helpers
  Use specialized config methods instead of the generic ifTrue() method
  [DoctrineBridge] Add missing variable declaration in testcase

Conflicts:
	src/Symfony/Component/Console/Application.php
2015-04-03 17:17:51 +02:00
Nicolas Grekas
40ab7ef349 [HttpKernel] Embed the original exception as previous to bounced exceptions 2015-04-03 17:11:39 +02:00
Fabien Potencier
3c2c5c90a0 feature #14192 [HttpKernel] Embed the original exception as previous to bounced exceptions (nicolas-grekas)
This PR was merged into the 2.7 branch.

Discussion
----------

[HttpKernel] Embed the original exception as previous to bounced exceptions

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #14073
| License       | MIT
| Doc PR        | -

Commits
-------

bb020f4 [HttpKernel] Embed the original exception as previous to bounced exceptions
2015-04-03 17:03:03 +02:00
Fabien Potencier
d84f03d982 feature #13626 [WebProfilerBundle] Added feedback about the current symfony version (WouterJ)
This PR was merged into the 2.7 branch.

Discussion
----------

[WebProfilerBundle] Added feedback about the current symfony version

Description
---

This PR adds some visual and textual information about the Symfony version that is currently used. It'll indicate when the used version has reached eom or eol. I hope this will make people more aware of the fact that they should update (as I've seen quite some people using completely outdated Symfony versions).

Screenshot
---

![sf-toolbar-version-info](https://cloud.githubusercontent.com/assets/749025/6099512/da59c99e-affa-11e4-8093-173857901769.png)

PR Information
---

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes (didn't test though)
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Commits
-------

a4551f9 Added feedback about the current symfony version
2015-04-03 16:49:46 +02:00
WouterJ
a4551f97f4 Added feedback about the current symfony version 2015-04-03 16:47:47 +02:00
Fabien Potencier
7dca9a9e5a bug #14102 [Enhancement] netbeans - force interactive shell when limited detection (cordoval)
This PR was squashed before being merged into the 2.3 branch (closes #14102).

Discussion
----------

[Enhancement] netbeans - force interactive shell when limited detection

|Q            |A  |
|---          |---|
|Bug Fix?     |y  |
|New Feature? |n  |
|BC Breaks?   |n  |
|Deprecations?|n  |
|Tests Pass?  |y  |
|Fixed Tickets|  #9946 |
|License      |MIT|
|Doc PR       |   |

Commits
-------

02cda05 [Enhancement] netbeans - force interactive shell when limited detection
2015-04-03 15:07:12 +02:00
Luis Cordova
02cda0595c [Enhancement] netbeans - force interactive shell when limited detection 2015-04-03 15:07:10 +02:00
Fabien Potencier
a80856cfe5 feature #13554 [TwigBundle] make date formats and number formats configurable (xabbuh)
This PR was merged into the 2.7 branch.

Discussion
----------

[TwigBundle] make date formats and number formats configurable

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #13552
| License       | MIT
| Doc PR        | TODO

This adds new Twig configuration options that make it possible to
configure the format of both numbers and dates as well as timezones
without the need to write custom code.

For example, using the new configuration options can look like this:

```yaml
twig:
    date:
        format: d.m.Y, H:i:s
        interval_format: %%d days
        timezone: Europe/Berlin
    number_format:
        decimals: 2
        decimal_point: ,
        thousands_separator: .
```

Commits
-------

e9bc23b make date formats and number formats configurable
2015-04-03 14:26:27 +02:00
Fabien Potencier
418d0121bc feature #14196 Tweaked some console command styles (javiereguiluz)
This PR was squashed before being merged into the 2.7 branch (closes #14196).

Discussion
----------

Tweaked some console command styles

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #14174
| License       | MIT
| Doc PR        | -

As discussed, after updating the first console commands to the new style guide, we were going to introduce the needed tweaks. This PR is the first one with those tweaks.

### Tables

Headers now are displayed in the usual green color used frequently by Symfony commands:

![table_header](https://cloud.githubusercontent.com/assets/73419/6980286/a126e8cc-d9ef-11e4-8d1e-9a5be21564eb.png)

### Command tiles and section titles

I see these titles in a beautiful blue color ... but lots of people use color schemes which make them almost unreadable. Now they use the yellow color frequently used by Symfony commands:

![command_section_titles](https://cloud.githubusercontent.com/assets/73419/6980292/b499627c-d9ef-11e4-9940-e134ee0eb02f.png)

### Listings

Elements in a listing no longer add an extra blank line. See #14174 for the rationale.

Commits
-------

dcf1801 Tweaked some console command styles
2015-04-03 14:18:07 +02:00
Javier Eguiluz
dcf1801901 Tweaked some console command styles 2015-04-03 14:18:04 +02:00
Abdellatif Ait boudad
aae98a924b bug #14195 [Translation][Profiler] fixed infiinite loop when collect msg from fallback (aitboudad)
This PR was merged into the 2.7 branch.

Discussion
----------

[Translation][Profiler] fixed infiinite loop when collect msg from fallback

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Fixed tickets  | ~
| Tests pass?   | yes
| License       | MIT

Commits
-------

59f2172 [Translation][Profiler] fixed infiinite loop when collect msg from fallback.
2015-04-03 12:34:33 +01:00
Nicolas Grekas
8e74cfaf81 feature #14181 [Debug] Updated the default log level when a PHP error occurs (lyrixx)
This PR was merged into the 2.7 branch.

Discussion
----------

[Debug] Updated the default log level when a PHP error occurs

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | ~
| License       | MIT
| Doc PR        | ~

According to https://github.com/Seldaek/monolog#log-levels
the level `NOTICE` means "Normal but significant events".

So when a PHP notice occurs, it's not a "normal" event,
but an error.

That's why all PHP errors should use at least the `WARNING` error
level.

Commits
-------

d2f85ed [Debug] Updated the default log level when a PHP error occurs
2015-04-03 13:33:04 +02:00
Hugo Hamon
ab370409fe [FrameworkBundle] fixes displaying of deprecation notices. 2015-04-03 10:50:41 +02:00
Christian Flothmann
e9bc23b54a make date formats and number formats configurable
This adds new Twig configuration options that make it possible to
configure the format of both numbers and dates as well as timezones
without the need to write custom code.

For example, using the new configuration options can look like this:

```yaml
twig:
    date:
        format: d.m.Y, H:i:s
        interval_format: %%d days
        timezone: Europe/Berlin
    number_format:
        decimals: 2
        decimal_point: ,
        thousands_separator: .
```
2015-04-03 10:30:44 +02:00
Nicolas Grekas
24b780e1ed Revert "Added missing changelog entry"
This reverts commit 9d0c0aeeba.
2015-04-03 09:54:01 +02:00
Abdellatif Ait boudad
59f2172c01 [Translation][Profiler] fixed infiinite loop when collect msg from fallback. 2015-04-03 08:53:14 +01:00
Nicolas Grekas
dc282ec679 [Debug] Tweak docblocks 2015-04-03 09:48:36 +02:00
Grégoire Pineau
126514f2a3 [Debug] Rework a bit the PHP doc 2015-04-03 09:46:34 +02:00
Diego Saint Esteben
9d0c0aeeba Added missing changelog entry 2015-04-03 09:46:34 +02:00
Abdellatif Ait boudad
ce3b8fd91d feature #13942 [2.7][Translation] generate translation cache at warmup (xavierleune)
This PR was merged into the 2.7 branch.

Discussion
----------

[2.7][Translation] generate translation cache at warmup

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #13919
| License       | MIT
| Doc PR        | NA

This PR uses the parameters "locale" and "fallback_locales" to generate the catalogues at warmup, avoiding the creation of files at runtime.

Commits
-------

94d3876 FIX #13919 added TranslationsCacheWarmer to generate catalogues at warmup
2015-04-03 07:31:25 +01:00
Nicolas Grekas
bb020f4a72 [HttpKernel] Embed the original exception as previous to bounced exceptions 2015-04-03 08:20:10 +02:00
Gerben Wijnja
6f5e95b762 [StringUtil] Fixed singularification of 'movies'
The word 'movies' was singularified to 'movy'. There seem to be only two
words ending in 'ovies', which are 'movies' and 'anchovies'. The singular
of the latter is 'anchovy'. All other words ending in 'vies' singularify to
'vy', so the word 'movies' is an exception to the general rule.
2015-04-03 01:10:26 +02:00
Grégoire Pineau
b56a804f93 [Debug] Renamed "context" key to "scope_vars" to avoid any ambiguity 2015-04-02 21:18:30 +02:00
Grégoire Pineau
d2f85ed5f7 [Debug] Updated the default log level when a PHP error occurs
According to https://github.com/Seldaek/monolog#log-levels
the level `NOTICE` means "Normal but significant events".

So when a PHP notice occurs, it's not a "normal" event,
but an error.

That's why all PHP errors should use at lease the `WARNING` error
level.
2015-04-02 16:54:44 +02:00
Abdellatif Ait boudad
8f72338513 [FrameworkBundle] Move lint commands to lint namespace. 2015-04-02 15:30:12 +01:00
Fabien Potencier
36d62eea7d minor #14134 [CS] Fix some phpdocs for Twig extensions & templating helpers (stloyd)
This PR was merged into the 2.3 branch.

Discussion
----------

[CS] Fix some phpdocs for Twig extensions & templating helpers

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| Tests pass?   | yes
| License       | MIT

Commits
-------

a95f7f3 Fix some phpdocs for Twig extensions & templating helpers
2015-04-02 16:01:08 +02:00
stloyd
a95f7f38af Fix some phpdocs for Twig extensions & templating helpers 2015-04-02 15:55:01 +02:00
Fabien Potencier
d9d43a80bd minor #14128 [DoctrineBridge] Add missing variable declaration in testcase (stloyd)
This PR was merged into the 2.3 branch.

Discussion
----------

[DoctrineBridge] Add missing variable declaration in testcase

| Q             | A
| ------------- | ---
| Bug fix?      | yes?
| New feature?  | no
| BC breaks?    | no
| Tests pass?   | yes
| License       | MIT

Commits
-------

52885f0 [DoctrineBridge] Add missing variable declaration in testcase
2015-04-02 15:50:49 +02:00
Grégoire Pineau
15ef182b99 [Debug] Made code in ErrorHandler easier to read 2015-04-02 15:40:50 +02:00
Fabien Potencier
4b19daf1b0 feature #14052 [FrameworkBundle] added a protected shortcut getParameter() method in the base Controller class. (hhamon)
This PR was merged into the 2.7 branch.

Discussion
----------

[FrameworkBundle] added a protected shortcut getParameter() method in the base Controller class.

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | ~
| License       | MIT
| Doc PR        | ~

Commits
-------

5d96f4d [FrameworkBundle] added a protected shortcut getParameter() method in the base Controller class.
2015-04-02 15:28:00 +02:00
Fabien Potencier
96d83a7184 minor #14133 Remove dead code from FrameworkExtension & LogoutUrlHelper (stloyd)
This PR was merged into the 2.7 branch.

Discussion
----------

Remove dead code from FrameworkExtension & LogoutUrlHelper

| Q             | A
| ------------- | ---
| Bug fix?      | yes?
| New feature?  | no
| BC breaks?    | no
| Tests pass?   | yes
| License       | MIT

Commits
-------

13ec9ff Remove dead code from FrameworkExtension & LogoutUrlHelper
2015-04-02 14:36:16 +02:00
Javier Eguiluz
dbd02b0871 Use specialized config methods instead of the generic ifTrue() method 2015-04-02 13:05:24 +02:00
Christophe Coevoet
9d6c0b1c30 Fix the AJAX profiling
The fix for IE8 which does not have the addEventListener method on
XMLHttpRequest broke the feature for modern browsers because it was
checking the existence on the wrong object. It is a method on the
instance, not on the "class", and so should be checked on the prototype.
2015-04-02 11:50:50 +02:00
Fabien Potencier
de02c5f962 bumped Symfony version to 2.6.7 2015-04-01 20:51:37 +02:00
Fabien Potencier
48c9e835a8 updated VERSION for 2.6.6 2015-04-01 18:55:26 +02:00
Nicolas Grekas
06f92fc2d5 Safe escaping of fragments for eval() 2015-04-01 18:53:45 +02:00
Fabien Potencier
ec2cb961cc Merge branch '2.3' into 2.6
* 2.3:
  bumped Symfony version to 2.3.28
  updated VERSION for 2.3.27
  update CONTRIBUTORS for 2.3.27
  updated CHANGELOG for 2.3.27
  isFromTrustedProxy to confirm request came from a trusted proxy.
  Safe escaping of fragments for eval()

Conflicts:
	src/Symfony/Component/HttpFoundation/Request.php
	src/Symfony/Component/HttpKernel/HttpCache/Esi.php
	src/Symfony/Component/HttpKernel/Kernel.php
2015-04-01 18:50:12 +02:00
Fabien Potencier
feb48c26b3 bumped Symfony version to 2.3.28 2015-04-01 17:29:10 +02:00
Fabien Potencier
ce4aab1508 updated VERSION for 2.3.27 2015-04-01 16:28:26 +02:00
Fabien Potencier
3594ea4ec1 security #14167 n/a (nicolas-grekas)
This PR was merged into the 2.3 branch.

Discussion
----------

n/a

Commits
-------

195c57e Safe escaping of fragments for eval()
2015-04-01 16:19:30 +02:00
James Gilliland
6c73f0ce93 isFromTrustedProxy to confirm request came from a trusted proxy. 2015-04-01 16:16:10 +02:00
Nicolas Grekas
195c57e1f5 Safe escaping of fragments for eval() 2015-04-01 16:15:02 +02:00
Diego Saint Esteben
17d265a526 Added missing changelog entry 2015-04-01 10:08:53 -03:00
Nicolas Grekas
5188cfecc5 feature #14080 [VarDumper] Add casters for Reflection* classes (nicolas-grekas)
This PR was merged into the 2.7 branch.

Discussion
----------

[VarDumper] Add casters for Reflection* classes

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Will need a rebase on top of #14079 and #14077 to be mergeable/green.

Commits
-------

64d6e76 [VarDumper] Add casters for Reflection* classes
2015-04-01 13:40:31 +02:00
Bernhard Schussek
7523f685eb [TwigBridge] Pushed symfony/form dependency from ~2.6 to ~2.7 2015-04-01 13:22:40 +02:00
Bernhard Schussek
2b5efbbd35 [FrameworkBundle] Pushed symfony/form dependency from ~2.6 to to ~2.7 2015-04-01 13:20:04 +02:00
Bernhard Schussek
776796435e feature #14050 [Form] Refactored choice lists to support dynamic label, value, index and attribute generation (webmozart)
This PR was merged into the 2.7 branch.

Discussion
----------

[Form] Refactored choice lists to support dynamic label, value, index and attribute generation

This is a rebase of #12148 on the 2.7 branch.

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | yes
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | #4067, #5494, #3836, #8658, #12148
| License       | MIT
| Doc PR        | TODO

I implemented the additional options "choice_label", "choice_name", "choice_value", "choice_attr", "group_by" and "choices_as_values" for ChoiceType. Additionally the "preferred_choices" option was updated to accept callables and property paths.

The "choices_as_values" option will be removed in Symfony 3.0, where the choices will be passed in the values of the "choices" option by default. The reason for that is that, right now, choices are limited to strings and integers (i.e. valid array keys). When we flip the array, we remove that limitation. Since choice labels are always strings, we can also always use them as array keys:

```php
// Not possible currently, but possible with "flip_choices"
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
));
```

All the features described here obviously also apply to subtypes of "choice", such as "entity".

**choice_label**

Returns the label for each choice. Can be a callable (which receives the choice as first and the key of the "choices" array as second argument) or a property path.

If `null`, the keys of the "choices" array are used as labels.

```php
// callable
$builder->add('attending', 'choice', array(
    'choices' => array(
        'yes' => true,
        'no' => false,
        'maybe' => null,
    ),
    'choices_as_values' => true,
    'choice_label' => function ($choice, $key) {
        return 'form.choice.'.$key;
    },
));

// property path
$builder->add('attending', 'choice', array(
    'choices' => array(
        Status::getInstance(Status::YES),
        Status::getInstance(Status::NO),
        Status::getInstance(Status::MAYBE),
    ),
    'choices_as_values' => true,
    'choice_label' => 'displayName',
));
```

**choice_name**

Returns the form name for each choice. That name is used as name of the checkbox/radio form for this choice. It is also used as index of the choice views in the template. Can be a callable (like for "choice_label") or a property path.

The generated names must be valid form names, i.e. contain alpha-numeric symbols, underscores, hyphens and colons only. They must start with an alpha-numeric symbol or an underscore.

If `null`, an incrementing integer is used as name.

```php
// callable
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'choice_name' => function ($choice, $key) {
        // use the labels as names
        return strtolower($key);
    },
));

// property path
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => Status::getInstance(Status::YES),
        'No' => Status::getInstance(Status::NO),
        'Maybe' => Status::getInstance(Status::MAYBE),
    ),
    'choices_as_values' => true,
    'choice_name' => 'value',
));
```

**choice_value**

Returns the string value for each choice. This value is displayed in the "value" attributes and submitted in the POST/PUT requests. Can be a callable (like for "choice_label") or a property path.

If `null`, an incrementing integer is used as value.

```php
// callable
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'choice_value' => function ($choice, $key) {
        if (null === $choice) {
            return 'null';
        }

        if (true === $choice) {
            return 'true';
        }

        return 'false';
    },
));

// property path
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => Status::getInstance(Status::YES),
        'No' => Status::getInstance(Status::NO),
        'Maybe' => Status::getInstance(Status::MAYBE),
    ),
    'choices_as_values' => true,
    'choice_value' => 'value',
));
```

**choice_attr**

Returns the additional HTML attributes for choices. Can be an array, a callable (like for "choice_label") or a property path.
If an array, the key of the "choices" array must be used as keys.

```php
// array
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'choice_attr' => array(
        'Maybe' => array('class' => 'greyed-out'),
    ),
));

// callable
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'choice_attr' => function ($choice, $key) {
        if (null === $choice) {
            return array('class' => 'greyed-out');
        }
    },
));

// property path
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => Status::getInstance(Status::YES),
        'No' => Status::getInstance(Status::NO),
        'Maybe' => Status::getInstance(Status::MAYBE),
    ),
    'choices_as_values' => true,
    'choice_value' => 'htmlAttributes',
));
```

**group_by**

Returns the grouping used for the choices. Can be an array/Traversable, a callable (like for "choice_label") or a property path.

The return values of the callable/property path are used as group labels. If `null` is returned, a choice is not grouped.

If `null`, the structure of the "choices" array is used to construct the groups.

```php
// default
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Decided' => array(
            'Yes' => true,
            'No' => false,
        ),
        'Undecided' => array(
            'Maybe' => null,
        ),
    ),
    'choices_as_values' => true,
));

// callable
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'group_by' => function ($choice, $key) {
        if (null === $choice) {
            return 'Undecided';
        }

        return 'Decided';
    },
));

// property path
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => Status::getInstance(Status::YES),
        'No' => Status::getInstance(Status::NO),
        'Maybe' => Status::getInstance(Status::MAYBE),
    ),
    'choices_as_values' => true,
    'group_by' => 'type',
));
```

**preferred_choices**

Returns the preferred choices. Can be an array/Traversable, a callable (like for "choice_label") or a property path.

```php
// array
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'preferred_choices' => array(true),
));

// callable
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'preferred_choices' => function ($choice, $key) {
        return true === $choice;
    },
));

// property path
$builder->add('attending', 'choice', array(
    'choices' => array(
        'Yes' => Status::getInstance(Status::YES),
        'No' => Status::getInstance(Status::NO),
        'Maybe' => Status::getInstance(Status::MAYBE),
    ),
    'choices_as_values' => true,
    'preferred_choices' => 'preferred',
));
```

**Technical Changes**

To properly implement all this, the old `ChoiceListInterface` class was deprecated and replaced by a new, slimmer one. The creation of choice views is now separated from choice lists. Hence a lot of logic is not executed anymore when processing (but not displaying) a form.

Internally, a `ChoiceListFactoryInterface` implementation is used to construct choice lists and choice views. Two decorators exist for this class:

* `CachingFactoryDecorator`: caches choice lists/views so that multiple fields displaying the same choices (e.g. in collection fields) use the same choice list/view
* `PropertyAccessDecorator`: adds support for property paths to a factory

**BC Breaks**

The option "choice_list" of ChoiceType now contains a `Symfony\Component\Form\ChoiceList\ChoiceListInterface` instance, which is a super-type of the deprecated `ChoiceListInterface`.

**Todos**

- [ ] Adapt CHANGELOGs
- [ ] Adapt UPGRADE files
- [ ] symfony/symfony-docs issue/PR

Commits
-------

94d18e9 [Form] Fixed CS
7e0960d [Form] Fixed failing layout tests
1d89922 [Form] Fixed tests using legacy functionality
d6179c8 [Form] Fixed PR comments
26eba76 [Form] Fixed regression: Choices are compared by their values if a value callback is given
a289deb [Form] Fixed new ArrayChoiceList to compare choices by their values, if enabled
e6739bf [DoctrineBridge] DoctrineType now respects the "query_builder" option when caching the choice loader
3846b37 [DoctrineBridge] Fixed: don't cache choice lists if query builders are constructed dynamically
03efce1 [Form] Refactored choice lists to support dynamic label, value, index and attribute generation
2015-04-01 12:04:55 +02:00
Bernhard Schussek
94d18e961c [Form] Fixed CS 2015-04-01 11:48:14 +02:00