Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Entity; | |
use Doctrine\Common\Collections\Collection; | |
use Doctrine\ORM\Mapping as ORM; | |
use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder; | |
class CommonEntity implements \Stringable | |
{ | |
/** | |
* @var array | |
*/ | |
protected $changes = []; | |
/** | |
* @var array | |
*/ | |
protected $pastChanges = []; | |
public static function loadMetadata(ORM\ClassMetadata $metadata): void | |
{ | |
$builder = new ClassMetadataBuilder($metadata); | |
$builder->setMappedSuperClass(); | |
} | |
/** | |
* Wrapper function for isProperty methods. | |
* | |
* @param string $name | |
* | |
* @throws \InvalidArgumentException | |
*/ | |
public function __call($name, $arguments) | |
{ | |
if (str_starts_with($name, 'is') && method_exists($this, 'get'.ucfirst($name))) { | |
return $this->{'get'.ucfirst($name)}(); | |
} elseif ('getName' == $name && method_exists($this, 'getTitle')) { | |
return $this->getTitle(); | |
} | |
throw new \InvalidArgumentException('Method '.$name.' not exists'); | |
} | |
public function __toString(): string | |
{ | |
$string = static::class; | |
if (method_exists($this, 'getId')) { | |
$string .= ' with ID #'.$this->getId(); | |
} | |
return $string; | |
} | |
/** | |
* @param string $prop | |
* @param mixed $val | |
* | |
* @return void | |
*/ | |
protected function isChanged($prop, $val) | |
{ | |
$getter = (method_exists($this, $prop)) ? $prop : 'get'.ucfirst($prop); | |
$current = $this->$getter(); | |
if ('category' == $prop) { | |
$currentId = ($current) ? $current->getId() : ''; | |
$newId = ($val) ? $val->getId() : null; | |
if ($currentId != $newId) { | |
$this->addChange($prop, [$currentId, $newId]); | |
} | |
} elseif ($current !== $val) { | |
if ($current instanceof Collection || $val instanceof Collection) { | |
if (!isset($this->changes[$prop])) { | |
$this->changes[$prop] = [ | |
'added' => [], | |
'removed' => [], | |
]; | |
} | |
if (is_object($val)) { | |
// Entity is getting added to the collection | |
$this->changes['added'][] = method_exists($val, 'getId') ? $val->getId() : (string) $val; | |
} else { | |
// Entity is getting removed from the collection | |
$this->changes['removed'][] = $val; | |
} | |
} else { | |
if ($current instanceof \DateTime) { | |
$current = $current->format('c'); | |
} elseif (is_object($current)) { | |
$current = (method_exists($current, 'getId')) ? $current->getId() : (string) $current; | |
} elseif (('' === $current && null === $val) || (null === $current && '' === $val)) { | |
// Ingore empty conversion (but allow 0 to '' or null) | |
return; | |
} | |
if ($val instanceof \DateTime) { | |
$val = $val->format('c'); | |
} elseif (is_object($val)) { | |
$val = (method_exists($val, 'getId')) ? $val->getId() : (string) $val; | |
} | |
$this->addChange($prop, [$current, $val]); | |
} | |
} | |
} | |
protected function addChange($key, $value) | |
{ | |
if (isset($this->changes[$key]) && is_array($this->changes[$key]) && [0, 1] !== array_keys($this->changes[$key])) { | |
$this->changes[$key] = array_merge($this->changes[$key], $value); | |
} else { | |
$this->changes[$key] = $value; | |
} | |
} | |
/** | |
* @param bool $includePast | |
* | |
* @return mixed[] | |
*/ | |
public function getChanges($includePast = false) | |
{ | |
if ($includePast && empty($this->changes) && !empty($this->pastChanges)) { | |
return $this->pastChanges; | |
} | |
return $this->changes; | |
} | |
public function resetChanges(): void | |
{ | |
$this->pastChanges = $this->changes; | |
$this->changes = []; | |
} | |
public function setChanges(array $changes): void | |
{ | |
$this->changes = $changes; | |
} | |
} | |