WIP: Resources refactor

pull/3064/head
Julio 5 years ago
parent d28136f030
commit 3a5b5f5623
  1. 10
      src/CoreBundle/Controller/AbstractResourceController.php
  2. 33
      src/CoreBundle/Controller/ResourceController.php
  3. 5
      src/CoreBundle/Entity/AccessUrl.php
  4. 5
      src/CoreBundle/Entity/Course.php
  5. 9
      src/CoreBundle/Entity/Illustration.php
  6. 1
      src/CoreBundle/Entity/Listener/ResourceListener.php
  7. 5
      src/CoreBundle/Entity/PersonalFile.php
  8. 6
      src/CoreBundle/Entity/Resource/AbstractResource.php
  9. 2
      src/CoreBundle/Entity/Resource/ResourceInterface.php
  10. 23
      src/CoreBundle/Repository/IllustrationRepository.php
  11. 27
      src/CoreBundle/Repository/ResourceRepository.php
  12. 7
      src/CoreBundle/Repository/ResourceRepositoryInterface.php
  13. 5
      src/CoreBundle/Resources/config/tools.yml
  14. 5
      src/CoreBundle/ToolChain.php
  15. 9
      src/CourseBundle/Entity/CAnnouncement.php
  16. 7
      src/CourseBundle/Entity/CDocument.php
  17. 7
      src/CourseBundle/Entity/CExerciseCategory.php
  18. 9
      src/CourseBundle/Entity/CLink.php
  19. 7
      src/CourseBundle/Entity/CLp.php
  20. 7
      src/CourseBundle/Entity/CQuiz.php
  21. 5
      src/CourseBundle/Entity/CQuizQuestion.php
  22. 5
      src/CourseBundle/Entity/CQuizQuestionCategory.php
  23. 7
      src/CourseBundle/Repository/CDocumentRepository.php
  24. 13
      src/CourseBundle/Repository/CLinkRepository.php
  25. 17
      src/CourseBundle/Traits/PersonalResourceTrait.php

@ -9,6 +9,7 @@ use Chamilo\CoreBundle\ToolChain;
use Cocur\Slugify\SlugifyInterface;
use League\Flysystem\MountManager;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\PropertyAccess\Exception\InvalidArgumentException;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
@ -64,21 +65,22 @@ abstract class AbstractResourceController extends BaseController
*
* @return ResourceRepository
*/
public function getRepository($tool, $resourceTypeName)
public function getRepository($tool, $resourceTypeName): ?ResourceRepository
{
$checker = $this->container->get('security.authorization_checker');
$tool = $this->toolChain->getToolFromName($tool);
$resourceTypeList = $tool->getResourceTypes();
if (!isset($resourceTypeList[$resourceTypeName])) {
return null;
throw new InvalidArgumentException("Resource type doesn't exist: $resourceTypeName");
}
$type = $resourceTypeList[$resourceTypeName];
$repo = $type['repository'];
$entity = $type['entity'];
$resourceRepository = new $repo(
$repository = new $repo(
$checker,
$this->getDoctrine()->getManager(),
$this->mountManager,
@ -87,6 +89,6 @@ abstract class AbstractResourceController extends BaseController
$entity
);
return $resourceRepository;
return $repository;
}
}

