Add shortcut button in exercises.

pull/3064/head
Julio 6 years ago
parent c3fb9f452c
commit faab0f81bb
  1. 52
      public/main/exercise/exercise.class.php
  2. 12
      public/main/exercise/exercise.php
  3. 16
      src/CoreBundle/Controller/CourseHomeController.php
  4. 9
      src/CoreBundle/Framework/Container.php
  5. 110
      src/CoreBundle/Repository/ResourceRepository.php
  6. 28
      src/CourseBundle/Entity/CShortcut.php
  7. 35
      src/CourseBundle/Repository/CShortcutRepository.php
  8. 19
      src/ThemeBundle/Resources/views/Course/home.html.twig

@ -6010,7 +6010,7 @@ class Exercise
'#student_complete_name#' => $user_info['complete_name'],
'#course#' => Display::url(
$courseInfo['title'],
$courseInfo['course_public_url'].'?id_session='.$sessionId
$courseInfo['course_public_url'].'?sid='.$sessionId
),
];
@ -8415,8 +8415,8 @@ class Exercise
'legacy_main',
[
'name' => 'exercise/overview.php',
'cidReq' => $course->getCode(),
'id_session' => $sessionId,
'cid' => $course->getId(),
'sid' => $sessionId,
'exerciseId' => $row->getField('id'),
]
);
@ -8440,8 +8440,8 @@ class Exercise
[
'id',
'name' => 'exercise/exercise_admin.php',
'cidReq' => $course->getCode(),
'id_session' => $sessionId,
'cid' => $course->getId(),
'sid' => $sessionId,
]
);
$grid->addRowAction($myRowAction);
@ -8458,8 +8458,32 @@ class Exercise
[
'id',
'name' => 'exercise/admin.php',
'cidReq' => $course->getCode(),
'id_session' => $sessionId,
'cid' => $course->getId(),
'sid' => $sessionId,
]
);
$myRowAction->addManipulateRender(
function (RowAction $action, Row $row) use ($session, $repo) {
return $repo->rowCanBeEdited($action, $row, $session);
}
);
$grid->addRowAction($myRowAction);
// Shortcut
$myRowAction = new RowAction(
get_lang('Add shortcut'),
'legacy_main',
false,
'_self',
['class' => 'btn btn-secondary']
);
$myRowAction->setRouteParameters(
[
'id',
'name' => 'exercise/exercise.php',
'action' => 'add_shortcut',
'cid' => $course->getId(),
'sid' => $sessionId,
]
);
$myRowAction->addManipulateRender(
@ -8481,8 +8505,8 @@ class Exercise
[
'id',
'name' => 'exercise/exercise_report.php',
'cidReq' => $course->getCode(),
'id_session' => $sessionId,
'cid' => $course->getId(),
'sid' => $sessionId,
]
);
$myRowAction->addManipulateRender(
@ -8522,8 +8546,8 @@ class Exercise
$params = [
'id' => $exercise->getIid(),
'name' => 'exercise/exercise.php',
'cidReq' => $course->getCode(),
'id_session' => $sessionId,
'cid' => $course->getId(),
'sid' => $sessionId,
'action' => $visibleChoice,
];
@ -8552,8 +8576,8 @@ class Exercise
[
'id',
'name' => 'exercise/exercise.php',
'cidReq' => $course->getCode(),
'id_session' => $sessionId,
'cid' => $course->getId(),
'sid' => $sessionId,
'action' => 'delete',
]
);
@ -9081,7 +9105,7 @@ class Exercise
$msg = str_replace('#mail#', $user_info['email'], $msg);
$msg = str_replace(
'#course#',
Display::url($courseInfo['title'], $courseInfo['course_public_url'].'?id_session='.$sessionId),
Display::url($courseInfo['title'], $courseInfo['course_public_url'].'?sid='.$sessionId),
$msg
);

