164 lines
3.5 KiB
PHP
164 lines
3.5 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Sonata Project package.
|
|
*
|
|
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
|
|
*
|
|
* 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 <contact@kevingomez.fr>
|
|
*/
|
|
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);
|