Passed
Push — master ( 335c59...1f66c0 )
by Julito
07:27
created

SettingsController::indexAction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Controller\Admin;
6
7
use Chamilo\SettingsBundle\Manager\SettingsManager;
8
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
9
use Sylius\Bundle\SettingsBundle\Controller\SettingsController as SyliusSettingsController;
10
use Sylius\Bundle\SettingsBundle\Form\Factory\SettingsFormFactory;
11
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
12
use Symfony\Component\Form\Extension\Core\Type\TextType;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpFoundation\Response;
15
use Symfony\Component\Routing\Annotation\Route;
16
use Symfony\Component\Translation\Translator;
17
use Symfony\Component\Validator\Exception\ValidatorException;
18
use Symfony\Contracts\Translation\TranslatorInterface;
19
20
/**
21
 * Class SettingsController.
22
 */
23
class SettingsController extends SyliusSettingsController
24
{
25
    public static function getSubscribedServices(): array
26
    {
27
        $services = parent::getSubscribedServices();
28
        $services['chamilo.settings.manager'] = SettingsManager::class;
29
        $services['chamilo_settings.form_factory.settings'] = SettingsFormFactory::class;
30
        $services['translator'] = TranslatorInterface::class;
31
32
        return $services;
33
    }
34
35
    /**
36
     * @Security("has_role('ROLE_ADMIN')")
37
     *
38
     * @Route("/settings", name="admin_settings")
39
     */
40
    public function indexAction(): Response
41
    {
42
        $manager = $this->getSettingsManager();
43
        $schemas = $manager->getSchemas();
44
45
        return $this->render(
46
            '@ChamiloTheme/Admin/Settings/index.html.twig',
47
            [
48
                'schemas' => $schemas,
49
            ]
50
        );
51
    }
52
53
    /**
54
     * Edit configuration with given namespace.
55
     *
56
     * @Security("has_role('ROLE_ADMIN')")
57
     *
58
     * @Route("/settings/search_settings", name="chamilo_platform_settings_search")
59
     */
60
    public function searchSettingAction(Request $request): Response
61
    {
62
        $manager = $this->getSettingsManager();
63
        $formList = [];
64
        $keyword = $request->get('keyword');
65
66
        $searchForm = $this->getSearchForm();
67
        $searchForm->handleRequest($request);
68
        if ($searchForm->isSubmitted() && $searchForm->isValid()) {
69
            $values = $searchForm->getData();
70
            $keyword = $values['keyword'];
71
        }
72
73
        if (empty($keyword)) {
74
            throw $this->createNotFoundException();
75
        }
76
77
        $settingsFromKeyword = $manager->getParametersFromKeywordOrderedByCategory($keyword);
78
79
        $settings = [];
80
        if (!empty($settingsFromKeyword)) {
81
            foreach ($settingsFromKeyword as $category => $parameterList) {
82
                $list = [];
83
                foreach ($parameterList as $parameter) {
84
                    $list[] = $parameter->getVariable();
85
                }
86
                $settings = $manager->load($category, null);
87
                $schemaAlias = $manager->convertNameSpaceToService($category);
88
                $form = $this->getSettingsFormFactory()->create($schemaAlias);
89
90
                foreach ($settings->getParameters() as $name => $value) {
91
                    if (!in_array($name, $list)) {
92
                        $form->remove($name);
93
                        $settings->remove($name);
94
                    }
95
                }
96
                $form->setData($settings);
97
                $formList[$category] = $form->createView();
98
            }
99
        }
100
101
        $schemas = $manager->getSchemas();
102
103
        return $this->render(
104
            '@ChamiloTheme/Admin/Settings/search.html.twig',
105
            [
106
                'keyword' => $keyword,
107
                'schemas' => $schemas,
108
                'settings' => $settings,
109
                'form_list' => $formList,
110
                'search_form' => $searchForm->createView(),
111
            ]
112
        );
113
    }
114
115
    /**
116
     * Edit configuration with given namespace.
117
     *
118
     * @Security("has_role('ROLE_ADMIN')")
119
     *
120
     * @Route("/settings/{namespace}", name="chamilo_platform_settings")
121
     *
122
     * @param string $namespace
123
     */
124
    public function updateSettingAction(Request $request, $namespace): Response
125
    {
126
        $manager = $this->getSettingsManager();
127
        // @todo improve get the current url entity
128
        $urlId = $request->getSession()->get('access_url_id');
129
        $url = $this->getDoctrine()->getRepository('ChamiloCoreBundle:AccessUrl')->find($urlId);
130
        $manager->setUrl($url);
131
        $schemaAlias = $manager->convertNameSpaceToService($namespace);
132
        $searchForm = $this->getSearchForm();
133
134
        $keyword = '';
135
        $searchForm->handleRequest($request);
136
        if ($searchForm->isSubmitted() && $searchForm->isValid()) {
137
            $values = $searchForm->getData();
138
            $keyword = $values['keyword'];
139
            $settingsFromKeyword = $manager->getParametersFromKeyword(
140
                $schemaAlias,
141
                $keyword
142
            );
143
        }
144
145
        $keywordFromGet = $request->query->get('keyword');
146
        if ($keywordFromGet) {
147
            $keyword = $keywordFromGet;
148
            $searchForm->setData(['keyword' => $keyword]);
149
            $settingsFromKeyword = $manager->getParametersFromKeyword(
150
                $schemaAlias,
151
                $keywordFromGet
152
            );
153
        }
154
155
        $settings = $manager->load($namespace);
156
        $form = $this->getSettingsFormFactory()->create($schemaAlias);
157
158
        if (!empty($keyword)) {
159
            $params = $settings->getParameters();
160
            foreach ($params as $name => $value) {
161
                if (!in_array($name, array_keys($settingsFromKeyword))) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $settingsFromKeyword does not seem to be defined for all execution paths leading up to this point.
Loading history...
162
                    $form->remove($name);
163
                }
164
            }
165
        }
166
167
        $form->setData($settings);
168
        $form->handleRequest($request);
169
170
        if ($form->isSubmitted() && $form->isValid()) {
171
            $messageType = 'success';
172
173
            try {
174
                $manager->save($form->getData());
175
                $message = $this->getTranslator()->trans('Settings have been successfully updated');
176
            } catch (ValidatorException $exception) {
177
                $message = $this->getTranslator()->trans($exception->getMessage(), [], 'validators');
178
                $messageType = 'error';
179
            }
180
181
            $this->addFlash($messageType, $message);
182
            if (!empty($keywordFromGet)) {
183
                return $this->redirect($request->headers->get('referer'));
184
            }
185
        }
186
        $schemas = $manager->getSchemas();
187
188
        return $this->render(
189
            '@ChamiloTheme/Admin/Settings/default.html.twig',
190
            [
191
                'schemas' => $schemas,
192
                'settings' => $settings,
193
                'form' => $form->createView(),
194
                'keyword' => $keyword,
195
                'search_form' => $searchForm->createView(),
196
            ]
197
        );
198
    }
199
200
    /**
201
     * Sync settings from classes with the database.
202
     */
203
    public function syncSettings(Request $request)
204
    {
205
        $manager = $this->getSettingsManager();
206
        // @todo improve get the current url entity
207
        $urlId = $request->getSession()->get('access_url_id');
208
        $url = $this->getDoctrine()->getRepository('ChamiloCoreBundle:AccessUrl')->find($urlId);
209
        $manager->setUrl($url);
210
        $manager->installSchemas($url);
211
    }
212
213
    /**
214
     * @return SettingsManager
215
     */
216
    protected function getSettingsManager()
217
    {
218
        return $this->get('chamilo.settings.manager');
219
    }
220
221
    protected function getSettingsFormFactory()
222
    {
223
        return $this->get('chamilo_settings.form_factory.settings');
224
    }
225
226
    /**
227
     * @return \Symfony\Component\Form\FormInterface
228
     */
229
    private function getSearchForm()
230
    {
231
        $builder = $this->container->get('form.factory')->createNamedBuilder('search');
232
        $builder->add('keyword', TextType::class);
233
        $builder->add('search', SubmitType::class);
234
235
        return $builder->getForm();
236
    }
237
}
238