@ -88,6 +88,18 @@ if ($is_allowedToEdit && !empty($action)) {
}
switch ($action) {
case 'add_shortcut':
$repo = Container::getShortcutRepository();
$shortCut = new \Chamilo\CourseBundle\Entity\CShortcut();
$shortCut->setName($objExerciseTmp->get_formated_title());
$shortCut->setShortCutNode($exerciseEntity->getResourceNode());
$courseEntity = api_get_course_entity(api_get_course_int_id());
$repo->addResourceNode($shortCut, api_get_user_entity(api_get_user_id()), $courseEntity);
$repo->getEntityManager()->flush();
Display::addFlash(Display::return_message(get_lang('Updated')));
break;
case 'enable_launch':
$objExerciseTmp->cleanCourseLaunchSettings();
$objExerciseTmp->enableAutoLaunch();

@ -9,6 +9,7 @@ use Chamilo\CoreBundle\ToolChain;
use Chamilo\CourseBundle\Controller\ToolBaseController;
use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\CourseBundle\Manager\SettingsManager;
use Chamilo\CourseBundle\Repository\CShortcutRepository;
use Chamilo\CourseBundle\Repository\CToolRepository;
use Chamilosession as Session;
use CourseManager;
@ -39,7 +40,7 @@ class CourseHomeController extends ToolBaseController
*
* @Entity("course", expr="repository.find(cid)")
*/
public function indexAction(Request $request, CToolRepository $toolRepository, ToolChain $toolChain)
public function indexAction(Request $request, CToolRepository $toolRepository, CShortcutRepository $shortcutRepository, ToolChain $toolChain)
{
$this->autoLaunch();
$course = $this->getCourse();
@ -121,9 +122,16 @@ class CourseHomeController extends ToolBaseController
$qb = $toolRepository->getResourcesByCourse($course, $this->getSession());
$result = $qb->getQuery()->getResult();
$shortcutQuery = $shortcutRepository->getResources($this->getUser(), $course->getResourceNode(), $course);
$shortcuts = $shortcutQuery->getQuery()->getResult();
$tools = [];
/** @var CTool $item */
foreach ($result as $item) {
if ('course_tool' === $item->getTool()->getName()) {
continue;
}
$toolModel = $toolChain->getToolFromName($item->getTool()->getName());
if ('admin' === $toolModel->getCategory() && !$this->isGranted('ROLE_CURRENT_COURSE_TEACHER')) {
@ -193,13 +201,9 @@ class CourseHomeController extends ToolBaseController
'@ChamiloTheme/Course/home.html.twig',
[
'course' => $course,
'shortcuts' => $shortcuts,
'diagram' => $diagram,
// 'session_info' => $sessionInfo,
'tools' => $tools,
//'edit_icons' => $editIcons,
//'introduction_text' => $introduction,
'exercise_warning' => null,
'lp_warning' => null,
]
);
}

@ -18,6 +18,7 @@ use Chamilo\CourseBundle\Repository\CLpRepository;
use Chamilo\CourseBundle\Repository\CQuizQuestionCategoryRepository;
use Chamilo\CourseBundle\Repository\CQuizQuestionRepository;
use Chamilo\CourseBundle\Repository\CQuizRepository;
use Chamilo\CourseBundle\Repository\CShortcutRepository;
use Chamilo\CourseBundle\Repository\CStudentPublicationAssignmentRepository;
use Chamilo\CourseBundle\Repository\CStudentPublicationCommentRepository;
use Chamilo\CourseBundle\Repository\CStudentPublicationRepository;
@ -384,6 +385,14 @@ class Container
return self::$container->get('Chamilo\CoreBundle\Repository\IllustrationRepository');
}
/**
* @return CShortcutRepository
*/
public static function getShortcutRepository()
{
return self::$container->get('Chamilo\CourseBundle\Repository\CShortcutRepository');
}
/**
* @return CStudentPublicationRepository
*/

@ -351,19 +351,6 @@ class ResourceRepository extends BaseEntityRepository
$em->persist($link);
}
/**
* @return ResourceType
*/
public function getResourceType()
{
$em = $this->getEntityManager();
$service = get_class($this);
$name = $this->toolChain->getResourceTypeNameFromRepository($service);
$repo = $em->getRepository('ChamiloCoreBundle:Resource\ResourceType');
return $repo->findOneBy(['name' => $name]);
}
public function addResourceToMe(ResourceNode $resourceNode): ResourceLink
{
$resourceLink = new ResourceLink();
@ -391,19 +378,6 @@ class ResourceRepository extends BaseEntityRepository
return $resourceLink;
}
public function addResourceToCourse2(ResourceNode $resourceNode, Course $course, ResourceRight $right): ResourceLink
{
$resourceLink = new ResourceLink();
$resourceLink
->setResourceNode($resourceNode)
->setCourse($course)
->addResourceRight($right);
$this->getEntityManager()->persist($resourceLink);
$this->getEntityManager()->flush();
return $resourceLink;
}
public function addResourceToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
{
$resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
@ -493,6 +467,19 @@ class ResourceRepository extends BaseEntityRepository
}
}
/**
* @return ResourceType
*/
public function getResourceType()
{
$em = $this->getEntityManager();
$service = get_class($this);
$name = $this->toolChain->getResourceTypeNameFromRepository($service);
$repo = $em->getRepository('ChamiloCoreBundle:Resource\ResourceType');
return $repo->findOneBy(['name' => $name]);
}
/**
* @return QueryBuilder
*/
@ -501,7 +488,6 @@ class ResourceRepository extends BaseEntityRepository
$repo = $this->getRepository();
$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
@ -579,11 +565,6 @@ class ResourceRepository extends BaseEntityRepository
{
$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')
@ -620,9 +601,6 @@ class ResourceRepository extends BaseEntityRepository
return $this->getRepository()->findOneBy(['resourceNode' => $resourceNodeId]);
}
/**
* @param Session $session
*/
public function rowCanBeEdited(RowAction $action, Row $row, Session $session = null): ?RowAction
{
if (null !== $session) {
@ -650,29 +628,6 @@ class ResourceRepository extends BaseEntityRepository
$em->flush();
}
/**
* Change all links visibility to DELETED.
*/
public function softDelete(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
}
public function setVisibilityPublished(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PUBLISHED);
}
public function setVisibilityDraft(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DRAFT);
}
public function setVisibilityPending(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PENDING);
}
public function getResourceFileContent(AbstractResource $resource): string
{
try {
@ -748,6 +703,18 @@ class ResourceRepository extends BaseEntityRepository
}
}
public function getResourceSettings(): ResourceSettings
{
$settings = new ResourceSettings();
$settings
->setAllowNodeCreation(false)
->setAllowResourceCreation(false)
->setAllowResourceUpload(false)
;
return $settings;
}
/**
* @param string $content
*
@ -774,16 +741,27 @@ class ResourceRepository extends BaseEntityRepository
}
}
public function getResourceSettings(): ResourceSettings
/**
* Change all links visibility to DELETED.
*/
public function softDelete(AbstractResource $resource)
{
$settings = new ResourceSettings();
$settings
->setAllowNodeCreation(false)
->setAllowResourceCreation(false)
->setAllowResourceUpload(false)
;
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
}
return $settings;
public function setVisibilityPublished(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PUBLISHED);
}
public function setVisibilityDraft(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DRAFT);
}
public function setVisibilityPending(AbstractResource $resource)
{
$this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PENDING);
}
private function setLinkVisibility(AbstractResource $resource, int $visibility, bool $recursive = true): bool

