Passed
Push — 1.11.x ( 24970b...636aa7 )
by Julito
09:26 queued 12s
created

UserRemoteServicePlugin::updateService()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 4
rs 10
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
use Chamilo\PluginBundle\UserRemoteService\UserRemoteService;
5
use Doctrine\ORM\OptimisticLockException;
6
7
class UserRemoteServicePlugin extends Plugin
8
{
9
    const TABLE = 'plugin_user_remote_service';
10
11
    /**
12
     * UserRemoteServicePlugin constructor.
13
     */
14
    protected function __construct()
15
    {
16
        parent::__construct(
17
            '1.0',
18
            'Sébastien Ducoulombier',
19
            [
20
                'salt' => 'text',
21
            ]
22
        );
23
        $this->isAdminPlugin = true;
24
    }
25
26
    /**
27
     * Caches and returns a single instance.
28
     *
29
     * @return UserRemoteServicePlugin
30
     */
31
    public static function create()
32
    {
33
        static $result = null;
34
35
        return $result ? $result : $result = new self();
36
    }
37
38
    /**
39
     * Creates the plugin table.
40
     */
41
    public function install()
42
    {
43
        Database::query(
44
            sprintf(
45
                <<<OEQ
46
create table if not exists %s (
47
    id int unsigned not null auto_increment primary key,
48
    title varchar(255) not null,
49
    url varchar(255) not null
50
)
51
OEQ,
52
                Database::get_main_table(self::TABLE)
53
            )
54
        );
55
    }
56
57
    /**
58
     * Drops the plugin table.
59
     */
60
    public function uninstall()
61
    {
62
        Database::query('drop table if exists '.Database::get_main_table(self::TABLE));
63
    }
64
65
    /**
66
     * @return string the salt setting
67
     */
68
    public function salt()
69
    {
70
        return $this->get('salt');
71
    }
72
73
    /**
74
     * Retrieves the list of all services.
75
     *
76
     * @return UserRemoteService[]
77
     */
78
    public function getServices()
79
    {
80
        return Database::getManager()->getRepository(
81
            'Chamilo\PluginBundle\UserRemoteService\UserRemoteService'
82
        )->findAll();
83
    }
84
85
    /**
86
     * Adds a new service.
87
     *
88
     * @param string $title
89
     * @param string $url
90
     *
91
     * @throws OptimisticLockException
92
     */
93
    public function addService($title, $url)
94
    {
95
        $service = new UserRemoteService;
96
        $service->setTitle($title);
97
        $service->setURL($url);
98
        Database::getManager()->persist($service);
99
        Database::getManager()->flush();
100
    }
101
102
    /**
103
     * Removes a service.
104
     *
105
     * @param UserRemoteService $service
106
     *
107
     * @throws OptimisticLockException
108
     */
109
    public function removeService($service)
110
    {
111
        Database::getManager()->remove($service);
112
        Database::getManager()->flush();
113
    }
114
115
    /**
116
     * Updates a service.
117
     *
118
     * @param UserRemoteService $service
119
     *
120
     * @throws OptimisticLockException
121
     */
122
    public function updateService($service)
123
    {
124
        Database::getManager()->persist($service);
125
        Database::getManager()->flush();
126
    }
127
128
    /**
129
     * Returns the active service id.
130
     *
131
     * @return int|null
132
     */
133
    public function getActiveServiceId()
134
    {
135
        return array_key_exists('serviceId', $_REQUEST) ? intval($_REQUEST['serviceId']) : null;
136
    }
137
138
    /**
139
     * Generates the menu items to be appended to the navigation array
140
     *
141
     * @see \return_navigation_array
142
     *
143
     * @return array menu items
144
     */
145
    public function getNavigationMenu()
146
    {
147
        $menu = [];
148
        $activeServiceId = $this->getActiveServiceId();
149
        foreach ($this->getServices() as $service) {
150
            $key = 'service_'.$service->getId();
151
            $current = $service->getId() == $activeServiceId;
152
            $menu[$key] = [
153
                'key' => $key,
154
                'current' => $current ? 'active' : '',
155
                'url' => sprintf(
156
                    '%s%s/iframe.php?serviceId=%d',
157
                    api_get_path(WEB_PLUGIN_PATH),
158
                    $this->get_name(),
159
                    $service->getId()
160
                ),
161
                'title' => $service->getTitle(),
162
            ];
163
        }
164
        return $menu;
165
    }
166
167
    /**
168
     * Generates and handles submission of the creation form.
169
     *
170
     * @throws OptimisticLockException
171
     *
172
     * @return FormValidator
173
     */
174
    public function getCreationForm()
175
    {
176
        $form = new FormValidator('creationForm');
177
        $titleText = $form->addText('title', get_lang('ServiceTitle'));
178
        $urlText = $form->addText('url', get_lang('ServiceURL'));
179
        $form->addButtonCreate(get_lang('CreateService'));
180
        if ($form->validate()) {
181
            $this->addService($titleText->getValue(), $urlText->getValue());
182
        }
183
        return $form;
184
    }
185
186
    /**
187
     * Generates and handles submission of the service deletion form.
188
     *
189
     * @throws OptimisticLockException
190
     *
191
     * @return FormValidator
192
     */
193
    public function getDeletionForm()
194
    {
195
        $form = new FormValidator('deletionForm');
196
        $services = $this->getServices();
197
        $options = [];
198
        foreach ($services as $service) {
199
            $options[$service->getId()] = $service->getTitle();
200
        }
201
        $serviceIdSelect = $form->addSelect('serviceId', get_lang('ServicesToDelete'), $options);
202
        $serviceIdSelect->setMultiple(true);
203
        $form->addButtonDelete(get_lang('DeleteServices'));
204
        if ($form->validate()) {
205
            foreach ($serviceIdSelect->getValue() as $serviceId) {
206
                foreach ($services as $service) {
207
                    if ($service->getId() == $serviceId) {
208
                        $this->removeService($service);
209
                    }
210
                }
211
            }
212
        }
213
        return $form;
214
    }
215
216
    /**
217
     * Generates the service HTML table.
218
     *
219
     * @return string
220
     */
221
    public function getServiceHTMLTable()
222
    {
223
        $html = '';
224
        $services = $this->getServices();
225
        if (!empty($services)) {
226
            $table = new HTML_Table('class="table"');
227
            $table->addRow(
228
                [
229
                    get_lang('ServiceTitle'),
230
                    get_lang('ServiceURL'),
231
                ],
232
                null,
233
                'th'
234
            );
235
            foreach ($services as $service) {
236
                $table->addRow([
237
                    $service->getTitle(),
238
                    $service->getURL(),
239
                ]);
240
            }
241
            $html = $table->toHtml();
242
        }
243
        return $html;
244
    }
245
246
    /**
247
     * Retrieves one service.
248
     *
249
     * @param int $id the service identifier
250
     *
251
     * @return UserRemoteService the service
252
     */
253
    public function getService($id)
254
    {
255
        return Database::getManager()->getRepository(
256
            'Chamilo\PluginBundle\UserRemoteService\UserRemoteService'
257
        )->find($id);
258
    }
259
260
    /**
261
     * Generates the iframe HTML element to load a service URL
262
     *
263
     * @throws Exception on hash generation failure
264
     *
265
     * @return string the iframe HTML element
266
     */
267
    public function getIFrame()
268
    {
269
        $userInfo = api_get_user_info();
270
        return sprintf(
271
            <<<HTML
272
<div class="embed-responsive embed-responsive-16by9">
273
 <iframe class="embed-responsive-item" src="%s"></iframe>
274
</div>
275
HTML,
276
            $this->getService(
277
                $this->getActiveServiceId()
278
            )->getCustomUserURL($userInfo['username'], $userInfo['id'], $this->salt())
279
        );
280
    }
281
}
282