Completed
Push — master ( c238bb...d3c2be )
by Julito
53:04 queued 30:32
created

SettingsController::searchSettingAction()   C

Complexity

Conditions 8
Paths 6

Size

Total Lines 52
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 33
nc 6
nop 1
dl 0
loc 52
rs 6.8493
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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