Files
Chamilo/vendor/sonata-project/exporter/src/Source/PropelCollectionSourceIterator.php
2025-04-10 12:24:57 +02:00

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);