<?php
namespace Factory\SupportBundle\Contract\DataMapper;
use Factory\SupportBundle\Contract\DataMapper\ListDataMapper;
abstract class AbstractDataMapper
{
/**
* @var \Pimcore\Model\DataObject\Concrete
*/
protected $resource;
protected static $translator;
public function __construct($resource)
{
$this->resource = $resource;
}
public static function setTransaltor($translator)
{
self::$translator = $translator;
}
protected function trans($text)
{
return self::$translator->trans($text);
}
abstract public function toArray($request);
public function all($request)
{
if (empty($this->resource)) {
return $this->resource;
}
$result = [];
$data = $this->toArray($request);
if (empty($data)) {
return $data;
}
foreach ($data as $fieldName => $value) {
if ($value instanceof self) {
$result[$fieldName] = $value->all($request);
continue;
}
$result[$fieldName] = $value;
}
return $result;
}
public static function list(array $list)
{
$arguments = func_get_args();
array_shift($arguments);
return new ListDataMapper($list, static::class, $arguments);
}
public function __call($name, $arguments)
{
if ($this->resource === null) {
$dataMapper = static::class;
throw new \Exception("Try call method {$method} on null in {$dataMapper}");
}
try {
return call_user_func_array([$this->resource, $name], $arguments);
} catch (\Throwable $th) {
$dataMapper = static::class;
$class = get_class($this->resource);
$method = $name;
throw new \Exception("Exception occures in class {$dataMapper} while try to call {$class}::{$method}. ".$th->getMessage());
}
}
public function __get($name)
{
return $this->resource->{$name};
}
}