197 lines
6.7 KiB
PHP
197 lines
6.7 KiB
PHP
<?php
|
|
|
|
namespace App\Repository;
|
|
|
|
use App\Entity\Item;
|
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
use Doctrine\Common\Collections\ArrayCollection;
|
|
use Doctrine\Persistence\ManagerRegistry;
|
|
|
|
/**
|
|
* @extends ServiceEntityRepository<Item>
|
|
*
|
|
* @method Item|null find($id, $lockMode = null, $lockVersion = null)
|
|
* @method Item|null findOneBy(array $criteria, array $orderBy = null)
|
|
* @method Item[] findAll()
|
|
* @method Item[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
|
*/
|
|
class ItemRepository extends ServiceEntityRepository
|
|
{
|
|
public function __construct(ManagerRegistry $registry)
|
|
{
|
|
parent::__construct($registry, Item::class);
|
|
}
|
|
|
|
public function save(Item $entity, bool $flush = false): void
|
|
{
|
|
$this->getEntityManager()->persist($entity);
|
|
|
|
if ($flush) {
|
|
$this->getEntityManager()->flush();
|
|
}
|
|
}
|
|
|
|
public function remove(Item $entity, bool $flush = false): void
|
|
{
|
|
$this->getEntityManager()->remove($entity);
|
|
|
|
if ($flush) {
|
|
$this->getEntityManager()->flush();
|
|
}
|
|
}
|
|
|
|
public function getUserItems($user, &$bookmarks, &$itemsordered, &$itemcategorys, $iditemcategory = null, $withbookmark = 1, $fgessential = false)
|
|
{
|
|
// Profilage
|
|
$roles = ($user ? $user->getRoles() : ['ROLE_ANONYME']);
|
|
$groups = ($user ? $user->getGroups() : []);
|
|
|
|
// Bookmark de l'utilisateur
|
|
$bookmarks = [];
|
|
if ($user) {
|
|
$bookmarks = $this->getEntityManager()->getRepository("App\Entity\Bookmark")->findBy(['user' => $user]);
|
|
}
|
|
|
|
$itemcategoryfilter = null;
|
|
if ($iditemcategory) {
|
|
$itemcategoryfilter = $this->getEntityManager()->getRepository("App\Entity\Itemcategory")->findBy(['id' => $iditemcategory]);
|
|
}
|
|
|
|
// Bookmark lié à un item
|
|
$bookmarksitems = new ArrayCollection();
|
|
if (0 == $withbookmark) {
|
|
foreach ($bookmarks as $bookmark) {
|
|
if ($bookmark->getItem()) {
|
|
$bookmarksitems->add($bookmark->getItem());
|
|
}
|
|
}
|
|
}
|
|
|
|
// Initialisation du calcul des items
|
|
$items = new ArrayCollection();
|
|
$itemalls = new ArrayCollection();
|
|
|
|
// Récupération des items par rôles
|
|
$itemsroles = [];
|
|
foreach ($roles as $role) {
|
|
$qb = $this->getEntityManager()->createQueryBuilder();
|
|
$qb->select('item')
|
|
->from("App\Entity\Item", 'item')
|
|
->where($qb->expr()->like('item.roles', $qb->expr()->literal("%$role%")));
|
|
|
|
if ($iditemcategory && $itemcategoryfilter) {
|
|
$qb->andWhere('item.itemcategory=:itemcategory')
|
|
->setParameter('itemcategory', $itemcategoryfilter);
|
|
}
|
|
|
|
$itemsroles = $qb->getQuery()->getResult();
|
|
foreach ($itemsroles as $itemrole) {
|
|
if (!$bookmarksitems->contains($itemrole) && !$items->contains($itemrole)) {
|
|
if (!$fgessential || ($fgessential && $itemrole->isEssential())) {
|
|
$items->add($itemrole);
|
|
}
|
|
}
|
|
|
|
if (!$itemalls->contains($itemrole)) {
|
|
$itemalls->add($itemrole);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Récupération des items par group
|
|
$itemsgroups = [];
|
|
foreach ($groups as $group) {
|
|
$qb = $this->getEntityManager()->createQueryBuilder();
|
|
$qb->select('item')
|
|
->from("App\Entity\Item", 'item')
|
|
->where(':group MEMBER OF item.groups')
|
|
->setParameter('group', $group->getGroup());
|
|
|
|
if ($iditemcategory && $itemcategoryfilter) {
|
|
$qb->andWhere('item.itemcategory=:itemcategory')
|
|
->setParameter('itemcategory', $itemcategoryfilter);
|
|
}
|
|
|
|
$itemsgroups = $qb->getQuery()->getResult();
|
|
foreach ($itemsgroups as $itemgroup) {
|
|
if (!$bookmarksitems->contains($itemgroup) && !$items->contains($itemgroup)) {
|
|
if (!$fgessential || ($fgessential && $itemgroup->isEssential())) {
|
|
$items->add($itemgroup);
|
|
}
|
|
}
|
|
|
|
if (!$itemalls->contains($itemgroup)) {
|
|
$itemalls->add($itemgroup);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Pour chaque bookmark lié à un item : on vérifie qu'il est tjr la permission de voir cet item sinon on l'enlève de ses fav
|
|
foreach ($bookmarks as $key => $bookmark) {
|
|
$item = $bookmark->getItem();
|
|
if ($item) {
|
|
if (!$itemalls->contains($item)) {
|
|
unset($bookmarks[$key]);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Trie des items
|
|
$itemsordered = $items->getIterator();
|
|
$itemsordered->uasort(function ($first, $second) {
|
|
if ((int) $first->getRowOrder() > (int) $second->getRowOrder()) {
|
|
$return = 1;
|
|
} elseif ((int) $first->getRowOrder() == (int) $second->getRowOrder()) {
|
|
if ($first->getTitle() > $second->getTitle()) {
|
|
$return = 1;
|
|
} else {
|
|
$return = -1;
|
|
}
|
|
} else {
|
|
$return = -1;
|
|
}
|
|
|
|
return $return;
|
|
});
|
|
$itemsordered = iterator_to_array($itemsordered);
|
|
|
|
switch ($withbookmark) {
|
|
// items uniquement
|
|
case 1: $bookmarks = null;
|
|
break;
|
|
|
|
// bookmarks uniquement
|
|
case 2: $itemsordered = null;
|
|
break;
|
|
}
|
|
|
|
// Catégories affichées
|
|
$itemcategorys = new ArrayCollection();
|
|
if ($iditemcategory && $itemcategoryfilter) {
|
|
$itemcategorys = $itemcategoryfilter;
|
|
if (empty($itemsordered)) {
|
|
$itemcategorys = null;
|
|
}
|
|
} elseif ($itemsordered) {
|
|
foreach ($itemsordered as $key => $item) {
|
|
if (!$itemcategorys->contains($item->getItemcategory())) {
|
|
$itemcategorys->add($item->getItemcategory());
|
|
}
|
|
}
|
|
|
|
// Trie des itemcategorys
|
|
$itemcategorysordered = $itemcategorys->getIterator();
|
|
$itemcategorysordered->uasort(function ($first, $second) {
|
|
if ((int) $first->getRowOrder() > (int) $second->getRowOrder()) {
|
|
$return = 1;
|
|
} else {
|
|
$return = -1;
|
|
}
|
|
|
|
return $return;
|
|
});
|
|
$itemcategorys = iterator_to_array($itemcategorysordered);
|
|
}
|
|
}
|
|
}
|