ItemAdmin::setPositionService()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace Alpixel\Bundle\MenuBundle\Controller\Admin\CRUD;
4
5
use Alpixel\Bundle\MenuBundle\Entity\Item;
6
use Alpixel\Bundle\MenuBundle\Utils\URLChecker;
7
use Doctrine\ORM\EntityRepository;
8
use Sonata\AdminBundle\Admin\Admin;
9
use Sonata\AdminBundle\Datagrid\ListMapper;
10
use Sonata\AdminBundle\Form\FormMapper;
11
use Sonata\AdminBundle\Route\RouteCollection;
12
use Symfony\Component\Form\FormError;
13
use Symfony\Component\HttpFoundation\Request;
14
15
class ItemAdmin extends Admin
16
{
17
    public $last_position = 0;
18
19
    protected $datagridValues = [
20
        '_page'       => 1,
21
        '_sort_order' => 'ASC',
22
        '_sort_by'    => 'position',
23
    ];
24
25
    public function setPositionService(\Pix\SortableBehaviorBundle\Services\PositionHandler $positionHandler)
26
    {
27
        $this->positionService = $positionHandler;
28
    }
29
30
    protected function configureRoutes(RouteCollection $collection)
31
    {
32
        $collection->add('move', $this->getRouterIdParameter().'/move/{position}');
33
        $collection->add('item', $this->getRouterIdParameter().'/item');
34
    }
35
36
    public function getPersistentParameters()
37
    {
38
        $parameters = [];
39
        if ($this->getRequest() instanceof Request) {
40
            $query = $this->getRequest()->query;
41
            if ($query->has('menu')) {
42
                $parameters['menu'] = $query->getInt('menu');
43
            }
44
45
            if ($query->has('item')) {
46
                $parameters['item'] = $query->getInt('item');
47
            }
48
        }
49
50
        return $parameters;
51
    }
52
53
    public function createQuery($context = 'list')
54
    {
55
        $query = parent::createQuery($context);
56
        if ($this->getRequest() instanceof Request) {
57
            $requestQuery = $this->getRequest()->query;
58
            if ($requestQuery->has('item')) {
59
                $parentId = $requestQuery->getInt('item');
60
                $query->join($query->getRootAlias().'.parent', 'p')
61
                    ->andWhere('p.id = :parentId')
62
                    ->setParameters([
63
                        'parentId' => $parentId,
64
                    ]);
65
            } elseif ($requestQuery->has('menu')) {
66
                $menuId = $requestQuery->getInt('menu');
67
                $query
68
                    ->join($query->getRootAlias().'.menu', 'm')
69
                    ->leftJoin($query->getRootAlias().'.parent', 'p')
70
                    ->where('m.id = :menuId')
71
                    ->andwhere('p.id IS NULL')
72
                    ->setParameters([
73
                        'menuId' => $menuId,
74
                    ]);
75
            }
76
        }
77
78
        return $query;
79
    }
80
81
    protected function configureFormFields(FormMapper $formMapper)
82
    {
83
        $subject = $this->getSubject();
84
        $isNew = ($this->id($subject) === null) ? true : false;
85
        $request = $this->getRequest();
86
87
        $idItem = null;
88
        $idMenu = null;
89
        if($request->query->has('uniqid')) {
90
            $formId = $request->query->get('uniqid');
91
            if ($request->request->has($formId)) {
92
                $formData = $request->request->get($formId);
93
                $idMenu   = $formData['create-menu'];
94
                $idItem   = $formData['create-item'];
95
            }
96
        }
97
98
        if ($idMenu === null && $idItem === null) {
99
            if ($isNew === true) {
100
                $idMenu = $this->getRequest()->query->get('create-menu');
101
                $idItem = $this->getRequest()->query->get('create-item');
102
            } else {
103
                $idMenu = $subject->getMenu()->getId();
104
                $idItem = ($subject->getParent() !== null) ? $subject->getParent()->getId() : null;
105
            }
106
        }
107
108
        $formMapper
109
            ->add('menu', null, [
110
                'label'         => 'Menu',
111
                'required'      => true,
112
                'property'      => 'name',
113
                'query_builder' => function (EntityRepository $entityRepository) use ($idMenu) {
114
                    $query = $entityRepository->createQuerybuilder('m');
115
                    if ($idMenu === null) {
116
                        return $query;
117
                    }
118
119
                    return $query
120
                        ->where('m.id = :id')
121
                        ->setParameter('id', $idMenu);
122
                },
123
            ]);
124
125
        if ($idItem != null) {
126
            $pool       = $this->getConfigurationPool();
127
            $doctrine   = $pool->getContainer()->get('doctrine.orm.default_entity_manager');
128
            $parentItem = $doctrine->getRepository('AlpixelMenuBundle:Item')->find($idItem);
129
130
            $formMapper->add('parent', null, [
131
                'label'         => 'Item parent',
132
                'required'      => true,
133
                'property'      => 'name',
134
                'data'          => $parentItem,
135
                'query_builder' => function (EntityRepository $repository) use ($parentItem) {
136
                    $qb = $repository->createQueryBuilder('i');
137
138
                    if ($parentItem->getParent() === null) {
139
                         return $qb->where('i.parent IS NULL')
140
                             ->andWhere('i.menu = :id')
141
                             ->setParameter('id', $parentItem->getMenu());
142
                    }
143
144
                    return $qb->where('i.id IN (:ids)')
145
                        ->setParameter('ids', $parentItem->getParent()->getChildren());
146
                },
147
            ]);
148
        }
149
150
        $formMapper
151
            ->add('name', null, [
152
                'label'    => 'Nom du menu à afficher',
153
                'required' => true,
154
            ])
155
            ->add('uri', 'text', [
156
                'label'    => 'URI',
157
                'required' => true,
158
            ])
159
            ->add('create-menu', 'hidden', [
160
                'required' => false,
161
                'data'     => $idMenu,
162
                'mapped'   => false,
163
            ])
164
            ->add('create-item', 'hidden', [
165
                'required' => false,
166
                'data'     => $idItem,
167
                'mapped'   => false,
168
            ]);
169
    }
170
171
    protected function configureListFields(ListMapper $listMapper)
172
    {
173
        $listMapper
174
            ->add('name', null, [
175
                'label'    => 'Label',
176
                'required' => true,
177
            ])
178
            ->add('uri', null, [
179
                'label'    => 'URI',
180
                'required' => true,
181
            ])
182
            ->add('position', null, [
183
                'label'    => 'Position',
184
                'required' => true,
185
            ])
186
            ->add('_action', 'actions', [
187
                'actions' => [
188
                    'edit' => [],
189
                    'move' => [
190
                        'template' => 'PixSortableBehaviorBundle:Default:_sort.html.twig',
191
                    ],
192
                    'item' => [
193
                        'template' => 'AlpixelMenuBundle:CRUD:list__action_item.html.twig',
194
                    ],
195
                ],
196
            ]);
197
    }
198
199
    public function checkUri($object = null)
200
    {
201
        if($object === null) {
202
            return;
203
        }
204
205
        $form    = $this->getForm();
206
        $request = $this->getRequest();
207
        $uriType = $request->request->get('uri_type');
208
209
        if (!Item::uriTypeExists($uriType)) {
210
            $form->get('uri')->addError(new FormError(
211
               'Le type d\'url est invalide !'
212
            ));
213
214
            return;
215
        }
216
217
        if ($uriType === Item::URI_TYPE_ANCHOR) {
218
            return;
219
        }
220
221
        if ($uriType === Item::URI_TYPE_EXTERNAL) {
222
            $uri = $form->get('uri')->getData();
223
            if (preg_match('/^https?:\/\//', $uri) === 0) {
224
                $form->get('uri')->addError(new FormError(
225
                    'Votre lien doit débuter par "http://" ou "https://"'
226
                ));
227
            }
228
        }
229
    }
230
231
    public function preValidate($object = null)
232
    {
233
        $this->checkUri($object);
234
    }
235
236
    public function postUpdate($object = null)
237
    {
238
        if ($object !== null) {
239
            $url = $object->getUri();
240
            if ($url !== null) {
241
                $container = $this->getConfigurationPool()->getContainer();
242
                $checker = $container->get('alpixel_menu.utils.url_checker');
243
                if ($checker->check($url) === URLChecker::URL_PROBLEM) {
244
                    $session = $container->get('session');
245
                    $session->getFlashBag()->add('warning', 'Cependant une erreur semble être apparue quand nous avons tenté d\'analyser la page "'.$url.'". Vous devriez vérifier que le lien spécifié n\'affiche aucune erreur.');
246
                }
247
            }
248
        }
249
    }
250
}
251