Add grid filters in order to block edit and delete buttons.

When using a course inside a session.
pull/3064/head
Julio Montoya 6 years ago
parent 351ad9cf04
commit 3863743a2a
  1. 2
      main/course_home/course_home.php
  2. 64
      main/exercise/TestCategory.php
  3. 40
      main/inc/lib/ExerciseCategoryManager.php
  4. 21
      src/CoreBundle/Entity/Resource/ResourceNode.php
  5. 22
      src/CoreBundle/Repository/ResourceRepository.php
  6. 16
      src/CourseBundle/Entity/CQuizQuestionCategory.php
  7. 20
      src/CourseBundle/Traits/SessionCourseResourcesTrait.php
  8. 20
      src/CourseBundle/Traits/ShowCourseResourcesInSessionTrait.php

@ -4,6 +4,6 @@
$courseCode = isset($_GET['cDir']) ? $_GET['cDir'] : '';
$sessionId = isset($_GET['id_session']) ? $_GET['id_session'] : '';
$url = "../../public/courses/$courseCode?session_id=$sessionId";
$url = "../../public/courses/$courseCode?id_session=$sessionId";
header("Location: $url");
exit;

@ -3,6 +3,7 @@
use APY\DataGridBundle\Grid\Action\MassAction;
use APY\DataGridBundle\Grid\Action\RowAction;
use APY\DataGridBundle\Grid\Row;
use APY\DataGridBundle\Grid\Source\Entity;
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
use Chamilo\CoreBundle\Framework\Container;
@ -1062,27 +1063,12 @@ class TestCategory
if (!empty($sessionId)) {
$sessionEntity = api_get_session_entity($sessionId);
}
if (empty($sessionId)) {
$sessionCondition = api_get_session_condition(
$sessionId,
true,
false,
'i.session_id'
);
} else {
$sessionCondition = api_get_session_condition(
$sessionId,
true,
true,
'i.session_id'
);
}
$courseEntity = api_get_course_entity($courseId);
$repo = Container::getQuestionCategoryRepository();
$resources = $repo->getResourcesByCourse($courseEntity, $sessionEntity);
return $resources->getQuery()->getArrayResult();
return $resources->getQuery()->getResult();
}
/**
@ -1093,10 +1079,15 @@ class TestCategory
*/
public function displayCategories($courseId, $sessionId = 0)
{
$course = api_get_course_entity($courseId);
$session = api_get_session_entity($sessionId);
// 1. Set entity
$source = new Entity('ChamiloCourseBundle:CQuizQuestionCategory');
$repo = Container::getQuestionCategoryRepository();
// 2. Get query builder from repo.
$qb = Container::getQuestionCategoryRepository()->getResourcesByCourse(api_get_course_entity());
$qb = $repo->getResourcesByCourse($course, $session);
// 3. Set QueryBuilder to the source.
$source-> initQueryBuilder($qb);
@ -1121,7 +1112,7 @@ class TestCategory
[
'title' => '#',
'primary' => true,
'visible' => false
'visible' => false,
]
)->add(
'title',
@ -1147,10 +1138,17 @@ class TestCategory
[
'id',
'name' => 'exercise/tests_category.php',
'cidReq' => api_get_course_id(),
'cidReq' => $course->getCode(),
'action' => 'editcategory',
]
);
$myRowAction->addManipulateRender(
function (RowAction $action, Row $row) use ($session, $repo) {
return $repo->rowCanBeEdited($session, $action, $row);
}
);
$grid->addRowAction($myRowAction);
$myRowAction = new RowAction(
@ -1164,20 +1162,30 @@ class TestCategory
[
'id',
'name' => 'exercise/tests_category.php',
'cidReq' => api_get_course_id(),
'cidReq' => $course->getCode(),
'action' => 'deletecategory',
]
);
$grid->addRowAction($myRowAction);
// Add mass actions
$deleteMassAction = new MassAction(
'Delete',
['TestCategory', 'deleteResource'],
true,
[]
$myRowAction->addManipulateRender(
function (RowAction $action, Row $row) use ($session, $repo) {
return $repo->rowCanBeEdited($session, $action, $row);
}
);
$grid->addMassAction($deleteMassAction);
$grid->addRowAction($myRowAction);
if (empty($session)) {
// Add mass actions
$deleteMassAction = new MassAction(
'Delete',
['TestCategory', 'deleteResource'],
true,
[],
ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER
);
$grid->addMassAction($deleteMassAction);
}
}
// 8. Set route and request

