From 7d75e34bf963e99d3a997eebc85df0853cf16993 Mon Sep 17 00:00:00 2001 From: Alain Horner Date: Thu, 4 Apr 2013 16:35:19 +0200 Subject: [PATCH 1/3] let the user choose wether to use the uuid or the path of the node as an array key --- .../ReferenceManyCollectionToArrayTransformer.php | 12 ++++++++++-- Form/Type/PHPCRODMReferenceCollectionType.php | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php b/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php index fba2fad3..1b485bad 100644 --- a/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php +++ b/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php @@ -3,6 +3,7 @@ namespace Doctrine\Bundle\PHPCRBundle\Form\DataTransformer; use Symfony\Component\Form\DataTransformerInterface; +use Joiz\CmsBundle\Document\Show; use Doctrine\ODM\PHPCR\ReferenceManyCollection; use Doctrine\ODM\PHPCR\DocumentManager; @@ -19,15 +20,22 @@ class ReferenceManyCollectionToArrayTransformer implements DataTransformerInterf */ protected $referencedClass; + /** + * @var bool $useUuidAsArrayKey + */ + protected $useUuidAsArrayKey; + /** * @param \Doctrine\ODM\PHPCR\DocumentManager $dm * @param $referencedClass + * @param $useUuidAsArrayKey */ - function __construct(DocumentManager $dm, $referencedClass) + function __construct(DocumentManager $dm, $referencedClass, $useUuidAsArrayKey) { $this->dm = $dm; $this->referencedClass = $referencedClass; + $this->useUuidAsArrayKey = $useUuidAsArrayKey; } /** @@ -38,7 +46,7 @@ public function transform($collection) $arr = array(); foreach ($collection as $item) { - $arr[] = $item->getPath(); + $arr[] = $this->useUuidAsArrayKey ? $item->getNode()->getPropertyValue('jcr:uuid') : $item->getPath(); } return $arr; diff --git a/Form/Type/PHPCRODMReferenceCollectionType.php b/Form/Type/PHPCRODMReferenceCollectionType.php index 8ec75f60..d2c8a7b3 100644 --- a/Form/Type/PHPCRODMReferenceCollectionType.php +++ b/Form/Type/PHPCRODMReferenceCollectionType.php @@ -47,6 +47,11 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) { parent::setDefaultOptions($resolver); $resolver->setRequired((array('referenced_class'))); + $resolver->setOptional(array('use_uuid_as_array_key')); + + $resolver->setDefaults(array( + 'use_uuid_as_array_key' => false, + )); } /** @@ -54,7 +59,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) */ public function buildForm(FormBuilderInterface $builder, array $options) { - $transformer = new ReferenceManyCollectionToArrayTransformer($this->dm, $options['referenced_class']); + $transformer = new ReferenceManyCollectionToArrayTransformer($this->dm, $options['referenced_class'], $options['use_uuid_as_array_key']); $builder->addModelTransformer($transformer); } } From 2cd7261fdd326c8ca5a08e8bb416f02ea1bf336f Mon Sep 17 00:00:00 2001 From: Alain Horner Date: Sat, 6 Apr 2013 10:37:43 +0200 Subject: [PATCH 2/3] adaptions based on github comments --- ...erenceManyCollectionToArrayTransformer.php | 26 +++++++++++++------ Form/Type/PHPCRODMReferenceCollectionType.php | 6 ++--- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php b/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php index 1b485bad..dafeb166 100644 --- a/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php +++ b/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php @@ -3,13 +3,15 @@ namespace Doctrine\Bundle\PHPCRBundle\Form\DataTransformer; use Symfony\Component\Form\DataTransformerInterface; -use Joiz\CmsBundle\Document\Show; use Doctrine\ODM\PHPCR\ReferenceManyCollection; use Doctrine\ODM\PHPCR\DocumentManager; class ReferenceManyCollectionToArrayTransformer implements DataTransformerInterface { + const KEY_PATH = 'path'; + const KEY_UUID = 'uuid'; + /** * @var \Doctrine\ODM\PHPCR\DocumentManager $dm */ @@ -21,21 +23,29 @@ class ReferenceManyCollectionToArrayTransformer implements DataTransformerInterf protected $referencedClass; /** - * @var bool $useUuidAsArrayKey + * @var string $key */ - protected $useUuidAsArrayKey; - + protected $key; /** * @param \Doctrine\ODM\PHPCR\DocumentManager $dm * @param $referencedClass - * @param $useUuidAsArrayKey + * @param string $key + * @throws \InvalidArgumentException */ - function __construct(DocumentManager $dm, $referencedClass, $useUuidAsArrayKey) + function __construct(DocumentManager $dm, $referencedClass, $key) { $this->dm = $dm; $this->referencedClass = $referencedClass; - $this->useUuidAsArrayKey = $useUuidAsArrayKey; + + if (!($key === self::KEY_UUID || $key === self::KEY_PATH)) { + throw new \InvalidArgumentException(sprintf( + 'Key must be either KEY_UUID or KEY_PATH. Received "%s"', + $key + )); + } + + $this->key = $key; } /** @@ -46,7 +56,7 @@ public function transform($collection) $arr = array(); foreach ($collection as $item) { - $arr[] = $this->useUuidAsArrayKey ? $item->getNode()->getPropertyValue('jcr:uuid') : $item->getPath(); + $arr[] = ($this->key === self::KEY_UUID) ? $item->getNode()->getIdentifier() : $item->getPath(); } return $arr; diff --git a/Form/Type/PHPCRODMReferenceCollectionType.php b/Form/Type/PHPCRODMReferenceCollectionType.php index d2c8a7b3..bbfb7bbf 100644 --- a/Form/Type/PHPCRODMReferenceCollectionType.php +++ b/Form/Type/PHPCRODMReferenceCollectionType.php @@ -47,10 +47,10 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) { parent::setDefaultOptions($resolver); $resolver->setRequired((array('referenced_class'))); - $resolver->setOptional(array('use_uuid_as_array_key')); + $resolver->setOptional(array('key')); $resolver->setDefaults(array( - 'use_uuid_as_array_key' => false, + 'key' => ReferenceManyCollectionToArrayTransformer::KEY_PATH, )); } @@ -59,7 +59,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) */ public function buildForm(FormBuilderInterface $builder, array $options) { - $transformer = new ReferenceManyCollectionToArrayTransformer($this->dm, $options['referenced_class'], $options['use_uuid_as_array_key']); + $transformer = new ReferenceManyCollectionToArrayTransformer($this->dm, $options['referenced_class'], $options['key']); $builder->addModelTransformer($transformer); } } From e82be2aa96f64a85823c9b47a65969a8b01e1270 Mon Sep 17 00:00:00 2001 From: Alain Horner Date: Sat, 6 Apr 2013 11:36:24 +0200 Subject: [PATCH 3/3] made uuid the default value --- .../ReferenceManyCollectionToArrayTransformer.php | 3 +-- Form/Type/PHPCRODMReferenceCollectionType.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php b/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php index dafeb166..327306f5 100644 --- a/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php +++ b/Form/DataTransformer/ReferenceManyCollectionToArrayTransformer.php @@ -8,7 +8,6 @@ class ReferenceManyCollectionToArrayTransformer implements DataTransformerInterface { - const KEY_PATH = 'path'; const KEY_UUID = 'uuid'; @@ -33,7 +32,7 @@ class ReferenceManyCollectionToArrayTransformer implements DataTransformerInterf * @param string $key * @throws \InvalidArgumentException */ - function __construct(DocumentManager $dm, $referencedClass, $key) + function __construct(DocumentManager $dm, $referencedClass, $key = self::KEY_UUID) { $this->dm = $dm; $this->referencedClass = $referencedClass; diff --git a/Form/Type/PHPCRODMReferenceCollectionType.php b/Form/Type/PHPCRODMReferenceCollectionType.php index bbfb7bbf..a8116d4e 100644 --- a/Form/Type/PHPCRODMReferenceCollectionType.php +++ b/Form/Type/PHPCRODMReferenceCollectionType.php @@ -50,7 +50,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) $resolver->setOptional(array('key')); $resolver->setDefaults(array( - 'key' => ReferenceManyCollectionToArrayTransformer::KEY_PATH, + 'key' => ReferenceManyCollectionToArrayTransformer::KEY_UUID, )); }