Completed
Push — master ( 667dde...0fb228 )
by Julito
13:48
created

ToolChain::updateTools()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 31
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 18
nc 5
nop 1
dl 0
loc 31
rs 9.3554
c 1
b 0
f 0
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle;
5
6
use Chamilo\CoreBundle\Entity\Course;
7
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
8
use Chamilo\CoreBundle\Entity\Tool;
9
use Chamilo\CoreBundle\Entity\ToolResourceRight;
10
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
11
use Chamilo\CoreBundle\Tool\AbstractTool;
12
use Chamilo\CourseBundle\Entity\CTool;
13
use Chamilo\SettingsBundle\Manager\SettingsManager;
14
use Doctrine\Common\Persistence\ObjectManager;
15
use Symfony\Component\PropertyAccess\Exception\InvalidArgumentException;
16
17
/**
18
 * Class ToolChain.
19
 *
20
 * The course tools classes (agenda, blog, etc) are located in:
21
 *
22
 * src/Chamilo/CourseBundle/Tool
23
 *
24
 * All this classes are registered as a service with the tag "chamilo_core.tool" here:
25
26
 * src/Chamilo/CoreBundle/Resources/config/tools.yml
27
 *
28
 * The register process is made using the class ToolCompilerClass:
29
 *
30
 * src/Chamilo/CoreBundle/DependencyInjection/Compiler/ToolCompilerClass.php
31
32
 * The tool chain is just an array that includes all the tools registered in services.yml
33
 *
34
 * The tool chain is hook when a new course is created via a listener here:
35
36
 * src/Chamilo/CoreBundle/Entity/Listener/CourseListener.php
37
38
 * After a course is created this function is called: CourseListener::prePersist()
39
 * This function includes the called to the function "addToolsInCourse" inside the tool chain.
40
41
 * This allows to tools more easily. Steps:
42
43
 * 1. Create a new tool class here: src/Chamilo/CoreBundle/Tool
44
 * 2. Add the class as a service here: src/Chamilo/CoreBundle/Resources/config/tools.yml  (see examples there)
45
 * 3. Create a new course. When you create a new course the new tool will be created.
46
 */
47
class ToolChain
48
{
49
    /**
50
     * @var array
51
     */
52
    protected $tools;
53
54
    /**
55
     * Construct.
56
     */
57
    public function __construct()
58
    {
59
        $this->tools = [];
60
    }
61
62
    public function addTool(AbstractTool $tool): void
63
    {
64
        $this->tools[$tool->getName()] = $tool;
65
    }
66
67
    public function getTools(): array
68
    {
69
        return $this->tools;
70
    }
71
72
    public function createTools(ObjectManager $manager): void
73
    {
74
        $tools = $this->getTools();
75
76
        /** @var AbstractTool $tool */
77
        foreach ($tools as $tool) {
78
            $toolEntity = new Tool();
79
            $toolEntity
80
                ->setName($tool->getName())
81
            ;
82
83
            if ($tool->getAdmin() === 1) {
84
                // Only check ROLE_ADMIN
85
            } else {
86
                $this->setToolPermissions($toolEntity);
87
            }
88
89
            $manager->persist($toolEntity);
90
91
            $types = $tool->getResourceTypes();
92
            if (!empty($types)) {
93
                foreach ($types as $name => $data) {
94
                    $resourceType = new ResourceType();
95
                    $resourceType->setName($name);
96
                    $resourceType->setEntityName($data['entity']);
97
                    $resourceType->setTool($toolEntity);
98
                    $manager->persist($resourceType);
99
                }
100
            }
101
102
            $manager->flush();
103
        }
104
    }
105
106
    public function updateTools(ObjectManager $manager): void
107
    {
108
        $tools = $this->getTools();
109
110
        /** @var AbstractTool $tool */
111
        foreach ($tools as $tool) {
112
            $toolEntity = new Tool();
113
            $toolEntity
114
                ->setName($tool->getName())
115
            ;
116
117
            if ($tool->getAdmin() === 1) {
118
                // Only check ROLE_ADMIN
119
            } else {
120
                $this->setToolPermissions($toolEntity);
121
            }
122
123
            $manager->persist($toolEntity);
124
125
            $types = $tool->getResourceTypes();
126
            if (!empty($types)) {
127
                foreach ($types as $name => $data) {
128
                    $resourceType = new ResourceType();
129
                    $resourceType->setName($name);
130
                    $resourceType->setEntityName($data['entity']);
131
                    $resourceType->setTool($toolEntity);
132
                    $manager->persist($resourceType);
133
                }
134
            }
135
136
            $manager->flush();
137
        }
138
    }
139
140
    public function setToolPermissions(Tool $tool): void
141
    {
142
        $toolResourceRight = new ToolResourceRight();
143
        $toolResourceRight
144
            ->setRole('ROLE_TEACHER')
145
            ->setMask(ResourceNodeVoter::getEditorMask())
146
        ;
147
148
        $toolResourceRightReader = new ToolResourceRight();
149
        $toolResourceRightReader
150
            ->setRole('ROLE_STUDENT')
151
            ->setMask(ResourceNodeVoter::getReaderMask())
152
        ;
153
154
        $tool->addToolResourceRight($toolResourceRight);
155
        $tool->addToolResourceRight($toolResourceRightReader);
156
    }
157
158
    public function addToolsInCourse(Course $course, SettingsManager $settingsManager): Course
159
    {
160
        $tools = $this->getTools();
161
162
        $toolVisibility = $settingsManager->getSetting('course.active_tools_on_create');
163
        /** @var AbstractTool $tool */
164
        foreach ($tools as $tool) {
165
            $toolEntity = new CTool();
166
            $visibility = in_array($tool->getName(), $toolVisibility);
167
168
            $toolEntity
169
                ->setCourse($course)
170
                ->setImage($tool->getImage())
171
                ->setName($tool->getName())
172
                ->setVisibility($visibility)
173
                ->setLink($tool->getLink())
174
                ->setTarget($tool->getTarget())
175
                ->setCategory($tool->getCategory());
176
177
            $course->addTools($toolEntity);
178
        }
179
180
        return $course;
181
    }
182
183
    /**
184
     * @param string $name
185
     *
186
     * @return AbstractTool
187
     */
188
    public function getToolFromName($name)
189
    {
190
        $tools = $this->getTools();
191
192
        if (array_key_exists($name, $tools)) {
193
            return $tools[$name];
194
        }
195
196
        throw new InvalidArgumentException(sprintf("The Tool '%s' doesn't exist.", $name));
197
    }
198
}
199