Files
Chamilo/vendor/ddeboer/data-import/src/Writer/StreamMergeWriter.php
2025-08-14 22:41:49 +02:00

141 lines
2.8 KiB
PHP

<?php
namespace Ddeboer\DataImport\Writer;
/**
* Class allowing multiple writers to write in same stream
*
* @author Benoît Burnichon <bburnichon@gmail.com>
*/
class StreamMergeWriter extends AbstractStreamWriter
{
/**
* @var string
*/
private $discriminantField = 'discr';
/**
* @var AbstractStreamWriter[]
*/
private $writers = [];
/**
* Set discriminant field
*
* @param string $discriminantField
*
* @return $this
*/
public function setDiscriminantField($discriminantField)
{
$this->discriminantField = (string) $discriminantField;
return $this;
}
/**
* Get discriminant Field
*
* @return string
*/
public function getDiscriminantField()
{
return $this->discriminantField;
}
/**
* {@inheritdoc}
*/
public function writeItem(array $item)
{
if ((isset($item[$this->discriminantField])
|| array_key_exists($this->discriminantField, $item))
&& $this->hasStreamWriter($key = $item[$this->discriminantField])
) {
$writer = $this->getStreamWriter($key);
$writer->writeItem($item);
}
}
/**
* Set stream writers
*
* @param AbstractStreamWriter[] $writers
*
* @return $this
*/
public function setStreamWriters(array $writers)
{
foreach ($writers as $key => $writer) {
$this->setStreamWriter($key, $writer);
}
return $this;
}
/**
* @param string $key
* @param AbstractStreamWriter $writer
*
* @return $this
*/
public function setStreamWriter($key, AbstractStreamWriter $writer)
{
$writer->setStream($this->getStream());
$writer->setCloseStreamOnFinish(false);
$this->writers[$key] = $writer;
return $this;
}
/**
* Get a previously registered Writer
*
* @param string $key
*
* @return AbstractStreamWriter
*/
public function getStreamWriter($key)
{
return $this->writers[$key];
}
/**
* Get list of registered Writers
*
* @return AbstractStreamWriter[]
*/
public function getStreamWriters()
{
return $this->writers;
}
/**
* Is a writer registered for key?
*
* @param string $key
*
* @return boolean
*/
public function hasStreamWriter($key)
{
return isset($this->writers[$key]);
}
/**
* Set a stream
*
* @param resource $stream
*/
public function setStream($stream)
{
parent::setStream($stream);
foreach ($this->getStreamWriters() as $writer) {
$writer->setStream($stream);
}
return $this;
}
}