Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/src/CoreBundle/ToolChain.php

162 lines
4.6 KiB

<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
use Chamilo\CoreBundle\Entity\Tool;
use Chamilo\CoreBundle\Entity\ToolResourceRight;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
use Chamilo\CoreBundle\Tool\AbstractTool;
use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\SettingsBundle\Manager\SettingsManager;
use Doctrine\Common\Persistence\ObjectManager;
/**
* Class ToolChain.
*
* The course tools classes (agenda, blog, etc) are located in:
*
* src/Chamilo/CourseBundle/Tool
*
* All this classes are registered as a service with the tag "chamilo_core.tool" here:
* src/Chamilo/CoreBundle/Resources/config/tools.yml
*
* The register process is made using the class ToolCompilerClass:
*
* src/Chamilo/CoreBundle/DependencyInjection/Compiler/ToolCompilerClass.php
* The tool chain is just an array that includes all the tools registered in services.yml
*
* The tool chain is hook when a new course is created via a listener here:
* src/Chamilo/CoreBundle/Entity/Listener/CourseListener.php
* After a course is created this function is called: CourseListener::prePersist()
* This function includes the called to the function "addToolsInCourse" inside the tool chain.
* This allows to tools more easily. Steps:
* 1. Create a new tool class here: src/Chamilo/CoreBundle/Tool
* 2. Add the class as a service here: src/Chamilo/CoreBundle/Resources/config/tools.yml (see examples there)
* 3. Create a new course. When you create a new course the new tool will be created.
*/
class ToolChain
{
protected $tools;
/**
* Construct.
*/
public function __construct()
{
$this->tools = [];
}
public function addTool(AbstractTool $tool): void
{
$this->tools[$tool->getName()] = $tool;
}
public function getTools(): array
{
return $this->tools;
}
public function createTools(ObjectManager $manager): void
{
$tools = $this->getTools();
/** @var AbstractTool $tool */
foreach ($tools as $tool) {
$toolEntity = new Tool();
$toolEntity
->setName($tool->getName())
->setImage($tool->getImage())
->setDescription('')
;
if ($tool->getAdmin() === 1) {
// Only check ROLE_ADMIN
} else {
$this->setToolPermissions($toolEntity);
}
$manager->persist($toolEntity);
$types = $tool->getTypes();
if (!empty($types)) {
foreach ($types as $type) {
$resourceType = new ResourceType();
$resourceType->setName($type);
$resourceType->setTool($toolEntity);
$manager->persist($resourceType);
}
}
$manager->flush();
}
}
public function setToolPermissions(Tool $tool): void
{
$toolResourceRight = new ToolResourceRight();
$toolResourceRight
->setRole('ROLE_TEACHER')
->setMask(ResourceNodeVoter::getEditorMask())
;
$toolResourceRightReader = new ToolResourceRight();
$toolResourceRightReader
->setRole('ROLE_STUDENT')
->setMask(ResourceNodeVoter::getReaderMask())
;
$tool->addToolResourceRight($toolResourceRight);
$tool->addToolResourceRight($toolResourceRightReader);
}
public function addToolsInCourse(Course $course, SettingsManager $settingsManager): Course
{
$tools = $this->getTools();
$toolVisibility = $settingsManager->getSetting('course.active_tools_on_create');
/** @var AbstractTool $tool */
foreach ($tools as $tool) {
$toolEntity = new CTool();
$visibility = in_array($tool->getName(), $toolVisibility);
$toolEntity
->setCourse($course)
->setImage($tool->getImage())
->setName($tool->getName())
->setVisibility($visibility)
->setLink($tool->getLink())
->setTarget($tool->getTarget())
->setCategory($tool->getCategory());
$course->addTools($toolEntity);
}
return $course;
}
/**
* @param string $name
*
* @return AbstractTool|false
*/
public function getToolFromName($name)
{
$tools = $this->getTools();
if (array_key_exists($name, $tools)) {
return $tools[$name];
}
return false;
}
}