@ -65,7 +65,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$breadcrumb = $this->breadcrumbBlockService;
$breadcrumb->addChild(
$this->trans('Documents'),
$this->trans($tool),
[
'uri' => '#',
]
@ -94,7 +94,9 @@ class ResourceController extends AbstractResourceController implements CourseCon
$repository = $this->getRepositoryFromRequest($request);
$class = $repository->getRepository()->getClassName();
$source = new Entity($class);
// The group 'resource' is set in the @GRID\Source annotation in the entity.
$source = new Entity($class, 'resource');
$course = $this->getCourse();
$session = $this->getSession();
@ -119,29 +121,33 @@ class ResourceController extends AbstractResourceController implements CourseCon
$grid->setRouteUrl($this->generateUrl('chamilo_core_resource_list', $params));
//$title = $repository->get
$title = $grid->getColumn('title');
$title->setSafe(false); // allows links in the title
//$grid->hideFilters();
//$grid->setLimits(20);
//$grid->isReadyForRedirect();
//$grid->setMaxResults(1);
//$grid->setLimits(2);
//$grid->setColumns($columns);
$translation = $this->translator;
$routeParams = $courseParams;
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams['id'] = null;
$titleColumn = $repository->getTitleColumn($grid);
$titleColumn->setSafe(false); // allows links in the title
// Title link.
$grid->getColumn('title')->setTitle($this->trans('Name'));
if ($grid->hasColumn('filetype')) {
$titleColumn->setTitle($this->trans('Name'));
//$repository->formatGrid();
/*if ($grid->hasColumn('filetype')) {
$grid->getColumn('filetype')->setTitle($this->trans('Type'));
}
}*/
$grid->getColumn('title')->manipulateRenderCell(
$titleColumn->manipulateRenderCell(
function ($value, Row $row, $router) use ($routeParams) {
/** @var Router $router */
/** @var AbstractResource $entity */
@ -159,7 +165,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
'chamilo_core_resource_show',
$myParams
);*/
if ($resourceNode->isResourceFileAnImage()) {
$url = $router->generate(
'chamilo_core_resource_view',
@ -218,7 +223,9 @@ class ResourceController extends AbstractResourceController implements CourseCon
);
}
$grid->setHiddenColumns(['iid']);
if ($grid->hasColumn('iid')) {
$grid->setHiddenColumns(['iid']);
}
// Delete mass action.
if ($this->isGranted(ResourceNodeVoter::DELETE, $this->getCourse())) {

@ -506,9 +506,4 @@ class AccessUrl extends AbstractResource implements ResourceInterface
return $url;
}
public function getResourceFieldName(): string
{
return 'url';
}
}

@ -1362,9 +1362,4 @@ class Course extends AbstractResource implements ResourceInterface
{
return $this->getCode();
}
public function getResourceFieldName(): string
{
return 'code';
}
}

@ -3,8 +3,10 @@
namespace Chamilo\CoreBundle\Entity;
use APY\DataGridBundle\Grid\Mapping as GRID;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceInterface;
use Chamilo\CourseBundle\Traits\PersonalResourceTrait;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
@ -13,9 +15,11 @@ use Gedmo\Timestampable\Traits\TimestampableEntity;
*
* @ORM\Table(name="illustration")
* @ORM\Entity
* @GRID\Source(columns="id, name, resourceNode.createdAt", filterable=false, groups={"resource"})
*/
class Illustration extends AbstractResource implements ResourceInterface
{
use PersonalResourceTrait;
use TimestampableEntity;
/**
@ -79,11 +83,6 @@ class Illustration extends AbstractResource implements ResourceInterface
return $this->getName();
}
public function getResourceFieldName(): string
{
return 'name';
}
public function __toString(): string
{
return $this->getName();

@ -34,7 +34,6 @@ class ResourceListener
public function preUpdate(AbstractResource $resource, PreUpdateEventArgs $event)
{
/*error_log('preUpdate');
$fieldIdentifier = $resource->getResourceFieldName();
error_log($fieldIdentifier);
$em = $event->getEntityManager();
if ($event->hasChangedField($fieldIdentifier)) {

@ -79,11 +79,6 @@ class PersonalFile extends AbstractResource implements ResourceInterface
return $this->getName();
}
public function getResourceFieldName(): string
{
return 'name';
}
public function __toString(): string
{
return $this->getName();

@ -85,4 +85,10 @@ abstract class AbstractResource implements ResourceInterface
return null;
}
public static function getFieldName()
{
return 'name';
}
}

@ -15,7 +15,5 @@ interface ResourceInterface
public function getResourceName(): string;
public function getResourceFieldName(): string;
public function __toString(): string;
}

@ -3,17 +3,33 @@
namespace Chamilo\CoreBundle\Repository;
use APY\DataGridBundle\Grid\Column\Column;
use APY\DataGridBundle\Grid\Grid;
use Chamilo\CoreBundle\Entity\Illustration;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\UserBundle\Entity\User;
use Symfony\Component\Form\FormInterface;
/**
* Class IllustrationRepository.
*/
class IllustrationRepository extends ResourceRepository
final class IllustrationRepository extends ResourceRepository implements ResourceRepositoryInterface
{
public function saveResource(FormInterface $form, $course, $session, $fileType)
{
$newResource = $form->getData();
$newResource
//->setCourse($course)
//->setSession($session)
//->setFiletype($fileType)
//->setTitle($title) // already added in $form->getData()
;
return $newResource;
}
/**
* @param $uploadFile
*/
@ -88,4 +104,9 @@ class IllustrationRepository extends ResourceRepository
return '';
}
public function getTitleColumn(Grid $grid): Column
{
return $grid->getColumn('name');
}
}

@ -490,10 +490,12 @@ class ResourceRepository extends EntityRepository
$className = $repo->getClassName();
$checker = $this->getAuthorizationChecker();
$reflectionClass = $repo->getClassMetadata()->getReflectionClass();
// Check if this resource type requires to load the base course resources when using a session
$loadBaseSessionContent = $repo->getClassMetadata()->getReflectionClass()->hasProperty(
'loadCourseResourcesInSession'
);
$loadBaseSessionContent = $reflectionClass->hasProperty('loadCourseResourcesInSession');
$isPersonalResource = $reflectionClass->hasProperty('loadPersonalResources');
$type = $this->getResourceType();
$qb = $repo->getEntityManager()->createQueryBuilder()
@ -507,13 +509,14 @@ class ResourceRepository extends EntityRepository
)
->innerJoin('node.resourceLinks', 'links')
->where('node.resourceType = :type')
->andWhere('links.course = :course')
->setParameters(
[
'type' => $type,
'course' => $course,
]
);
->setParameter('type',$type);
if ($isPersonalResource === false) {
$qb
->andWhere('links.course = :course')
->setParameter('course', $course)
;
}
$isAdmin = $checker->isGranted('ROLE_ADMIN') ||
$checker->isGranted('ROLE_CURRENT_COURSE_TEACHER');
@ -546,10 +549,10 @@ class ResourceRepository extends EntityRepository
}
if (null === $group) {
$qb->andWhere('links.group IS NULL');
$qb->andWhere('links.group IS NULL');
}
//echo ($qb->getQuery()->getSQL());exit;
///var_dump($qb->getQuery()->getSQL(), $type->getId(), $parentNode->getId());exit;
return $qb;
}

