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(); $tagRepo = Container::getTagRepository();
$tags = $tagRepo->findTagsByField($tag, $fieldId); $field = $tagRepo->find($fieldId);
$tags = $tagRepo->findTagsByField($tag, $field);
$result = []; $result = [];
foreach ($tags as $tag) { foreach ($tags as $tag) {
$result[] = [ $result[] = [

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

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

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

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

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

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

@ -6,6 +6,8 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Entity; namespace Chamilo\CoreBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
@ -34,6 +36,18 @@ class Tag
*/ */
protected ExtraField $field; 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) * @ORM\Column(name="count", type="integer", nullable=false)
*/ */
@ -41,6 +55,7 @@ class Tag
public function __construct() public function __construct()
{ {
$this->userRelTags = new ArrayCollection();
$this->count = 0; $this->count = 0;
} }
@ -89,4 +104,16 @@ class Tag
return $this; 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; 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") * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/ */
protected User $user; 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") * @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="CASCADE")
*/ */
protected Tag $tag; protected Tag $tag;

@ -6,15 +6,13 @@ declare(strict_types=1);
namespace Chamilo\CoreBundle\Repository; namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag; use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
/** /**
* ExtraFieldRelTagRepository.
*
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com> * @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
* @author Julio Montoya
*/ */
class ExtraFieldRelTagRepository extends ServiceEntityRepository class ExtraFieldRelTagRepository extends ServiceEntityRepository
{ {
@ -22,32 +20,4 @@ class ExtraFieldRelTagRepository extends ServiceEntityRepository
{ {
parent::__construct($registry, ExtraFieldRelTag::class); 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; namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\Tag; use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CoreBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
@ -21,15 +23,49 @@ class TagRepository extends ServiceEntityRepository
/** /**
* @return Collection|Tag[] * @return Collection|Tag[]
*/ */
public function findTagsByField(string $tag, int $fieldId) public function findTagsByField(string $tag, ExtraField $field)
{ {
$qb = $this->createQueryBuilder('t') $qb = $this->createQueryBuilder('t')
->where('t.tag LIKE :tag') ->where('t.tag LIKE :tag')
->andWhere('t.field = :field') ->andWhere('t.field = :field')
->setParameter('field', $fieldId) ->setParameter('field', $field)
->setParameter('tag', "$tag%") ->setParameter('tag', "$tag%")
; ;
return $qb->getQuery()->getResult(); 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; namespace Chamilo\Tests\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\ExtraField; use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Chamilo\CoreBundle\Entity\Tag; use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CoreBundle\Entity\UserRelTag; use Chamilo\CoreBundle\Entity\UserRelTag;
use Chamilo\CoreBundle\Repository\ExtraFieldRelTagRepository;
use Chamilo\CoreBundle\Repository\TagRepository; use Chamilo\CoreBundle\Repository\TagRepository;
use Chamilo\Tests\AbstractApiTest; use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait; use Chamilo\Tests\ChamiloTestTrait;
@ -19,28 +21,54 @@ class TagRepositoryTest extends AbstractApiTest
public function testCreate(): void public function testCreate(): void
{ {
self::bootKernel();
$em = $this->getEntityManager(); $em = $this->getEntityManager();
$repo = self::getContainer()->get(TagRepository::class); $repo = self::getContainer()->get(TagRepository::class);
$defaultCount = $repo->count([]);
$extraField = (new ExtraField()) $extraField = (new ExtraField())
->setDisplayText('test') ->setDisplayText('test')
->setVariable('test') ->setVariable('test')
->setExtraFieldType(ExtraField::USER_FIELD_TYPE) ->setExtraFieldType(ExtraField::USER_FIELD_TYPE)
->setFieldType(\ExtraField::FIELD_TYPE_TEXT) ->setFieldType(\ExtraField::FIELD_TYPE_TAG)
; ;
$em->persist($extraField); $em->persist($extraField);
$em->flush(); $em->flush();
$tag = (new Tag()) $tag = (new Tag())
->setTag('php') ->setTag('php')
->setCount(1) ->setCount(0)
->setField($extraField) ->setField($extraField)
; ;
$this->assertHasNoEntityViolations($tag); $this->assertHasNoEntityViolations($tag);
$em->persist($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'); $user = $this->createUser('test');
@ -49,13 +77,62 @@ class TagRepositoryTest extends AbstractApiTest
->setTag($tag) ->setTag($tag)
; ;
$em->persist($userRelTag); $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->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