12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Form\DataMapper;
- use Symfony\Component\Form\FormInterface;
- use Symfony\Component\Form\VirtualFormAwareIterator;
- use Symfony\Component\Form\Exception\FormException;
- class PropertyPathMapper implements DataMapperInterface
- {
- /**
- * Stores the class that the data of this form must be instances of
- * @var string
- */
- private $dataClass;
- public function __construct($dataClass = null)
- {
- $this->dataClass = $dataClass;
- }
- public function mapDataToForms($data, array $forms)
- {
- if (!empty($data) && !is_array($data) && !is_object($data)) {
- throw new \InvalidArgumentException(sprintf('Expected argument of type object or array, %s given', gettype($data)));
- }
- if (!empty($data)) {
- if ($this->dataClass && !$data instanceof $this->dataClass) {
- throw new FormException(sprintf('Form data should be instance of %s', $this->dataClass));
- }
- $iterator = new VirtualFormAwareIterator($forms);
- $iterator = new \RecursiveIteratorIterator($iterator);
- foreach ($iterator as $form) {
- $this->mapDataToForm($data, $form);
- }
- }
- }
- public function mapDataToForm($data, FormInterface $form)
- {
- if (!empty($data)) {
- if ($form->getAttribute('property_path') !== null) {
- $form->setData($form->getAttribute('property_path')->getValue($data));
- }
- }
- }
- public function mapFormsToData(array $forms, &$data)
- {
- $iterator = new VirtualFormAwareIterator($forms);
- $iterator = new \RecursiveIteratorIterator($iterator);
- foreach ($iterator as $form) {
- $this->mapFormToData($form, $data);
- }
- }
- public function mapFormToData(FormInterface $form, &$data)
- {
- if ($form->getAttribute('property_path') !== null && $form->isSynchronized()) {
- $propertyPath = $form->getAttribute('property_path');
- // If the data is identical to the value in $data, we are
- // dealing with a reference
- $isReference = $form->getData() === $propertyPath->getValue($data);
- $byReference = $form->getAttribute('by_reference');
- if (!(is_object($data) && $isReference && $byReference)) {
- $propertyPath->setValue($data, $form->getData());
- }
- }
- }
- }
|