ExtraFields: Add tag doctrine associations + add tests

pull/4032/head
Julio 4 years ago
parent 621f87ce4c
commit a515e2f51a
  1. 3
      public/main/inc/ajax/extra_field.ajax.php
  2. 4
      public/main/inc/lib/CoursesAndSessionsCatalog.class.php
  3. 1
      public/main/session/resume_session.php
  4. 1
      public/main/template/default/session/resume_session.html.twig
  5. 10
      src/CoreBundle/Controller/CourseController.php
  6. 10
      src/CoreBundle/Controller/SessionController.php
  7. 4
      src/CoreBundle/Entity/ExtraFieldRelTag.php
  8. 27
      src/CoreBundle/Entity/Tag.php
  9. 4
      src/CoreBundle/Entity/UserRelTag.php
  10. 32
      src/CoreBundle/Repository/ExtraFieldRelTagRepository.php
  11. 40
      src/CoreBundle/Repository/TagRepository.php
  12. 93
      tests/CoreBundle/Repository/TagRepositoryTest.php

@ -45,7 +45,8 @@ switch ($action) {
}
$tagRepo = Container::getTagRepository();
$tags = $tagRepo->findTagsByField($tag, $fieldId);
$field = $tagRepo->find($fieldId);
$tags = $tagRepo->findTagsByField($tag, $field);
$result = [];
foreach ($tags as $tag) {
$result[] = [

@ -1566,7 +1566,7 @@ class CoursesAndSessionsCatalog
$entityManager = Database::getManager();
$sessionRelCourseRepo = $entityManager->getRepository('ChamiloCoreBundle:SessionRelCourse');
$extraFieldRepo = $entityManager->getRepository('ChamiloCoreBundle:ExtraField');
$extraFieldRelTagRepo = $entityManager->getRepository('ChamiloCoreBundle:ExtraFieldRelTag');
$tagRepo = \Chamilo\CoreBundle\Framework\Container::getTagRepository();
$tagsField = $extraFieldRepo->findOneBy([
'extraFieldType' => Chamilo\CoreBundle\Entity\ExtraField::COURSE_FIELD_TYPE,
@ -1595,7 +1595,7 @@ class CoursesAndSessionsCatalog
]);
/** @var SessionRelCourse $sessionRelCourse */
foreach ($sessionRelCourses as $sessionRelCourse) {
$courseTags = $extraFieldRelTagRepo->getTags(
$courseTags = $tagRepo->getTagsByItem(
$tagsField,
$sessionRelCourse->getCourse()->getId()
);

@ -122,6 +122,7 @@ $sessionTitle = Display::page_subheader(get_lang('General properties').$url);
$sessionField = new ExtraField('session');
$extraFieldData = $sessionField->getDataAndFormattedValues($sessionId);
$urlList = [];
$isMultipleUrl = api_is_multiple_url_enabled();
if ($isMultipleUrl) {

@ -1,6 +1,7 @@
{% extends "@ChamiloCore/Layout/layout_one_col.html.twig" %}
{% block content %}
{% autoescape false %}
{{ session_header }}
{{ title }}

@ -8,10 +8,10 @@ namespace Chamilo\CoreBundle\Controller;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Repository\ExtraFieldRelTagRepository;
use Chamilo\CoreBundle\Repository\Node\IllustrationRepository;
use Chamilo\CoreBundle\Repository\TagRepository;
use Chamilo\CoreBundle\Security\Authorization\Voter\CourseVoter;
use Chamilo\CoreBundle\Tool\ToolChain;
use Chamilo\CourseBundle\Controller\ToolBaseController;
@ -324,8 +324,8 @@ class CourseController extends ToolBaseController
/** @var EntityRepository $fieldsRepo */
$fieldsRepo = $em->getRepository(ExtraField::class);
/** @var ExtraFieldRelTagRepository $fieldTagsRepo */
$fieldTagsRepo = $em->getRepository(ExtraFieldRelTag::class);
/** @var TagRepository $tagRepo */
$tagRepo = $em->getRepository(Tag::class);
$courseDescriptions = $courseDescriptionRepository->getResourcesByCourse($course)->getQuery()->getResult();
@ -354,7 +354,7 @@ class CourseController extends ToolBaseController
$courseTags = [];
if (null !== $tagField) {
$courseTags = $fieldTagsRepo->getTags($tagField, $courseId);
$courseTags = $tagRepo->getTagsByItem($tagField, $courseId);
}
$courseDescription = $courseObjectives = $courseTopics = $courseMethodology = '';

@ -8,16 +8,16 @@ namespace Chamilo\CoreBundle\Controller;
use BuyCoursesPlugin;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Chamilo\CoreBundle\Entity\SequenceResource;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\SessionRelCourse;
use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Repository\ExtraFieldRelTagRepository;
use Chamilo\CoreBundle\Repository\Node\IllustrationRepository;
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\CoreBundle\Repository\SequenceRepository;
use Chamilo\CoreBundle\Repository\TagRepository;
use Chamilo\CourseBundle\Entity\CCourseDescription;
use CourseDescription;
use Doctrine\ORM\EntityRepository;
@ -51,8 +51,8 @@ class SessionController extends AbstractController
/** @var EntityRepository $fieldsRepo */
$fieldsRepo = $em->getRepository(ExtraField::class);
/** @var ExtraFieldRelTagRepository $fieldTagsRepo */
$fieldTagsRepo = $em->getRepository(ExtraFieldRelTag::class);
/** @var TagRepository $tagRepo */
$tagRepo = $em->getRepository(Tag::class);
/** @var SequenceRepository $sequenceResourceRepo */
$sequenceResourceRepo = $em->getRepository(SequenceResource::class);
@ -73,7 +73,7 @@ class SessionController extends AbstractController
$courseTags = [];
if (null !== $tagField) {
$courseTags = $fieldTagsRepo->getTags($tagField, $sessionCourse->getId());
$courseTags = $tagRepo->getTagsByItem($tagField, $sessionCourse->getId());
}
$courseCoaches = $userRepo->getCoachesForSessionCourse($session, $sessionCourse);

@ -9,8 +9,6 @@ namespace Chamilo\CoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* FieldRelTag.
*
* @ORM\Table(
* name="extra_field_rel_tag",
* indexes={
@ -38,7 +36,7 @@ class ExtraFieldRelTag
protected ExtraField $field;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Tag")
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Tag", inversedBy="extraFieldRelTags")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected Tag $tag;

@ -6,6 +6,8 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
@ -34,6 +36,18 @@ class Tag
*/
protected ExtraField $field;
/**
* @var Collection<int, UserRelTag>|UserRelTag[]
* @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\UserRelTag", mappedBy="tag", cascade={"persist"})
*/
protected Collection $userRelTags;
/**
* @var Collection<int, ExtraFieldRelTag>|ExtraFieldRelTag[]
* @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\ExtraFieldRelTag", mappedBy="tag", cascade={"persist"})
*/
protected Collection $extraFieldRelTags;
/**
* @ORM\Column(name="count", type="integer", nullable=false)
*/
@ -41,6 +55,7 @@ class Tag
public function __construct()
{
$this->userRelTags = new ArrayCollection();
$this->count = 0;
}
@ -89,4 +104,16 @@ class Tag
return $this;
}
public function getUserRelTags()
{
return $this->userRelTags;
}
public function setUserRelTags($userRelTags): self
{
$this->userRelTags = $userRelTags;
return $this;
}
}

@ -33,13 +33,13 @@ class UserRelTag
protected int $id;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\User", inversedBy="userRelTags")
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\User", inversedBy="userRelTags", cascade={"persist"})
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected User $user;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Tag")
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Tag", inversedBy="userRelTags", cascade={"persist"} )
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected Tag $tag;

@ -6,15 +6,13 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* ExtraFieldRelTagRepository.
*
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
* @author Julio Montoya
*/
class ExtraFieldRelTagRepository extends ServiceEntityRepository
{
@ -22,32 +20,4 @@ class ExtraFieldRelTagRepository extends ServiceEntityRepository
{
parent::__construct($registry, ExtraFieldRelTag::class);
}
/**
* Get the tags for a item.
*
* @param ExtraField $extraField The extrafield
* @param int $itemId The item ID
*
* @return array
*/
public function getTags(ExtraField $extraField, int $itemId)
{
$queryBuilder = $this->createQueryBuilder('ft');
$queryBuilder->select('t')
->innerJoin(
'ChamiloCoreBundle:Tag',
't',
)
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('ft.itemId', $itemId),
$queryBuilder->expr()->eq('ft.field', $extraField->getId())
)
)
;
return $queryBuilder->getQuery()->getResult();
}
}

@ -6,7 +6,9 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CoreBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\Persistence\ManagerRegistry;
@ -21,15 +23,49 @@ class TagRepository extends ServiceEntityRepository
/**
* @return Collection|Tag[]
*/
public function findTagsByField(string $tag, int $fieldId)
public function findTagsByField(string $tag, ExtraField $field)
{
$qb = $this->createQueryBuilder('t')
->where('t.tag LIKE :tag')
->andWhere('t.field = :field')
->setParameter('field', $fieldId)
->setParameter('field', $field)
->setParameter('tag', "$tag%")
;
return $qb->getQuery()->getResult();
}
/**
* @return Collection|Tag[]
*/
public function getTagsByUser(ExtraField $field, User $user)
{
$qb = $this->createQueryBuilder('t')
->innerJoin('t.userRelTags', 'ut')
->where('t.field = :field')
->andWhere('ut.user = :user')
->setParameter('field', $field)
->setParameter('user', $user)
;
return $qb->getQuery()->getResult();
}
/**
* Get the tags for an item.
*
* @return Collection|Tag[]
*/
public function getTagsByItem(ExtraField $extraField, int $itemId)
{
$qb = $this->createQueryBuilder('t')
->innerJoin('t.extraFieldRelTags', 'et')
->where('et.itemId = :itemId')
->andWhere('et.field = :field')
->setParameter('field', $extraField)
->setParameter('itemId', $itemId)
;
return $qb->getQuery()->getResult();
}
}

@ -7,8 +7,10 @@ declare(strict_types=1);
namespace Chamilo\Tests\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CoreBundle\Entity\UserRelTag;
use Chamilo\CoreBundle\Repository\ExtraFieldRelTagRepository;
use Chamilo\CoreBundle\Repository\TagRepository;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
@ -19,28 +21,54 @@ class TagRepositoryTest extends AbstractApiTest
public function testCreate(): void
{
self::bootKernel();
$em = $this->getEntityManager();
$repo = self::getContainer()->get(TagRepository::class);
$defaultCount = $repo->count([]);
$extraField = (new ExtraField())
->setDisplayText('test')
->setVariable('test')
->setExtraFieldType(ExtraField::USER_FIELD_TYPE)
->setFieldType(\ExtraField::FIELD_TYPE_TEXT)
->setFieldType(\ExtraField::FIELD_TYPE_TAG)
;
$em->persist($extraField);
$em->flush();
$tag = (new Tag())
->setTag('php')
->setCount(1)
->setCount(0)
->setField($extraField)
;
$this->assertHasNoEntityViolations($tag);
$em->persist($tag);
$em->flush();
$this->assertSame(1, $repo->count([]));
$tags = $repo->findTagsByField('php', $extraField);
$this->assertCount(1, $tags);
}
public function testCreateUserRelTag(): void
{
$em = $this->getEntityManager();
$repo = self::getContainer()->get(TagRepository::class);
$extraField = (new ExtraField())
->setDisplayText('test')
->setVariable('test')
->setExtraFieldType(ExtraField::USER_FIELD_TYPE)
->setFieldType(\ExtraField::FIELD_TYPE_TAG)
;
$em->persist($extraField);
$em->flush();
$tag = (new Tag())
->setTag('php')
->setField($extraField)
;
$em->persist($tag);
$em->flush();
$user = $this->createUser('test');
@ -49,13 +77,62 @@ class TagRepositoryTest extends AbstractApiTest
->setTag($tag)
;
$em->persist($userRelTag);
$em->flush();
$em->clear();
$this->assertNotNull($userRelTag->getId());
$tags = $repo->getTagsByUser($extraField, $user);
$this->assertCount(1, $tags);
/** @var Tag $tag */
$tag = $repo->findOneBy(['tag' => 'php']);
$this->assertNotNull($tag);
$this->assertSame(1, $tag->getUserRelTags()->count());
$user = $this->getUser('test');
$this->assertSame(1, $user->getUserRelTags()->count());
}
public function testCreateExtraFieldRelTag(): void
{
$em = $this->getEntityManager();
$repo = self::getContainer()->get(TagRepository::class);
$extraFieldRelTagRepo = self::getContainer()->get(ExtraFieldRelTagRepository::class);
$extraField = (new ExtraField())
->setDisplayText('test')
->setVariable('test')
->setExtraFieldType(ExtraField::USER_FIELD_TYPE)
->setFieldType(\ExtraField::FIELD_TYPE_TAG)
;
$em->persist($extraField);
$tag = (new Tag())
->setTag('php')
->setField($extraField)
;
$em->persist($tag);
$em->flush();
$course = $this->createCourse('course');
$itemId = $course->getId();
$extraFieldRelTag = (new ExtraFieldRelTag())
->setItemId($itemId)
->setField($extraField)
->setTag($tag)
;
$em->persist($extraFieldRelTag);
$em->flush();
$em->clear();
$this->assertSame($defaultCount + 1, $repo->count([]));
$this->assertNotNull($extraFieldRelTag->getId());
$this->assertSame(1, $extraFieldRelTagRepo->count([]));
$tags = $repo->findTagsByField('php', $extraField->getId());
$tags = $repo->getTagsByItem($extraField, $itemId);
$this->assertSame(1, \count($tags));
$this->assertCount(1, $tags);
$this->assertInstanceOf(Tag::class, $tags[0]);
}
}

Loading…
Cancel
Save