Refactor ResourceController in order to accept other resource types

pull/3064/head
Julio 6 years ago
parent ab6bf51c6f
commit 3ae6eb8213
  1. 39
      src/CoreBundle/Controller/BaseController.php
  2. 106
      src/CoreBundle/Controller/ResourceController.php
  3. 18
      src/CoreBundle/Controller/ResourceUploadController.php
  4. 2
      src/CoreBundle/EventListener/ResourceUploadListener.php
  5. 3
      src/CoreBundle/Form/Resource/CLinkType.php
  6. 43
      src/CoreBundle/Form/Resource/PersonalFileType.php
  7. 10
      src/CoreBundle/Repository/IllustrationRepository.php
  8. 13
      src/CoreBundle/Repository/PersonalFileRepository.php
  9. 43
      src/CoreBundle/Repository/ResourceRepository.php
  10. 3
      src/CoreBundle/Repository/ResourceRepositoryInterface.php
  11. 21
      src/CourseBundle/Controller/CourseControllerTrait.php
  12. 42
      src/CourseBundle/EventListener/CourseListener.php
  13. 13
      src/CourseBundle/Repository/CDocumentRepository.php
  14. 13
      src/CourseBundle/Repository/CLinkRepository.php
  15. 32
      src/ThemeBundle/Resources/views/Resource/index.html.twig
  16. 2
      src/ThemeBundle/Resources/views/Resource/new_folder.html.twig

