* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Sonata\Exporter\Source; use PropelCollection; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessor; use Symfony\Component\PropertyAccess\PropertyPath; /** * Read data from a PropelCollection. * * @author Kévin Gomez */ class PropelCollectionSourceIterator implements SourceIteratorInterface { /** * @var \PropelCollection */ protected $collection; /** * @var \ArrayIterator */ protected $iterator; /** * @var array */ protected $propertyPaths; /** * @var PropertyAccessor */ protected $propertyAccessor; /** * @var string default DateTime format */ protected $dateTimeFormat; /** * @param PropelCollection $collection * @param array $fields Fields to export * @param string $dateTimeFormat */ public function __construct(PropelCollection $collection, array $fields, $dateTimeFormat = 'r') { $this->collection = clone $collection; $this->propertyAccessor = PropertyAccess::createPropertyAccessor(); $this->propertyPaths = []; foreach ($fields as $name => $field) { if (\is_string($name) && \is_string($field)) { $this->propertyPaths[$name] = new PropertyPath($field); } else { $this->propertyPaths[$field] = new PropertyPath($field); } } $this->dateTimeFormat = $dateTimeFormat; } /** * {@inheritdoc} */ public function current() { $current = $this->iterator->current(); $data = []; foreach ($this->propertyPaths as $name => $propertyPath) { $data[$name] = $this->getValue($this->propertyAccessor->getValue($current, $propertyPath)); } return $data; } /** * {@inheritdoc} */ public function next() { $this->iterator->next(); } /** * {@inheritdoc} */ public function key() { return $this->iterator->key(); } /** * {@inheritdoc} */ public function valid() { return $this->iterator->valid(); } /** * {@inheritdoc} */ public function rewind() { if ($this->iterator) { $this->iterator->rewind(); return; } $this->iterator = $this->collection->getIterator(); $this->iterator->rewind(); } /** * @param string $dateTimeFormat */ public function setDateTimeFormat($dateTimeFormat) { $this->dateTimeFormat = $dateTimeFormat; } /** * @return string */ public function getDateTimeFormat() { return $this->dateTimeFormat; } /** * @param $value * * @return string|null */ protected function getValue($value) { if (\is_array($value) || $value instanceof \Traversable) { $value = null; } elseif ($value instanceof \DateTimeInterface) { $value = $value->format($this->dateTimeFormat); } elseif (\is_object($value)) { $value = (string) $value; } return $value; } } class_exists(\Exporter\Source\PropelCollectionSourceIterator::class);