diff --git a/Form/DataTransformer/ModelToIdTransformer.php b/Form/DataTransformer/ModelToIdTransformer.php new file mode 100644 index 0000000..9885273 --- /dev/null +++ b/Form/DataTransformer/ModelToIdTransformer.php @@ -0,0 +1,54 @@ +choiceList = $choiceList; + } + + public function transform($model) + { + if (null === $model || '' === $model) { + return ''; + } + + if (!is_object($model)) { + throw new UnexpectedTypeException($model, 'object'); + } + + if (count($this->choiceList->getIdentifier()) > 1) { + $availableModels = $this->choiceList->getModels(); + + return array_search($model, $availableModels); + } + + return current($this->choiceList->getIdentifierValues($model)); + } + + public function reverseTransform($key) + { + if ('' === $key || null === $key) { + return null; + } + + if (count($this->choiceList->getIdentifier()) > 1 && !is_numeric($key)) { + throw new UnexpectedTypeException($key, 'numeric'); + } + + if (!($model = $this->choiceList->getModel($key))) { + throw new TransformationFailedException('The model with key "%s" could not be found', $key); + } + + return $model; + } +} diff --git a/Form/DataTransformer/ModelsToArrayTransformer.php b/Form/DataTransformer/ModelsToArrayTransformer.php new file mode 100644 index 0000000..99bca38 --- /dev/null +++ b/Form/DataTransformer/ModelsToArrayTransformer.php @@ -0,0 +1,74 @@ +choiceList = $choiceList; + } + + public function transform($collection) + { + if (null === $collection) { + return array(); + } + + if (!($collection instanceof PropelCollection)) { + throw new UnexpectedTypeException($collection, '\PropelCollection'); + } + + $array = array(); + + if (count($this->choiceList->getIdentifier()) > 1) { + $availableModels = $this->choiceList->getModels(); + + foreach ($collection as $model) { + $key = array_search($model, $availableModels); + $array[] = $key; + } + } else { + foreach ($collection as $model) { + $array[] = current($this->choiceList->getIdentifierValues($model)); + } + } + + return $array; + } + + public function reverseTransform($keys) + { + $collection = new PropelCollection(); + + if ('' === $keys || null === $keys) { + return $collection; + } + + if (!is_array($keys)) { + throw new UnexpectedTypeException($keys, 'array'); + } + + $notFound = array(); + + foreach ($keys as $key) { + if ($model = $this->choiceList->getModel($key)) { + $collection->append($model); + } else { + $notFound[] = $key; + } + } + + if (count($notFound) > 0) { + throw new TransformationFailedException(sprintf('The models with keys "%s" could not be found', implode('", "', $notFound))); + } + + return $collection; + } +}