@ -88,6 +88,19 @@ abstract class BaseController extends AbstractController
return $this->getDoctrine()->getManager()->find('ChamiloCoreBundle:Course', $courseId);
}
public function hasCourse()
{
$request = $this->getRequest();
if ($request) {
$courseId = $request->getSession()->get('cid', 0);
if (!empty($courseId)) {
return true;
}
}
return false;
}
/**
* Gets the current Chamilo session based in the "sid" $_SESSION variable.
*
@ -126,12 +139,28 @@ abstract class BaseController extends AbstractController
return $url;
}
public function getCourseParams(): array
public function getResourceParams(Request $request): array
{
$routeParams = ['cid' => $this->getCourse()->getId()];
$session = $this->getCourseSession();
$sessionId = $session ? $session->getId() : 0;
$routeParams['sid'] = $sessionId;
$tool = $request->get('tool');
$type = $request->get('type');
$id = (int) $request->get('id');
$courseId = null;
$sessionId = null;
if ($this->hasCourse()) {
$courseId = $this->getCourse()->getId();
$session = $this->getCourseSession();
$sessionId = $session ? $session->getId() : 0;
}
$routeParams = [
'id' => $id,
'tool' => $tool,
'type' => $type,
'cid' => $courseId,
'sid' => $sessionId,
];
return $routeParams;
}

@ -60,17 +60,8 @@ class ResourceController extends AbstractResourceController implements CourseCon
$tool = $request->get('tool');
$type = $request->get('type');
$repository = $this->getRepositoryFromRequest($request);
$entityName = $repository->getResourceType()->getEntityName();
$parentResource = $this->getCourse();
if (null === $parentResource) {
/** @var User $user */
$parentResource = $this->getUser();
}
$grid = $this->getGrid($request, $grid, $parentResource->getResourceNode()->getId());
$parentResourceNode = $this->getParentResourceNode($request);
$grid = $this->getGrid($request, $grid, $parentResourceNode->getId());
$breadcrumb = $this->getBreadCrumb();
$breadcrumb->addChild(
@ -81,14 +72,34 @@ class ResourceController extends AbstractResourceController implements CourseCon
);
// The base resource node is the course.
$id = $this->getCourse()->getResourceNode()->getId();
$id = $parentResourceNode->getId();
return $grid->getGridResponse(
'@ChamiloTheme/Resource/index.html.twig',
['tool' => $tool, 'type' => $type, 'id' => $id]
['tool' => $tool, 'type' => $type, 'id' => $id, 'parent_resource_node' => $parentResourceNode]
);
}
private function getParentResourceNode(Request $request)
{
$parentNodeId = $request->get('id');
if (empty($parentNodeId)) {
if ($this->hasCourse()) {
$parentResourceNode = $this->getCourse()->getResourceNode();
} else {
/** @var User $user */
$parentResourceNode = $this->getUser()->getResourceNode();
}
} else {
$repo = $this->getDoctrine()->getRepository('ChamiloCoreBundle:Resource\ResourceNode');
$parentResourceNode = $repo->find($parentNodeId);
}
return $parentResourceNode;
}
/**
* @Route("/{tool}/{type}/{id}/list", name="chamilo_core_resource_list")
*
@ -103,10 +114,17 @@ class ResourceController extends AbstractResourceController implements CourseCon
$grid = $this->getGrid($request, $grid, $resourceNodeId);
$this->setBreadCrumb($request);
$parentResourceNode = $this->getParentResourceNode($request);
return $grid->getGridResponse(
'@ChamiloTheme/Resource/index.html.twig',
['parent_id' => $resourceNodeId, 'tool' => $tool, 'type' => $type, 'id' => $resourceNodeId]
[
'parent_id' => $resourceNodeId,
'tool' => $tool,
'type' => $type,
'id' => $resourceNodeId,
'parent_resource_node' => $parentResourceNode,
]
);
}
@ -121,10 +139,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
// The group 'resource' is set in the @GRID\Source annotation in the entity.
$source = new Entity($class, 'resource');
$course = $this->getCourse();
$session = $this->getSession();
$parentNode = $repository->getResourceNodeRepository()->find($resourceNodeId);
$this->denyAccessUnlessGranted(
@ -133,20 +147,23 @@ class ResourceController extends AbstractResourceController implements CourseCon
$this->trans('Unauthorised access to resource')
);
$qb = $repository->getResourcesByCourse($course, $session, null, $parentNode);
$course = null;
$session = null;
if ($this->hasCourse()) {
$course = $this->getCourse();
$session = $this->getSession();
$qb = $repository->getResourcesByCourse($course, $session, null, $parentNode);
} else {
$qb = $repository->getResourcesByCreator($this->getUser(), $parentNode);
}
// 3. Set QueryBuilder to the source.
$source->initQueryBuilder($qb);
$grid->setSource($source);
$courseParams = $this->getCourseParams();
$params = $courseParams;
$params['tool'] = $tool;
$params['type'] = $type;
$params['id'] = $id;
$resourceParams = $this->getResourceParams($request);
$grid->setRouteUrl($this->generateUrl('chamilo_core_resource_list', $params));
$grid->setRouteUrl($this->generateUrl('chamilo_core_resource_list', $resourceParams));
//$grid->hideFilters();
//$grid->setLimits(20);
@ -154,9 +171,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
//$grid->setMaxResults(1);
//$grid->setLimits(2);
//$grid->setColumns($columns);
$routeParams = $courseParams;
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams = $resourceParams;
$routeParams['id'] = null;
$titleColumn = $repository->getTitleColumn($grid);
@ -166,7 +181,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
$titleColumn->setTitle($this->trans('Name'));
//$repository->formatGrid();
/*if ($grid->hasColumn('filetype')) {
$grid->getColumn('filetype')->setTitle($this->trans('Type'));
}*/
@ -449,9 +463,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$resourceNodeParentId = $resourceNode->getId();
$routeParams = $this->getCourseParams();
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams = $this->getResourceParams($request);
$routeParams['id'] = $resourceNodeParentId;
$form = $repository->getForm($this->container->get('form.factory'), $resource);
@ -659,9 +671,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$this->addFlash('success', $this->trans('Deleted'));
$em->flush();
$routeParams = $this->getCourseParams();
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams = $this->getResourceParams($request);
$routeParams['id'] = $parentId;
return $this->redirectToRoute(
@ -702,9 +712,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$this->addFlash('success', $this->trans('Deleted'));
$em->flush();
$routeParams = $this->getCourseParams();
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams = $this->getResourceParams($request);
$routeParams['id'] = $parentId;
return $this->redirectToRoute('chamilo_core_resource_list', $routeParams);
@ -859,7 +867,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$this->setBreadCrumb($request);
$routeParams = $this->getCourseParams();
$routeParams = $this->getResourceParams($request);
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams['id'] = $id;
@ -876,9 +884,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$type = $request->get('type');
$resourceNodeId = $request->get('id');
$routeParams = $this->getCourseParams();
$routeParams['tool'] = $tool;
$routeParams['type'] = $type;
$routeParams = $this->getResourceParams($request);
if (!empty($resourceNodeId)) {
$breadcrumb = $this->getBreadCrumb();
@ -1039,11 +1045,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$course = $this->getCourse();
$session = $this->getSession();
// Default parent node is course.
$parentNode = $course->getResourceNode();
if (!empty($resourceNodeParentId)) {
// Get parent node.
$parentNode = $repository->getResourceNodeRepository()->find($resourceNodeParentId);
}
$parentNode = $this->getParentResourceNode($request);
$this->denyAccessUnlessGranted(
ResourceNodeVoter::CREATE,
@ -1053,12 +1055,10 @@ class ResourceController extends AbstractResourceController implements CourseCon
$form = $repository->getForm($this->container->get('form.factory'));
$courseParams = $this->getCourseParams();
$courseParams = $this->getResourceParams($request);
if ($fileType === 'file') {
$params = $courseParams;
$params['tool'] = $tool;
$params['type'] = $type;
$params['id'] = $resourceNodeParentId;
$form->add(
@ -1163,9 +1163,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$em->flush();
$this->addFlash('success', $this->trans('Saved'));
$params = $this->getCourseParams();
$params['tool'] = $tool;
$params['type'] = $type;
$params = $this->getResourceParams($request);
$params['id'] = $resourceNodeParentId;
return $this->redirectToRoute(

@ -5,8 +5,8 @@ namespace Chamilo\CoreBundle\Controller;
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
use Chamilo\CourseBundle\Entity\CDocument;
use Oneup\UploaderBundle\Controller\BlueimpController;
use Oneup\UploaderBundle\Uploader\File\FileInterface;
use Oneup\UploaderBundle\Uploader\File\FilesystemFile;
@ -56,7 +56,9 @@ class ResourceUploadController extends BlueimpController
// Create repository from tool and type.
$factory = $container->get('Chamilo\CoreBundle\Repository\ResourceFactory');
$repo = $factory->createRepository( $tool, $type);
/** @var ResourceRepository $repo */
$repo = $factory->createRepository($tool, $type);
/** @var ResourceNode $parent */
$parent = $repo->getResourceNodeRepository()->find($id);
@ -82,16 +84,18 @@ class ResourceUploadController extends BlueimpController
$this->dispatchPreUploadEvent($file, $response, $request);
$resource = $repo->saveUpload($file);
// Uploading file.
$document = new CDocument();
/*$document = new CDocument();
$document
->setFiletype('file')
->setTitle($title)
->setSize($file->getSize())
;
;*/
$em->persist($document);
$resourceNode = $repo->createNodeForResource($document, $user, $parent, $file);
$em->persist($resource);
$resourceNode = $repo->createNodeForResource($resource, $user, $parent, $file);
$repo->addResourceNodeToCourse(
$resourceNode,
@ -103,7 +107,7 @@ class ResourceUploadController extends BlueimpController
$em->flush();
// Finish uploading.
$this->dispatchPostEvents($document, $response, $request);
$this->dispatchPostEvents($resource, $response, $request);
/*$chunked ?
$this->handleChunkedUpload($file, $response, $request) :
$this->handleUpload($file, $response, $request);*/

@ -57,7 +57,7 @@ class ResourceUploadListener
'sid' => $sessionId,
]
),
'size' => format_file_size($resource->getSize()),
'size' => format_file_size($resource->getResourceNode()->getResourceFile()->getSize()),
'type' => '',
'result' => 'ok',
]];

@ -3,11 +3,8 @@
namespace Chamilo\CoreBundle\Form\Resource;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Entity\CLink;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;

@ -0,0 +1,43 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Form\Resource;
use Chamilo\CoreBundle\Entity\PersonalFile;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PersonalFileType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('save', SubmitType::class);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
[
'data_class' => PersonalFile::class,
]
);
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'chamilo_personal_file';
}
}

