diff --git a/src/CoreBundle/Repository/ResourceRepository.php b/src/CoreBundle/Repository/ResourceRepository.php index 07aeecf920..05067c91a2 100644 --- a/src/CoreBundle/Repository/ResourceRepository.php +++ b/src/CoreBundle/Repository/ResourceRepository.php @@ -224,7 +224,6 @@ abstract class ResourceRepository extends ServiceEntityRepository public function getResourceType(): ResourceType { $resourceTypeName = $this->toolChain->getResourceTypeNameByEntity($this->getClassName()); - $repo = $this->getEntityManager()->getRepository(ResourceType::class); return $repo->findOneBy([ diff --git a/src/CourseBundle/Entity/CLp.php b/src/CourseBundle/Entity/CLp.php index 3f1de556ea..88f1156bf7 100644 --- a/src/CourseBundle/Entity/CLp.php +++ b/src/CourseBundle/Entity/CLp.php @@ -207,9 +207,11 @@ class CLp extends AbstractResource implements ResourceInterface protected Collection $items; /** + * @var Collection|CForum[] + * * @ORM\OneToMany(targetEntity="CForum", mappedBy="lp", cascade={"persist", "remove"}) */ - protected ?CForum $forum = null; + protected Collection $forums; /** * @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Asset", cascade={"persist", "remove"}) @@ -247,6 +249,7 @@ class CLp extends AbstractResource implements ResourceInterface $this->useMaxScore = 1; $this->theme = ''; $this->items = new ArrayCollection(); + $this->forums = new ArrayCollection(); } public function __toString(): string @@ -757,19 +760,22 @@ class CLp extends AbstractResource implements ResourceInterface return $this; } - public function getForum(): ?CForum - { - return $this->forum; - } - - public function hasForum(): bool + /** + * @return ArrayCollection|Collection|CForum[] + */ + public function getForums() { - return null !== $this->forum; + return $this->forums; } - public function setForum(CForum $forum): self + /** + * @param ArrayCollection|Collection $forums + * + * @return CLp + */ + public function setForums($forums): self { - $this->forum = $forum; + $this->forums = $forums; return $this; } diff --git a/src/CourseBundle/Entity/CLpItem.php b/src/CourseBundle/Entity/CLpItem.php index cbcc95a9b4..c90075eb06 100644 --- a/src/CourseBundle/Entity/CLpItem.php +++ b/src/CourseBundle/Entity/CLpItem.php @@ -48,6 +48,7 @@ class CLpItem /** * @ORM\Column(name="ref", type="text", nullable=false) */ + #[Assert\NotBlank] protected string $ref; /** @@ -205,12 +206,7 @@ class CLpItem return $this; } - /** - * Get itemType. - * - * @return string - */ - public function getItemType() + public function getItemType(): string { return $this->itemType; } @@ -222,12 +218,7 @@ class CLpItem return $this; } - /** - * Get ref. - * - * @return string - */ - public function getRef() + public function getRef(): string { return $this->ref; } @@ -239,12 +230,7 @@ class CLpItem return $this; } - /** - * Get title. - * - * @return string - */ - public function getTitle() + public function getTitle(): string { return $this->title; } diff --git a/src/CourseBundle/Repository/CForumCategoryRepository.php b/src/CourseBundle/Repository/CForumCategoryRepository.php index 9c6ef2781a..4410b2fc84 100644 --- a/src/CourseBundle/Repository/CForumCategoryRepository.php +++ b/src/CourseBundle/Repository/CForumCategoryRepository.php @@ -23,6 +23,19 @@ class CForumCategoryRepository extends ResourceRepository parent::__construct($registry, CForumCategory::class); } + public function getForumCategoryByTitle(string $title, Course $course, Session $session = null): ?CForumCategory + { + /** @var CForumCategory|null $result */ + $result = $this->findCourseResourceByTitle( + $title, + $course->getResourceNode(), + $course, + $session + ); + + return $result; + } + /*public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroup $group = null): QueryBuilder { return $this->getResourcesByCourse($course, $session, $group, $parentNode); diff --git a/src/CourseBundle/Repository/CForumThreadRepository.php b/src/CourseBundle/Repository/CForumThreadRepository.php index 27af867845..e77254021f 100644 --- a/src/CourseBundle/Repository/CForumThreadRepository.php +++ b/src/CourseBundle/Repository/CForumThreadRepository.php @@ -21,6 +21,17 @@ class CForumThreadRepository extends ResourceRepository parent::__construct($registry, CForumThread::class); } + public function getForumThread(string $title, Course $course, Session $session = null): ?CForumThread + { + $qb = $this->getResourcesByCourse($course, $session); + $qb + ->andWhere('resource.threadTitle = :title') + ->setParameter('title', $title) + ; + + return $qb->getQuery()->getOneOrNullResult(); + } + public function findAllByCourse( Course $course, Session $session = null, diff --git a/src/CourseBundle/Repository/CLpRepository.php b/src/CourseBundle/Repository/CLpRepository.php index e545c35490..2413433fe0 100644 --- a/src/CourseBundle/Repository/CLpRepository.php +++ b/src/CourseBundle/Repository/CLpRepository.php @@ -11,6 +11,7 @@ use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Repository\ResourceRepository; use Chamilo\CoreBundle\Repository\ResourceWithLinkInterface; +use Chamilo\CourseBundle\Entity\CForum; use Chamilo\CourseBundle\Entity\CLp; use Chamilo\CourseBundle\Entity\CLpItem; use Doctrine\ORM\QueryBuilder; @@ -41,6 +42,24 @@ final class CLpRepository extends ResourceRepository implements ResourceWithLink $this->create($lp); } + public function findForumByCourse(CLp $lp, Course $course, Session $session = null): ?CForum + { + $forums = $lp->getForums(); + $result = null; + foreach ($forums as $forum) { + $links = $forum->getResourceNode()->getResourceLinks(); + foreach ($links as $link) { + if ($link->getCourse() === $course && $link->getSession() === $session) { + $result = $forum; + + break 2; + } + } + } + + return $result; + } + public function findAllByCourse( Course $course, Session $session = null, diff --git a/tests/CourseBundle/Repository/CForumCategoryRepositoryTest.php b/tests/CourseBundle/Repository/CForumCategoryRepositoryTest.php index ebc4360232..0ade28cfa3 100644 --- a/tests/CourseBundle/Repository/CForumCategoryRepositoryTest.php +++ b/tests/CourseBundle/Repository/CForumCategoryRepositoryTest.php @@ -28,20 +28,22 @@ class CForumCategoryRepositoryTest extends AbstractApiTest $teacher = $this->createUser('teacher'); $category = (new CForumCategory()) - ->setCatTitle('cat') + ->setCatTitle('cat 1') ->setParent($course) ->setCreator($teacher) + ->addCourseLink($course) ; $this->assertHasNoEntityViolations($category); $categoryRepo->create($category); - $this->assertSame('cat', (string) $category); + $this->assertSame('cat 1', (string) $category); $forum = (new CForum()) ->setForumTitle('forum') ->setParent($course) ->setCreator($teacher) ->setForumCategory($category) + ->addCourseLink($course) ; $forumRepo->create($forum); @@ -51,6 +53,8 @@ class CForumCategoryRepositoryTest extends AbstractApiTest $this->assertSame(1, $categoryRepo->count([])); $this->assertSame(1, $forumRepo->count([])); + $this->assertNotNull($categoryRepo->getForumCategoryByTitle('cat 1', $course)); + $categoryRepo->delete($category); $this->assertSame(0, $categoryRepo->count([])); diff --git a/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php b/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php index e8f9564488..d62b89bdc9 100644 --- a/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php +++ b/tests/CourseBundle/Repository/CForumThreadRepositoryTest.php @@ -30,6 +30,7 @@ class CForumThreadRepositoryTest extends AbstractApiTest ->setForumTitle('forum') ->setParent($course) ->setCreator($teacher) + ->addCourseLink($course) ; $forumRepo->create($forum); @@ -38,6 +39,7 @@ class CForumThreadRepositoryTest extends AbstractApiTest ->setForum($forum) ->setParent($course) ->setCreator($teacher) + ->addCourseLink($course) ; $threadRepo->create($thread); @@ -49,9 +51,10 @@ class CForumThreadRepositoryTest extends AbstractApiTest $this->assertSame(1, $forumRepo->count([])); $this->assertSame(1, $forum->getThreads()->count()); + $this->assertNull($threadRepo->getForumThread('title', $course)); + $this->assertSame(0, $thread->getThreadViews()); $threadRepo->increaseView($thread); - $this->assertSame(1, $thread->getThreadViews()); $forumRepo->delete($forum); diff --git a/tests/CourseBundle/Repository/CLpItemRepositoryTest.php b/tests/CourseBundle/Repository/CLpItemRepositoryTest.php index 392310164f..60e20a3b1d 100644 --- a/tests/CourseBundle/Repository/CLpItemRepositoryTest.php +++ b/tests/CourseBundle/Repository/CLpItemRepositoryTest.php @@ -51,6 +51,7 @@ class CLpItemRepositoryTest extends AbstractApiTest $this->assertSame(1, $lp->getItems()->count()); $this->assertSame('lp', (string) $lp); + $this->assertNotEmpty((string) $lpItem); $this->assertSame(1, $lpRepo->count([])); $this->assertSame(2, $lpItemRepo->count([])); } diff --git a/tests/CourseBundle/Repository/CLpRepositoryTest.php b/tests/CourseBundle/Repository/CLpRepositoryTest.php index 0945ffcbce..4ac5b65547 100644 --- a/tests/CourseBundle/Repository/CLpRepositoryTest.php +++ b/tests/CourseBundle/Repository/CLpRepositoryTest.php @@ -6,7 +6,9 @@ declare(strict_types=1); namespace Chamilo\Tests\CourseBundle\Repository; +use Chamilo\CourseBundle\Entity\CForum; use Chamilo\CourseBundle\Entity\CLp; +use Chamilo\CourseBundle\Repository\CForumRepository; use Chamilo\CourseBundle\Repository\CLpRepository; use Chamilo\Tests\AbstractApiTest; use Chamilo\Tests\ChamiloTestTrait; @@ -59,6 +61,51 @@ class CLpRepositoryTest extends AbstractApiTest $this->assertSame('/main/lp/lp_controller.php?lp_id='.$lp->getIid().'&action=view', $link); } + public function testCreateWithForum(): void + { + self::bootKernel(); + + $lpRepo = self::getContainer()->get(CLpRepository::class); + $forumRepo = self::getContainer()->get(CForumRepository::class); + + $course = $this->createCourse('new'); + $course2 = $this->createCourse('new2'); + $teacher = $this->createUser('teacher'); + + $forum = (new CForum()) + ->setForumTitle('forum') + ->setParent($course) + ->setCreator($teacher) + ->addCourseLink($course) + ; + $forumRepo->create($forum); + + $forum2 = (new CForum()) + ->setForumTitle('forum2') + ->setParent($course2) + ->setCreator($teacher) + ->addCourseLink($course) + ; + $forumRepo->create($forum2); + + $lp = (new CLp()) + ->setName('lp') + ->setParent($course) + ->setCreator($teacher) + ->setLpType(CLp::LP_TYPE) + ->addCourseLink($course) + ; + $lp->getForums()->add($forum); + $lp->getForums()->add($forum2); + + $lpRepo->createLp($lp); + + $this->assertSame(2, $lp->getForums()->count()); + + $forum = $lpRepo->findForumByCourse($lp, $course); + $this->assertNotNull($forum); + } + public function testFindAllByCourse(): void { self::bootKernel();