@ -3,6 +3,8 @@
namespace Chamilo\CoreBundle\Repository;
use APY\DataGridBundle\Grid\Column\Column;
use APY\DataGridBundle\Grid\Grid;
use Symfony\Component\Form\FormInterface;
/**
@ -11,4 +13,9 @@ use Symfony\Component\Form\FormInterface;
interface ResourceRepositoryInterface
{
public function saveResource(FormInterface $form, $course, $session, $fileType);
//public function updateResource(FormInterface $form);
public function getTitleColumn(Grid $grid): Column;
}

@ -33,7 +33,10 @@ services:
- 'asset'
- 'asset'
- ''
- {Chamilo\CoreBundle\Entity\Illustration: 'illustrations'}
-
illustrations:
entity: Chamilo\CoreBundle\Entity\Illustration
repository: Chamilo\CoreBundle\Repository\IllustrationRepository
- 1
tags:
- {name: chamilo_core.tool}

@ -12,6 +12,7 @@ use Chamilo\CoreBundle\Tool\AbstractTool;
use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\SettingsBundle\Manager\SettingsManager;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\PropertyAccess\Exception\InvalidArgumentException;
/**
* Class ToolChain.
@ -148,7 +149,7 @@ class ToolChain
/**
* @param string $name
*
* @return AbstractTool|false
* @return AbstractTool
*/
public function getToolFromName($name)
{
@ -158,6 +159,6 @@ class ToolChain
return $tools[$name];
}
return false;
throw new InvalidArgumentException("Tool doesn't exist: $name");
}
}

@ -107,7 +107,7 @@ class CAnnouncement extends AbstractResource implements ResourceInterface
*/
public function getTitle()
{
return $this->title;
return (string) $this->title;
}
/**
@ -301,13 +301,8 @@ class CAnnouncement extends AbstractResource implements ResourceInterface
return $this->getTitle();
}
public function getResourceFieldName(): string
{
return 'title';
}
public function __toString(): string
{
// TODO: Implement __toString() method.
return $this->getTitle();
}
}

@ -26,7 +26,7 @@ use Doctrine\ORM\Mapping as ORM;
* @ORM\Index(name="idx_cdoc_sid", columns={"session_id"}),
* }
* )
* @GRID\Source(columns="iid, title, filetype, resourceNode.createdAt", filterable=false)
* @GRID\Source(columns="iid, title, filetype, resourceNode.createdAt", filterable=false, groups={"resource"})
* @ORM\Entity
*/
class CDocument extends AbstractResource implements ResourceInterface
@ -356,9 +356,4 @@ class CDocument extends AbstractResource implements ResourceInterface
{
return $this->getTitle();
}
public function getResourceFieldName(): string
{
return 'title';
}
}

