Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[Form] Make bind() method bind while fields are being added#4548

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Closed

Conversation

@Burgov
Copy link
Contributor

Bug fix: no
Feature addition: yes
Backwards compatibility break: no
Symfony2 tests pass: yes
Fixes the following tickets:#3767
Todo: See Cons

This PRfixes#3767 and could probably replace#3768

The method used in this PR has it's pros and it's cons compared to#3768:

Pro:

  • The listeners for both POST_SET_DATA and POST_BIND can now be identical, allowing for if's to be removed and possibly prevent code duplication
  • No new event is necessary (as opposed to[Form] added ChildDataEvent #3768) and other code updates are only minor

Con:

  • It is no longer possible to update the view data in the event. Imagine the field 'australian' being removed by the POST_BIND listener, you'd want to remove 'australian' from the view data in order to prevent a "should not contain extra fields" error. This is the point that'd need work
  • It's still possible to trigger an endless loop if one listener adds a field based on a value, and another adds it again. Perhaps a maximum of times the loop is run should be configured for these cases

@travisbot
Copy link

This pull requestpasses (merged 9b1472f7 into0995b1f).

@travisbot
Copy link

This pull requestpasses (merged084e2e2 into0995b1f).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

this does not follow the Symfony CS. You should use aconst for each constant

@travisbot
Copy link

This pull requestpasses (mergedbc9dd05 into0995b1f).

@webmozart
Copy link
Contributor

Thank you for the PR! This won't make it into 2.1 anymore, but I'll look at your solution after that.

@stof
Copy link
Member

@bschussek ping

@webmozart
Copy link
Contributor

I think this should be solved in a more elaborate fashion (see#5807).

fabpot added a commit that referenced this pull requestAug 23, 2013
This PR was merged into the 2.2 branch.Discussion----------[Form][2.2] Fixed Form::submit() to react to dynamic form modifications| Q             | A| ------------- | ---| Bug fix?      | yes| New feature?  | no| BC breaks?    | no| Deprecations? | no| Tests pass?   | yes| Fixed tickets | -| License       | MIT| Doc PR        | -ref#3767,#3768,#4548,#8748cc@BurgovThis PR ensures that fields that are added during the submission process of a form are submitted as well. For example:```php$builder = $this->createFormBuilder()    ->add('country', 'choice', ...)    ->getForm();$builder->get('country')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {    $form = $event->getForm()->getParent();    $country = $event->getForm()->getData();    $form->add('province', 'choice', /* ... something with $country ... */);});```Currently, the field "province" will not be submitted, because the submission loop uses `foreach`, which ignores changes in the underyling array.Additionally, this PR ensures that `setData()` is called on *every* element of a form (except those inheriting their parent data) when `setData()` is called on the root element (i.e., during initialization). Currently, when some of the intermediate nodes (e.g. embedded forms) are submitted with an empty value, `setData()` won't be called on the nodes below (i.e. the fields of the embedded form) until `get*Data()` is called on them. If `getData()` is *not* called before `createView()`, any effects of `*_DATA` event listeners attached to those fields will not be visible in the view.Commits-------cd27e1f [Form] Extracted ReferencingArrayIterator out of VirtualFormAwareIteratorccaaedf [Form] PropertyPathMapper::mapDataToForms() *always* calls setData() on every child to ensure that all *_DATA events were fired when the initialization phase is over (except for virtual forms)19b483f [Form] Removed superfluous reset() call00bc270 [Form] Fixed: submit() reacts to dynamic modifications of the form children
fabpot added a commit that referenced this pull requestAug 23, 2013
This PR was merged into the 2.3 branch.Discussion----------[Form][2.3] Fixed Form::submit() and Form::setData() to react to dynamic form modifications| Q             | A| ------------- | ---| Bug fix?      | yes| New feature?  | no| BC breaks?    | no| Deprecations? | no| Tests pass?   | yes| Fixed tickets | -| License       | MIT| Doc PR        | -ref#3767,#3768,#4548,#8748cc@BurgovThis PR ensures that fields that are added during the submission process of a form are submitted as well. For example:```php$builder = $this->createFormBuilder()    ->add('country', 'choice', ...)    ->getForm();$builder->get('country')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {    $form = $event->getForm()->getParent();    $country = $event->getForm()->getData();    $form->add('province', 'choice', /* ... something with $country ... */);});```Currently, the field "province" will not be submitted, because the submission loop uses `foreach`, which ignores changes in the underyling array.Contrary to#8827 (for 2.2), this PR also allows dynamic modifications during `setData()`:```php$builder = $this->createFormBuilder()    ->add('country', 'choice', ...)    ->getForm();$builder->get('country')->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {    $form = $event->getForm()->getParent();    $country = $event->getData();    $form->add('province', 'choice', /* ... something with $country ... */);});```For 2.2, this fix is not possible, because it would require changing the signature `DataMapperInterface::mapDataToForms($data, array $forms)` to `DataMapperInterface::mapDataToForms($data, array &$forms)`, which would be a BC break. For 2.3, this change is not necessary (instead of an array we now pass an iterator, which is passed by reference anyway).Additionally, this PR ensures that `setData()` is called on *every* element of a form (except those inheriting their parent data) when `setData()` is called on the root element (i.e., during initialization). Currently, when some of the intermediate nodes (e.g. embedded forms) are submitted with an empty value, `setData()` won't be called on the nodes below (i.e. the fields of the embedded form) until `get*Data()` is called on them. If `getData()` is *not* called before `createView()`, any effects of `*_DATA` event listeners attached to those fields will not be visible in the view.Commits-------7a34d96 Merge branch 'form-submit-2.2' into form-submit-2.3cd27e1f [Form] Extracted ReferencingArrayIterator out of VirtualFormAwareIterator3cb8a80 [Form] Added a test that ensures that setData() reacts to dynamic modifications of a form's children07d14e5 [Form] Removed exception in Button::setData(): setData() is now always called for all elements in the form tree during the initialization of the treeb9a3770 [Form] Removed call to deprecated method878e27c Merge branch 'form-submit-2.2' into form-submit-2.3ccaaedf [Form] PropertyPathMapper::mapDataToForms() *always* calls setData() on every child to ensure that all *_DATA events were fired when the initialization phase is over (except for virtual forms)19b483f [Form] Removed superfluous reset() call5d60a4f Merge branch 'form-submit-2.2' into form-submit-2.300bc270 [Form] Fixed: submit() reacts to dynamic modifications of the form children
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

No reviews

Assignees

No one assigned

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

[Form] Make dynamic modification of children possible *after* other children have been bound

4 participants

@Burgov@travisbot@webmozart@stof

[8]ページ先頭

©2009-2025 Movatter.jp