@ -11,12 +11,22 @@ use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\UserBundle\Entity\User;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class IllustrationRepository.
*/
final class IllustrationRepository extends ResourceRepository implements ResourceRepositoryInterface
{
public function saveUpload(UploadedFile $file)
{
/** @var Illustration $resource */
$resource = $this->create();
$resource->setName($file->getClientOriginalName());
return $resource;
}
public function saveResource(FormInterface $form, $course, $session, $fileType)
{
$newResource = $form->getData();

@ -5,15 +5,24 @@ namespace Chamilo\CoreBundle\Repository;
use APY\DataGridBundle\Grid\Column\Column;
use APY\DataGridBundle\Grid\Grid;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\PersonalFile;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class PersonalFileRepository extends ResourceRepository implements ResourceRepositoryInterface
final class PersonalFileRepository extends ResourceRepository implements ResourceRepositoryInterface
{
public function saveUpload(UploadedFile $file)
{
$resource = new PersonalFile();
$resource->setName($file->getClientOriginalName());
return $resource;
}
public function saveResource(FormInterface $form, $course, $session, $fileType)
{
$newResource = $form->getData();

@ -558,6 +558,49 @@ class ResourceRepository extends EntityRepository
return $qb;
}
/**
* @return QueryBuilder
*/
public function getResourcesByCreator(User $user, ResourceNode $parentNode = null)
{
$repo = $this->getRepository();
$className = $repo->getClassName();
$checker = $this->getAuthorizationChecker();
$reflectionClass = $repo->getClassMetadata()->getReflectionClass();
//$isPersonalResource = $reflectionClass->hasProperty('loadPersonalResources');
$type = $this->getResourceType();
$qb = $repo->getEntityManager()->createQueryBuilder()
->select('resource')
->from($className, 'resource')
->innerJoin(
ResourceNode::class,
'node',
Join::WITH,
'resource.resourceNode = node.id'
)
//->innerJoin('node.resourceLinks', 'links')
//->where('node.resourceType = :type')
//->setParameter('type',$type)
;
/*$qb
->andWhere('links.visibility = :visibility')
->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
;*/
if (null !== $parentNode) {
$qb->andWhere('node.parent = :parentNode');
$qb->setParameter('parentNode', $parentNode);
}
$qb->andWhere('node.creator = :creator');
$qb->setParameter('creator', $user);
//var_dump($qb->getQuery()->getSQL(), $type->getId(), $parentNode->getId());exit;
return $qb;
}
/**
* @param Session $session
*/

@ -6,12 +6,15 @@ namespace Chamilo\CoreBundle\Repository;
use APY\DataGridBundle\Grid\Column\Column;
use APY\DataGridBundle\Grid\Grid;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class ResourceRepositoryInterface.
*/
interface ResourceRepositoryInterface
{
public function saveUpload(UploadedFile $file);
public function saveResource(FormInterface $form, $course, $session, $fileType);
//public function updateResource(FormInterface $form);

@ -23,14 +23,6 @@ trait CourseControllerTrait
$this->course = $course;
}
/**
* @return mixed
*/
public function setSession(Session $session)
{
$this->session = $session;
}
/**
* @return Course
*/
@ -39,6 +31,11 @@ trait CourseControllerTrait
return $this->course;
}
public function hasCourse(): bool
{
return null !== $this->course;
}
/**
* @return Session
*/
@ -47,6 +44,14 @@ trait CourseControllerTrait
return $this->session;
}
/**
* @return mixed
*/
public function setSession(Session $session)
{
$this->session = $session;
}
/**
* @return int
*/

@ -218,6 +218,7 @@ class CourseListener
}
}*/
$courseId = (int) $request->get('cid');
$groupId = (int) $request->get('gid');
$sessionId = (int) $request->get('sid');
@ -234,26 +235,29 @@ class CourseListener
//|| $controllerList[0] instanceof LegacyController
)
) {
$controller = $controllerList[0];
$session = $sessionHandler->get('session');
$course = $sessionHandler->get('course');
// Sets the controller course/session in order to use:
// $this->getCourse() $this->getSession() in controllers
if ($course) {
$controller->setCourse($course);
// Legacy code
$courseCode = $course->getCode();
//$courseInfo = api_get_course_info($courseCode);
//$container->get('twig')->addGlobal('course', $course);
//$sessionHandler->set('_real_cid', $course->getId());
//$sessionHandler->set('_cid', $course->getCode());
//$sessionHandler->set('_course', $courseInfo);
}
//var_dump($courseId);
if (!empty($courseId)) {
$controller = $controllerList[0];
$session = $sessionHandler->get('session');
$course = $sessionHandler->get('course');
// Sets the controller course/session in order to use:
// $this->getCourse() $this->getSession() in controllers
if ($course) {
$controller->setCourse($course);
// Legacy code
$courseCode = $course->getCode();
//$courseInfo = api_get_course_info($courseCode);
//$container->get('twig')->addGlobal('course', $course);
//$sessionHandler->set('_real_cid', $course->getId());
//$sessionHandler->set('_cid', $course->getCode());
//$sessionHandler->set('_course', $courseInfo);
}
if ($session) {
$controller->setSession($session);
if ($session) {
$controller->setSession($session);
}
}
// Example 'chamilo_notebook.controller.notebook:indexAction'

@ -10,12 +10,25 @@ use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
use Chamilo\CourseBundle\Entity\CDocument;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class CDocumentRepository.
*/
final class CDocumentRepository extends ResourceRepository implements ResourceRepositoryInterface
{
public function saveUpload(UploadedFile $file)
{
$resource = new CDocument();
$resource
->setFiletype('file')
->setSize($file->getSize())
->setTitle($file->getClientOriginalName())
;
return $resource;
}
public function saveResource(FormInterface $form, $course, $session, $fileType)
{
$newResource = $form->getData();

@ -9,12 +9,25 @@ use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
use Chamilo\CourseBundle\Entity\CLink;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class CLinkRepository.
*/
final class CLinkRepository extends ResourceRepository implements ResourceRepositoryInterface
{
public function saveUpload(UploadedFile $file)
{
$resource = new CLink();
/*$resource
->setFiletype('file')
->setSize($file->getSize())
->setTitle($file->getClientOriginalName())
;*/
return $resource;
}
public function saveResource(FormInterface $form, $course, $session, $fileType)
{
/** @var CLink $newResource */

@ -1,22 +1,22 @@
{% extends "@ChamiloTheme/Layout/layout_one_col.html.twig" %}
{% block content %}
{% if is_granted('EDIT', course) %}
<div class="actions">
<a class="btn btn-secondary"
href="{{ url('chamilo_core_resource_new_folder', {'tool': tool, 'type': type, 'cid': course.id, 'sid': session.id, 'id': id }) }}">
{{ 'New folder' | trans }}
</a>
<a class="btn btn-secondary"
href="{{ url('chamilo_core_resource_new', { 'tool': tool, 'type': type, 'cid': course.id, 'sid': session.id, 'id': id }) }}">
{{ 'Create new document' | trans }}
</a>
<a class="btn btn-secondary"
href="{{ url('chamilo_core_resource_upload', { 'tool': tool, 'type': type, 'cid': course.id, 'sid': session.id, 'id': id }) }}">
{{ 'Upload' | trans }}
</a>
</div>
{% endif %}
{% if is_granted('CREATE', parent_resource_node) %}
<div class="actions">
<a class="btn btn-secondary"
href="{{ url('chamilo_core_resource_new_folder', {'tool': tool, 'type': type, 'cid': course.id, 'sid': session.id, 'id': id }) }}">
{{ 'New folder' | trans }}
</a>
<a class="btn btn-secondary"
href="{{ url('chamilo_core_resource_new', { 'tool': tool, 'type': type, 'cid': course.id, 'sid': session.id, 'id': id }) }}">
{{ 'Create new document' | trans }}
</a>
<a class="btn btn-secondary"
href="{{ url('chamilo_core_resource_upload', { 'tool': tool, 'type': type, 'cid': course.id, 'sid': session.id, 'id': id }) }}">
{{ 'Upload' | trans }}
</a>
</div>
{% endif %}
<style>
.fancybox-slide--iframe .fancybox-content {

@ -4,7 +4,7 @@
<form method="post" action="" >
<div class="box-body">
{{ form_start(form) }}
{{ form_row(form.title) }}
{{ form_widget(form) }}
{{ form_end(form) }}
</div>
</form>

Loading…
Cancel
Save