Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Entity; | |
use Doctrine\Common\Collections\ArrayCollection; | |
use Doctrine\Common\Collections\Collection; | |
use Mautic\CoreBundle\Doctrine\Mapping\ClassMetadataBuilder; | |
trait TranslationEntityTrait | |
{ | |
/** | |
* Set by AbstractCommonModel::getEntityBySlugs() if a language slug was used to fetch the entity. | |
* | |
* @var string | |
*/ | |
public $languageSlug; | |
/** | |
* @var mixed | |
**/ | |
private $translationChildren; | |
/** | |
* @var mixed | |
**/ | |
private $translationParent; | |
/** | |
* @var string | |
*/ | |
private $language = 'en'; | |
/** | |
* @param ClassMetadata $builder | |
* @param string $languageColumnName | |
*/ | |
protected static function addTranslationMetadata(ClassMetadataBuilder $builder, $entityClass, $languageColumnName = 'lang') | |
{ | |
$builder->createOneToMany('translationChildren', $entityClass) | |
->setIndexBy('id') | |
->setOrderBy(['isPublished' => 'DESC']) | |
->mappedBy('translationParent') | |
->build(); | |
$builder->createManyToOne('translationParent', $entityClass) | |
->inversedBy('translationChildren') | |
->addJoinColumn('translation_parent_id', 'id', true, false, 'CASCADE') | |
->build(); | |
$builder->createField('language', 'string') | |
->columnName($languageColumnName) | |
->build(); | |
} | |
/** | |
* @return $this | |
*/ | |
public function addTranslationChild(TranslationEntityInterface $child) | |
{ | |
if (!$this->translationChildren->contains($child)) { | |
$this->translationChildren[] = $child; | |
} | |
return $this; | |
} | |
public function removeTranslationChild(TranslationEntityInterface $child): void | |
{ | |
$this->translationChildren->removeElement($child); | |
} | |
/** | |
* Get translated items. | |
* | |
* @return ?Collection | |
*/ | |
public function getTranslationChildren() | |
{ | |
return $this->translationChildren; | |
} | |
/** | |
* @return $this | |
*/ | |
public function setTranslationParent(TranslationEntityInterface $parent = null) | |
{ | |
if (method_exists($this, 'isChanged')) { | |
$this->isChanged('translationParent', $parent); | |
} | |
$this->translationParent = $parent; | |
return $this; | |
} | |
/** | |
* @return ?TranslationEntityInterface | |
*/ | |
public function getTranslationParent() | |
{ | |
return $this->translationParent; | |
} | |
public function removeTranslationParent(): void | |
{ | |
if (method_exists($this, 'isChanged')) { | |
$this->isChanged('translationParent', ''); | |
} | |
$this->translationParent = null; | |
} | |
/** | |
* @param string $language | |
* | |
* @return $this | |
*/ | |
public function setLanguage($language) | |
{ | |
if (method_exists($this, 'isChanged')) { | |
$this->isChanged('language', $language); | |
} | |
$this->language = $language; | |
return $this; | |
} | |
/** | |
* @return string | |
*/ | |
public function getLanguage() | |
{ | |
return $this->language; | |
} | |
/** | |
* @param bool $isChild True to return if the item is a translation of a parent | |
* | |
* @return bool | |
*/ | |
public function isTranslation($isChild = false) | |
{ | |
$parent = $this->getTranslationParent(); | |
$children = $this->getTranslationChildren(); | |
if ($isChild) { | |
return (null === $parent) ? false : true; | |
} else { | |
return (!empty($parent) || count($children)) ? true : false; | |
} | |
} | |
/** | |
* Check if this entity has translations. | |
*/ | |
public function hasTranslations(): int | |
{ | |
$children = $this->getTranslationChildren(); | |
return count($children); | |
} | |
public function clearTranslations(): void | |
{ | |
$this->translationChildren = new ArrayCollection(); | |
$this->translationParent = null; | |
} | |
/** | |
* Get translation parent/children. | |
* | |
* @param bool $onlyChildren | |
* | |
* @return array|ArrayCollection | |
*/ | |
public function getTranslations($onlyChildren = false) | |
{ | |
$parent = $this->getTranslationParent(); | |
if (empty($parent)) { | |
$parent = $this; | |
} | |
$children = $parent->getTranslationChildren(); | |
if ($children instanceof Collection) { | |
$children = $children->toArray(); | |
} | |
if (!is_array($children)) { | |
$children = []; | |
} | |
if ($onlyChildren) { | |
return $children; | |
} | |
return [$parent, $children]; | |
} | |
/** | |
* @param string $getter | |
* @param ?TranslationEntityInterface $variantParent | |
* | |
* @return int | |
*/ | |
protected function getAccumulativeTranslationCount($getter, $variantParent = null) | |
{ | |
$count = 0; | |
[$parent, $children] = $this->getTranslations(); | |
if ($variantParent != $parent) { | |
$count = $parent->$getter(); | |
} | |
foreach ($children as $translation) { | |
if ($variantParent != $translation) { | |
$count += $translation->$getter(); | |
} | |
} | |
return $count; | |
} | |
} | |