diff --git a/src/CoreBundle/Controller/Admin/AdminController.php b/src/CoreBundle/Controller/Admin/AdminController.php index 5e061203141..f268dd77412 100644 --- a/src/CoreBundle/Controller/Admin/AdminController.php +++ b/src/CoreBundle/Controller/Admin/AdminController.php @@ -7,10 +7,13 @@ namespace Chamilo\CoreBundle\Controller\Admin; use Chamilo\CoreBundle\Controller\BaseController; +use Chamilo\CoreBundle\Entity\ResourceLink; +use Chamilo\CoreBundle\Entity\ResourceType; use Chamilo\CoreBundle\Repository\ResourceFileRepository; use Chamilo\CoreBundle\Repository\ResourceNodeRepository; use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper; use Chamilo\CoreBundle\Settings\SettingsManager; +use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; @@ -79,4 +82,67 @@ public function listFilesInfo(Request $request, ResourceFileRepository $resource 'search' => $search, ]); } + + #[IsGranted('ROLE_ADMIN')] + #[Route('/resources_info', name: 'admin_resources_info', methods: ['GET'])] + public function listResourcesInfo(Request $request, ResourceNodeRepository $resourceNodeRepo, EntityManagerInterface $em): Response + { + $resourceTypeId = $request->query->getInt('type'); + $resourceTypes = $em->getRepository(ResourceType::class)->findAll(); + + $courses = []; + if ($resourceTypeId > 0) { + $resourceLinks = $em->getRepository(ResourceLink::class)->createQueryBuilder('rl') + ->join('rl.resourceNode', 'rn') + ->where('rn.resourceType = :type') + ->setParameter('type', $resourceTypeId) + ->getQuery() + ->getResult(); + + $seen = []; + foreach ($resourceLinks as $link) { + $course = $link->getCourse(); + $session = $link->getSession(); + $node = $link->getResourceNode(); + + if (!$course) { + continue; + } + + $key = $session + ? 's'.$session->getId().'-'.$course->getId() + : 'c'.$course->getId(); + + if (!isset($seen[$key])) { + $seen[$key] = [ + 'type' => $session ? 'session' : 'course', + 'id' => $session ? $session->getId() : $course->getId(), + 'title' => $session ? $session->getTitle().' - '.$course->getTitle() : $course->getTitle(), + 'url' => $session + ? '/course/'.$course->getId().'/home?sid='.$session->getId() + : '/course/'.$course->getId().'/home', + 'count' => 0, + 'items' => [], + 'firstCreatedAt' => $node->getCreatedAt(), + ]; + } + + $seen[$key]['count']++; + $seen[$key]['items'][] = $node->getTitle(); + + if ($node->getCreatedAt() < $seen[$key]['firstCreatedAt']) { + $seen[$key]['firstCreatedAt'] = $node->getCreatedAt(); + } + } + + $courses = array_values($seen); + usort($courses, fn($a, $b) => strnatcasecmp($a['title'], $b['title'])); + } + + return $this->render('@ChamiloCore/Admin/resources_info.html.twig', [ + 'resourceTypes' => $resourceTypes, + 'selectedType' => $resourceTypeId, + 'courses' => $courses, + ]); + } } diff --git a/src/CoreBundle/Controller/Admin/IndexBlocksController.php b/src/CoreBundle/Controller/Admin/IndexBlocksController.php index 49dedc58996..93c6b18cfed 100644 --- a/src/CoreBundle/Controller/Admin/IndexBlocksController.php +++ b/src/CoreBundle/Controller/Admin/IndexBlocksController.php @@ -590,6 +590,12 @@ private function getItemsSettings(): array 'label' => $this->translator->trans('File info'), ]; + $items[] = [ + 'class' => 'item-resources-info', + 'url' => '/admin/resources_info', + 'label' => $this->translator->trans('Resources by type'), + ]; + return $items; } diff --git a/src/CoreBundle/Resources/views/Admin/resources_info.html.twig b/src/CoreBundle/Resources/views/Admin/resources_info.html.twig new file mode 100644 index 00000000000..81c020e7233 --- /dev/null +++ b/src/CoreBundle/Resources/views/Admin/resources_info.html.twig @@ -0,0 +1,59 @@ +{% extends "@ChamiloCore/Layout/layout_one_col.html.twig" %} + +{% block content %} +
+ {{ 'This page shows all base and session courses that contain at least one item of the selected resource type.'|trans }} +
+ + + + {% if courses is empty and selectedType %} +{{ 'No results found.'|trans }}
+ {% elseif courses is not empty %} +{{ 'Type'|trans }} | +{{ 'Title'|trans }} | +{{ 'Count'|trans }} | +{{ 'Resources'|trans }} | +{{ 'First created'|trans }} | +{{ 'Link'|trans }} | +
---|---|---|---|---|---|
{{ course.type|capitalize }} | +{{ course.title }} | +{{ course.count }} | +
+
|
+ {{ course.firstCreatedAt|date('Y-m-d H:i') }} | +{{ 'Open'|trans }} | +