@ -33,6 +33,14 @@ class CShortcut extends AbstractResource implements ResourceInterface
*/
protected $name;
/**
* @ORM\OneToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", mappedBy="resource", cascade={"remove"}, orphanRemoval=true
* )
* @ORM\JoinColumn(name="shortcut_node_id", referencedColumnName="id", onDelete="CASCADE")
*/
public $shortCutNode;
public function __toString(): string
{
return $this->getName();
@ -62,4 +70,24 @@ class CShortcut extends AbstractResource implements ResourceInterface
{
return $this->getName();
}
/**
* @return mixed
*/
public function getShortCutNode()
{
return $this->shortCutNode;
}
/**
* @param mixed $shortCutNode
*
* @return CShortcut
*/
public function setShortCutNode($shortCutNode)
{
$this->shortCutNode = $shortCutNode;
return $this;
}
}

@ -14,17 +14,48 @@ use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
use Chamilo\CourseBundle\Entity\CGroupInfo;
use Chamilo\UserBundle\Entity\User;
use Doctrine\ORM\Query\Expr\Join;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class CDocumentRepository.
* Class CShortcutRepository.
*/
final class CShortcutRepository extends ResourceRepository implements ResourceRepositoryInterface
{
public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroupInfo $group = null)
{
return $this->getResourcesByCourse($course, $session, $group, $parentNode);
$repo = $this->getRepository();
$className = $repo->getClassName();
$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(), $parentNode->getId());exit;
return $qb;
}
public function getResourceSettings(): ResourceSettings

@ -90,6 +90,25 @@
</div>
{% endfor %}
{% endfor %}
{% for shortcut in shortcuts %}
<div class="items-tools">
<div class="tools mt-3 mb-3">
<div class="big_icon">
{# <a href=" {{ url('chamilo_core_course_redirect_tool', { 'toolId': item.id, 'cid': course.id })|raw }}" >#}
{# <img src="{{ asset('img/tools/' ~ item.name ~ '.png') }}" />#}
{# </a>#}
</div>
<div class="content pt-2 pb-2">
{{ shortcut.link }}
{# <a href=" {{ item.href|raw }}" >#}
{# {{ item.name | trans }}#}
{# </a>#}
</div>
</div>
</div>
{% endfor %}
</div>
{% endautoescape %}
{% endblock %}

Loading…
Cancel
Save