vendor/bluue/categories-bundle/src/Entity/Category.php line 41

Open in your IDE?
  1. <?php
  2. /**
  3.  * @author Leo BANNHOLTZER (contact@scaledev.fr)
  4.  * @copyright 2021 - ScaleDEV SAS, 12 RUE CHARLES MORET, 10120 ST ANDRE LES VERGERS
  5.  * @license commercial
  6.  */
  7. declare(strict_types=1);
  8. namespace Bluue\CategoriesBundle\Entity;
  9. use App\Entity\Context;
  10. use Symfony\Component\Uid\Uuid;
  11. use Doctrine\ORM\Mapping as ORM;
  12. use Gedmo\Mapping\Annotation as Gedmo;
  13. use App\DoctrineExtensions\IsActiveEntity;
  14. use Doctrine\Common\Collections\Collection;
  15. use App\DoctrineExtensions\GedmoTree\TreeEntity;
  16. use Doctrine\Common\Collections\ArrayCollection;
  17. use Bluue\CategoriesBundle\Entity\CategoryContext;
  18. use Bluue\CategoriesBundle\Entity\CategoryProduct;
  19. use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator;
  20. use Bluue\CategoriesBundle\Repository\CategoryRepository;
  21. use App\DoctrineExtensions\Timestampable\Traits\UserTimestampableEntity;
  22. use App\DoctrineExtensions\SoftDeleteable\Traits\UserSoftDeleteableEntity;
  23. /**
  24.  * @ORM\Entity(repositoryClass=CategoryRepository::class)
  25.  * @ORM\Table(name="categories_bundle__category", indexes={
  26.  *  @ORM\Index(name="name", columns={"name"}),
  27.  *  @ORM\Index(name="is_active", columns={"is_active"}),
  28.  *  @ORM\Index(name="deleted_at", columns={"deleted_at"}),
  29.  *  @ORM\Index(name="created_at", columns={"created_at"}),
  30.  *  @ORM\Index(name="updated_at", columns={"updated_at"})
  31.  * })
  32.  * @Gedmo\TranslationEntity(class="Bluue\CategoriesBundle\Entity\CategoryTranslation")
  33.  * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false, hardDelete=false)
  34.  * @Gedmo\Tree(type="nested")
  35.  */
  36. class Category
  37. {
  38.     use TreeEntity;
  39.     use UserTimestampableEntity;
  40.     use UserSoftDeleteableEntity;
  41.     use IsActiveEntity;
  42.     /**
  43.      * @ORM\Id
  44.      * @ORM\Column(type="uuid")
  45.      * @ORM\GeneratedValue(strategy="CUSTOM")
  46.      * @ORM\CustomIdGenerator(class=UuidGenerator::class)
  47.      */
  48.     private ?Uuid $id null;
  49.     /**
  50.      * @Gedmo\Translatable
  51.      * @ORM\Column(type="string", length=128)
  52.      */
  53.     private string $name;
  54.     /**
  55.      * @Gedmo\Translatable
  56.      * @ORM\Column(type="text", nullable=true)
  57.      */
  58.     private ?string $description;
  59.     /**
  60.      * @Gedmo\TreeParent()
  61.      * @ORM\ManyToOne(targetEntity=Category::class, inversedBy="childCategories")
  62.      */
  63.     private ?Category $parent null;
  64.     /**
  65.      * @ORM\OneToMany(targetEntity=Category::class, mappedBy="parent", fetch="EXTRA_LAZY")
  66.      * @ORM\OrderBy({"left" = "ASC"})
  67.      */
  68.     private Collection $childCategories;
  69.     /**
  70.      * @ORM\OneToMany(
  71.      *   targetEntity="CategoryTranslation",
  72.      *   mappedBy="object",
  73.      *   cascade={"persist", "remove"},
  74.      *   fetch="EXTRA_LAZY"
  75.      * )
  76.      */
  77.     private Collection $translations;
  78.     /**
  79.      * @ORM\OneToMany(targetEntity=CategoryProduct::class, mappedBy="category", fetch="EXTRA_LAZY")
  80.      */
  81.     private Collection $categoryProducts;
  82.     /**
  83.      * @ORM\OneToMany(targetEntity=CategoryContext::class, mappedBy="category", fetch="EXTRA_LAZY")
  84.      */
  85.     private Collection $categoryContexts;
  86.     public function __construct()
  87.     {
  88.         $this->translations = new ArrayCollection();
  89.         $this->categoryProducts = new ArrayCollection();
  90.         $this->childCategories = new ArrayCollection();
  91.         $this->categoryContexts = new ArrayCollection();
  92.     }
  93.     /**
  94.      * @return Uuid|null
  95.      */
  96.     public function getId(): ?Uuid
  97.     {
  98.         return $this->id;
  99.     }
  100.     /**
  101.      * @return string
  102.      */
  103.     public function getName(): string
  104.     {
  105.         return $this->name;
  106.     }
  107.     /**
  108.      * @param string $name
  109.      * @return $this
  110.      */
  111.     public function setName(string $name): self
  112.     {
  113.         $this->name $name;
  114.         return $this;
  115.     }
  116.     /**
  117.      * @return string|null
  118.      */
  119.     public function getDescription(): ?string
  120.     {
  121.         return $this->description;
  122.     }
  123.     /**
  124.      * @param string $description
  125.      * @return $this
  126.      */
  127.     public function setDescription(?string $description): self
  128.     {
  129.         $this->description $description;
  130.         return $this;
  131.     }
  132.     /**
  133.      * @return self|null
  134.      */
  135.     public function getParent(): ?self
  136.     {
  137.         return $this->parent;
  138.     }
  139.     /**
  140.      * @param self|null $parent
  141.      * @return $this
  142.      */
  143.     public function setParent(?self $parent): self
  144.     {
  145.         $this->parent $parent;
  146.         return $this;
  147.     }
  148.     /**
  149.      * @param Context|null $context
  150.      * @return Collection|self[]
  151.      */
  152.     public function getChildCategories(?Context $context null): Collection
  153.     {
  154.         if ($context) {
  155.             return $this->childCategories->filter(function (Category $c) use ($context) {
  156.                 return $c->getCategoryContexts()->exists(function ($keyCategoryContext $cc) use ($context) {
  157.                     return $cc->getContext() === $context;
  158.                 });
  159.             });
  160.         }
  161.         return $this->childCategories;
  162.     }
  163.     /**
  164.      * @return Collection|CategoryTranslation[]
  165.      */
  166.     public function getTranslations()
  167.     {
  168.         return $this->translations;
  169.     }
  170.     /**
  171.      * @param CategoryTranslation $t
  172.      * @return $this
  173.      */
  174.     public function addTranslation(CategoryTranslation $t): self
  175.     {
  176.         if (!$this->translations->contains($t)) {
  177.             $this->translations[] = $t;
  178.             $t->setObject($this);
  179.         }
  180.         return $this;
  181.     }
  182.     /**
  183.      * @return Collection|CategoryProduct[]
  184.      */
  185.     public function getCategoryProducts(): Collection
  186.     {
  187.         return $this->categoryProducts;
  188.     }
  189.     /**
  190.      * @param CategoryProduct $categoryProduct
  191.      * @return $this
  192.      */
  193.     public function addCategoryProduct(CategoryProduct $categoryProduct): self
  194.     {
  195.         if (!$this->categoryProducts->contains($categoryProduct)) {
  196.             $this->categoryProducts[] = $categoryProduct;
  197.             $categoryProduct->setCategory($this);
  198.         }
  199.         return $this;
  200.     }
  201.     /**
  202.      * @param CategoryProduct $categoryProduct
  203.      * @return $this
  204.      */
  205.     public function removeCategoryProduct(CategoryProduct $categoryProduct): self
  206.     {
  207.         if ($this->categoryProducts->removeElement($categoryProduct)) {
  208.             if ($categoryProduct->getCategory() === $this) {
  209.                 $categoryProduct->setCategory(null);
  210.             }
  211.         }
  212.         return $this;
  213.     }
  214.     /**
  215.      * @return Collection|CategoryContext[]
  216.      */
  217.     public function getCategoryContexts(): Collection
  218.     {
  219.         return $this->categoryContexts;
  220.     }
  221.     /**
  222.      * @param Context $context
  223.      * @return CategoryContext|null
  224.      */
  225.     public function getCategoryContext(Context $context): ?CategoryContext
  226.     {
  227.         $value null;
  228.         if ($this->getId()) {
  229.             foreach ($this->getCategoryContexts() as $cc) {
  230.                 if ($cc->getContext() == $context) {
  231.                     $value $cc;
  232.                 }
  233.             }
  234.         }
  235.         return $value;
  236.     }
  237.     /**
  238.      * @param CategoryContext $categoryContext
  239.      * @return $this
  240.      */
  241.     public function addCategoryContext(CategoryContext $categoryContext): self
  242.     {
  243.         if (!$this->categoryContexts->contains($categoryContext)) {
  244.             $this->categoryContexts[] = $categoryContext;
  245.             $categoryContext->setCategory($this);
  246.         }
  247.         return $this;
  248.     }
  249.     /**
  250.      * @param CategoryContext $categoryContext
  251.      * @return $this
  252.      */
  253.     public function removeCategoryContext(CategoryContext $categoryContext): self
  254.     {
  255.         if ($this->categoryContexts->removeElement($categoryContext)) {
  256.             if ($categoryContext->getCategory() === $this) {
  257.                 $categoryContext->setCategory(null);
  258.             }
  259.         }
  260.         return $this;
  261.     }
  262.     /**
  263.      * @return string
  264.      */
  265.     public function getChoiceLabel(): string
  266.     {
  267.         // ne pas afficher la catégorie par défaut
  268.         $path '';
  269.         $parent $this->getParent();
  270.         while ($parent) {
  271.             $path $parent->getName() . ' > ' $path;
  272.             $parent $parent->getParent();
  273.         }
  274.         return $path $this->getName();
  275.     }
  276. }