@ -109,7 +109,7 @@ class CExerciseCategory extends AbstractResource implements ResourceInterface
*/
public function getName()
{
return $this->name;
return (string) $this->name;
}
/**
@ -191,9 +191,4 @@ class CExerciseCategory extends AbstractResource implements ResourceInterface
{
return $this->getName();
}
public function getResourceFieldName(): string
{
return 'name';
}
}

@ -7,7 +7,7 @@ use APY\DataGridBundle\Grid\Mapping as GRID;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceInterface;
use Doctrine\ORM\Mapping as ORM;
//
/**
* CLink.
*
@ -19,7 +19,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @GRID\Source(columns="iid, title, resourceNode.createdAt", filterable=false)
* @GRID\Source(columns="iid, title, resourceNode.createdAt", filterable=false, groups={"resource"})
*/
class CLink extends AbstractResource implements ResourceInterface
{
@ -355,11 +355,6 @@ class CLink extends AbstractResource implements ResourceInterface
return $this->getTitle();
}
public function getResourceFieldName(): string
{
return 'title';
}
public function __toString(): string
{
return $this->getTitle();

@ -327,7 +327,7 @@ class CLp extends AbstractResource implements ResourceInterface
*/
public function getName()
{
return $this->name;
return (string) $this->name;
}
/**
@ -1075,11 +1075,6 @@ class CLp extends AbstractResource implements ResourceInterface
return $this->getName();
}
public function getResourceFieldName(): string
{
return 'name';
}
public function __toString(): string
{
return $this->getName();

@ -285,7 +285,7 @@ class CQuiz extends AbstractResource implements ResourceInterface
*/
public function getTitle()
{
return $this->title;
return (string) $this->title;
}
/**
@ -960,11 +960,6 @@ class CQuiz extends AbstractResource implements ResourceInterface
return $this->getTitle();
}
public function getResourceFieldName(): string
{
return 'title';
}
public function __toString(): string
{
return $this->getTitle();

@ -427,11 +427,6 @@ class CQuizQuestion extends AbstractResource implements ResourceInterface
return $this->getQuestion();
}
public function getResourceFieldName(): string
{
return 'question';
}
public function __toString(): string
{
return $this->getQuestion();

@ -220,11 +220,6 @@ class CQuizQuestionCategory extends AbstractResource implements ResourceInterfac
return $this->getTitle();
}
public function getResourceFieldName(): string
{
return 'title';
}
public function __toString(): string
{
return $this->getTitle();

@ -3,6 +3,8 @@
namespace Chamilo\CourseBundle\Repository;
use APY\DataGridBundle\Grid\Column\Column;
use APY\DataGridBundle\Grid\Grid;
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
@ -167,4 +169,9 @@ final class CDocumentRepository extends ResourceRepository implements ResourceRe
return $query->getResult();
}
public function getTitleColumn(Grid $grid): Column
{
return $grid->getColumn('title');
}
}

@ -3,6 +3,8 @@
namespace Chamilo\CourseBundle\Repository;
use APY\DataGridBundle\Grid\Column\Column;
use APY\DataGridBundle\Grid\Grid;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
use Chamilo\CourseBundle\Entity\CLink;
@ -22,13 +24,12 @@ final class CLinkRepository extends ResourceRepository implements ResourceReposi
->setDisplayOrder(0)
->setOnHomepage(0)
;
//$newResource->setSessionId($session)
/*$newResource
->setCourse($course)
->setSession($session)*/
//->setTitle($title) // already added in $form->getData()
;
return $newResource;
}
public function getTitleColumn(Grid $grid): Column
{
return $grid->getColumn('title');
}
}

@ -0,0 +1,17 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CourseBundle\Traits;
/**
* Trait ShowCourseResourcesInSessionTrait.
*/
trait PersonalResourceTrait
{
protected $loadPersonalResources = true;
public function loadPersonalResources(): bool
{
return $this->loadPersonalResources;
}
}
Loading…
Cancel
Save