@ -3,6 +3,7 @@
use APY\DataGridBundle\Grid\Action\MassAction;
use APY\DataGridBundle\Grid\Action\RowAction;
use APY\DataGridBundle\Grid\Row;
use APY\DataGridBundle\Grid\Source\Entity;
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
use Chamilo\CoreBundle\Framework\Container;
@ -276,6 +277,9 @@ JAVASCRIPT;
*/
public function display()
{
$session = api_get_session_entity();
$course = api_get_course_entity();
// Action links
$content = '<div class="actions">';
$content .= '<a href="'.api_get_path(WEB_CODE_PATH).'exercise/exercise.php?'.api_get_cidreq().'">';
@ -298,8 +302,9 @@ JAVASCRIPT;
// 1. Set entity
$source = new Entity('ChamiloCourseBundle:CExerciseCategory');
$repo = Container::getExerciseCategoryRepository();
// 2. Get query builder from repo.
$qb = Container::getExerciseCategoryRepository()->getResourcesByCourse(api_get_course_entity());
$qb = $repo->getResourcesByCourse($course, $session);
// 3. Set QueryBuilder to the source.
$source-> initQueryBuilder($qb);
@ -324,7 +329,7 @@ JAVASCRIPT;
[
'title' => '#',
'primary' => true,
'visible' => false
'visible' => false,
]
)->add(
'name',
@ -347,6 +352,13 @@ JAVASCRIPT;
$myRowAction->setRouteParameters(
['id', 'name' => 'exercise/category.php', 'cidReq' => api_get_course_id(), 'action' => 'edit']
);
$myRowAction->addManipulateRender(
function (RowAction $action, Row $row) use ($session, $repo) {
return $repo->rowCanBeEdited($session, $action, $row);
}
);
$grid->addRowAction($myRowAction);
$myRowAction = new RowAction(
@ -359,16 +371,24 @@ JAVASCRIPT;
$myRowAction->setRouteParameters(
['id', 'name' => 'exercise/category.php', 'cidReq' => api_get_course_id(), 'action' => 'delete']
);
$myRowAction->addManipulateRender(
function (RowAction $action, Row $row) use ($session, $repo) {
return $repo->rowCanBeEdited($session, $action, $row);
}
);
$grid->addRowAction($myRowAction);
// Add mass actions
$deleteMassAction = new MassAction(
'Delete',
['ExerciseCategoryManager', 'deleteResource'],
true,
[]
);
$grid->addMassAction($deleteMassAction);
if (empty($session)) {
// Add mass actions
$deleteMassAction = new MassAction(
'Delete',
['ExerciseCategoryManager', 'deleteResource'],
true,
[]
);
$grid->addMassAction($deleteMassAction);
}
}
// 8. Set route and request

@ -3,8 +3,10 @@
namespace Chamilo\CoreBundle\Entity\Resource;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\UserBundle\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;
@ -357,6 +359,25 @@ class ResourceNode
return $this;
}
/**
* @param Session $session
*
* @return ArrayCollection
*/
public function hasSession(Session $session = null)
{
$links = $this->getResourceLinks();
$criteria = Criteria::create();
$criteria->andWhere(
Criteria::expr()->eq('session', $session)
);
$result = $links->matching($criteria);
return $result;
}
/**
* @return bool
*/

@ -3,6 +3,8 @@
namespace Chamilo\CoreBundle\Repository;
use APY\DataGridBundle\Grid\Action\RowAction;
use APY\DataGridBundle\Grid\Row;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
@ -471,7 +473,7 @@ class ResourceRepository extends EntityRepository
// Check if this resource type requires to load the base course resources when using a session
$loadBaseSessionContent = $repo->getClassMetadata()->getReflectionClass()->hasProperty(
'loadBaseCourseResourcesFromSession'
'loadCourseResourcesInSession'
);
$type = $this->getResourceType();
@ -502,9 +504,11 @@ class ResourceRepository extends EntityRepository
$qb->andWhere('links.session IS NULL');
} else {
if ($loadBaseSessionContent) {
// Load course base content.
$qb->andWhere('links.session = :session OR links.session IS NULL');
$qb->setParameter('session', $session);
} else {
// Load only session resources.
$qb->andWhere('links.session = :session');
$qb->setParameter('session', $session);
}
@ -549,6 +553,22 @@ class ResourceRepository extends EntityRepository
return $qb->getResult();
}
public function rowCanBeEdited($session, RowAction $action, Row $row)
{
if (!empty($session)) {
/** @var \Chamilo\CoreBundle\Entity\Resource\AbstractResource $entity */
$entity = $row->getEntity();
$hasSession = $entity->getResourceNode()->hasSession($session);
if ($hasSession->count() > 0) {
return $action;
}
return null;
}
return $action;
}
/**
* @param string $tool
*

@ -5,8 +5,8 @@ namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceInterface;
use Chamilo\CourseBundle\Traits\SessionCourseResources;
use Chamilo\CourseBundle\Traits\SessionCourseResourcesTrait;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CourseBundle\Traits\ShowCourseResourcesInSessionTrait;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
@ -23,7 +23,7 @@ use Doctrine\ORM\Mapping as ORM;
*/
class CQuizQuestionCategory extends AbstractResource implements ResourceInterface
{
use SessionCourseResourcesTrait;
use ShowCourseResourcesInSessionTrait;
/**
* @var int
@ -176,7 +176,7 @@ class CQuizQuestionCategory extends AbstractResource implements ResourceInterfac
}
/**
* @param mixed $session
* @param Session $session
*
* @return CQuizQuestionCategory
*/
@ -187,6 +187,14 @@ class CQuizQuestionCategory extends AbstractResource implements ResourceInterfac
return $this;
}
/**
* @return bool
*/
public function hasSession()
{
return $this->session !== null;
}
/**
* @ORM\PostPersist()
*

@ -1,20 +0,0 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CourseBundle\Traits;
/**
* Trait SessionCourseResourcesTrait.
*/
trait SessionCourseResourcesTrait
{
protected $loadBaseCourseResourcesFromSession = true;
/**
* @return bool
*/
public function isLoadBaseCourseResourcesFromSession(): bool
{
return $this->loadBaseCourseResourcesFromSession;
}
}

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