Completed
Push — master ( efcbbc...1b7a17 )
by Julito
08:40
created

SettingsController::getSettingsManager()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
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\CoreBundle\Controller\BaseController;
8
use Chamilo\CoreBundle\Traits\ControllerTrait;
9
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
10
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
11
use Symfony\Component\Form\Extension\Core\Type\TextType;
12
use Symfony\Component\HttpFoundation\Request;
13
use Symfony\Component\HttpFoundation\Response;
14
use Symfony\Component\Routing\Annotation\Route;
15
use Symfony\Component\Validator\Exception\ValidatorException;
16
17
/**
18
 * @Route("/admin")
19
 */
20
class SettingsController extends BaseController
21
{
22
    use ControllerTrait;
23
24
    /**
25
     * @IsGranted("ROLE_ADMIN")
26
     *
27
     * @Route("/settings", name="admin_settings")
28
     */
29
    public function indexAction(): Response
30
    {
31
        $manager = $this->getSettingsManager();
32
        $schemas = $manager->getSchemas();
33
34
        return $this->render(
35
            '@ChamiloCore/Admin/Settings/index.html.twig',
36
            [
37
                'schemas' => $schemas,
38
            ]
39
        );
40
    }
41
42
    /**
43
     * Edit configuration with given namespace.
44
     *
45
     * @IsGranted("ROLE_ADMIN")
46
     *
47
     * @Route("/settings/search_settings", name="chamilo_platform_settings_search")
48
     */
49
    public function searchSettingAction(Request $request): Response
50
    {
51
        $manager = $this->getSettingsManager();
52
        $formList = [];
53
        $keyword = $request->get('keyword');
54
55
        $searchForm = $this->getSearchForm();
56
        $searchForm->handleRequest($request);
57
        if ($searchForm->isSubmitted() && $searchForm->isValid()) {
58
            $values = $searchForm->getData();
59
            $keyword = $values['keyword'];
60
        }
61
62
        if (empty($keyword)) {
63
            throw $this->createNotFoundException();
64
        }
65
66
        $settingsFromKeyword = $manager->getParametersFromKeywordOrderedByCategory($keyword);
67
68
        $settings = [];
69
        if (!empty($settingsFromKeyword)) {
70
            foreach ($settingsFromKeyword as $category => $parameterList) {
71
                $list = [];
72
                foreach ($parameterList as $parameter) {
73
                    $list[] = $parameter->getVariable();
74
                }
75
                $settings = $manager->load($category, null);
76
                $schemaAlias = $manager->convertNameSpaceToService($category);
77
                $form = $this->getSettingsFormFactory()->create($schemaAlias);
78
79
                foreach ($settings->getParameters() as $name => $value) {
80
                    if (!in_array($name, $list)) {
81
                        $form->remove($name);
82
                        $settings->remove($name);
83
                    }
84
                }
85
                $form->setData($settings);
86
                $formList[$category] = $form->createView();
87
            }
88
        }
89
90
        $schemas = $manager->getSchemas();
91
92
        return $this->render(
93
            '@ChamiloCore/Admin/Settings/search.html.twig',
94
            [
95
                'keyword' => $keyword,
96
                'schemas' => $schemas,
97
                'settings' => $settings,
98
                'form_list' => $formList,
99
                'search_form' => $searchForm->createView(),
100
            ]
101
        );
102
    }
103
104
    /**
105
     * Edit configuration with given namespace.
106
     *
107
     * @IsGranted("ROLE_ADMIN")
108
     *
109
     * @Route("/settings/{namespace}", name="chamilo_platform_settings")
110
     *
111
     * @param string $namespace
112
     */
113
    public function updateSettingAction(Request $request, $namespace): Response
114
    {
115
        $manager = $this->getSettingsManager();
116
        // @todo improve get the current url entity
117
        $urlId = $request->getSession()->get('access_url_id');
118
        $url = $this->getDoctrine()->getRepository('ChamiloCoreBundle:AccessUrl')->find($urlId);
119
        $manager->setUrl($url);
120
        $schemaAlias = $manager->convertNameSpaceToService($namespace);
121
        $searchForm = $this->getSearchForm();
122
123
        $keyword = '';
124
        $searchForm->handleRequest($request);
125
        if ($searchForm->isSubmitted() && $searchForm->isValid()) {
126
            $values = $searchForm->getData();
127
            $keyword = $values['keyword'];
128
            $settingsFromKeyword = $manager->getParametersFromKeyword(
129
                $schemaAlias,
130
                $keyword
131
            );
132
        }
133
134
        $keywordFromGet = $request->query->get('keyword');
135
        if ($keywordFromGet) {
136
            $keyword = $keywordFromGet;
137
            $searchForm->setData(['keyword' => $keyword]);
138
            $settingsFromKeyword = $manager->getParametersFromKeyword(
139
                $schemaAlias,
140
                $keywordFromGet
141
            );
142
        }
143
144
        $settings = $manager->load($namespace);
145
        $form = $this->getSettingsFormFactory()->create($schemaAlias);
146
147
        if (!empty($keyword)) {
148
            $params = $settings->getParameters();
149
            foreach ($params as $name => $value) {
150
                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...
151
                    $form->remove($name);
152
                }
153
            }
154
        }
155
156
        $form->setData($settings);
157
        $form->handleRequest($request);
158
159
        if ($form->isSubmitted() && $form->isValid()) {
160
            $messageType = 'success';
161
162
            try {
163
                $manager->save($form->getData());
164
                $message = $this->trans('Settings have been successfully updated');
165
            } catch (ValidatorException $exception) {
166
                $message = $this->trans($exception->getMessage(), [], 'validators');
167
                $messageType = 'error';
168
            }
169
170
            $this->addFlash($messageType, $message);
171
            if (!empty($keywordFromGet)) {
172
                return $this->redirect($request->headers->get('referer'));
173
            }
174
        }
175
        $schemas = $manager->getSchemas();
176
177
        return $this->render(
178
            '@ChamiloCore/Admin/Settings/default.html.twig',
179
            [
180
                'schemas' => $schemas,
181
                'settings' => $settings,
182
                'form' => $form->createView(),
183
                'keyword' => $keyword,
184
                'search_form' => $searchForm->createView(),
185
            ]
186
        );
187
    }
188
189
    /**
190
     * Sync settings from classes with the database.
191
     */
192
    public function syncSettings(Request $request)
193
    {
194
        $manager = $this->getSettingsManager();
195
        // @todo improve get the current url entity
196
        $urlId = $request->getSession()->get('access_url_id');
197
        $url = $this->getDoctrine()->getRepository('ChamiloCoreBundle:AccessUrl')->find($urlId);
198
        $manager->setUrl($url);
199
        $manager->installSchemas($url);
200
    }
201
202
    /**
203
     * @return \Symfony\Component\Form\FormInterface
204
     */
205
    private function getSearchForm()
206
    {
207
        $builder = $this->container->get('form.factory')->createNamedBuilder('search');
208
        $builder->add('keyword', TextType::class);
209
        $builder->add('search', SubmitType::class);
210
211
        return $builder->getForm();
212
    }
213
}
214