Completed
Push — master ( 8b8622...bace5a )
by Piotr
12s
created

BatchFormValidRequestHandler::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 6
nc 1
nop 3
1
<?php
2
3
/**
4
 * (c) FSi sp. z o.o. <[email protected]>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
namespace FSi\Bundle\AdminBundle\Admin\CRUD\Context\Request;
11
12
use FSi\Bundle\AdminBundle\Admin\Context\Request\AbstractFormValidRequestHandler;
13
use FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement;
14
use FSi\Bundle\AdminBundle\Admin\CRUD\DeleteElement;
15
use FSi\Bundle\AdminBundle\Event\BatchEvents;
16
use FSi\Bundle\AdminBundle\Event\FormEvent;
17
use FSi\Bundle\AdminBundle\Exception\RequestHandlerException;
18
use FSi\Bundle\AdminBundle\Message\FlashMessages;
19
use LogicException;
20
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
21
use Symfony\Component\HttpFoundation\RedirectResponse;
22
use Symfony\Component\HttpFoundation\Request;
23
use Symfony\Component\Routing\RouterInterface;
24
25
class BatchFormValidRequestHandler extends AbstractFormValidRequestHandler
26
{
27
    /**
28
     * @var \FSi\Bundle\AdminBundle\Message\FlashMessages
29
     */
30
    private $flashMessages;
31
32
    /**
33
     * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $eventDispatcher
34
     * @param \Symfony\Component\Routing\RouterInterface $router
35
     * @param \FSi\Bundle\AdminBundle\Message\FlashMessages|null
36
     */
37
    public function __construct(
38
        EventDispatcherInterface $eventDispatcher,
39
        RouterInterface $router,
40
        FlashMessages $flashMessages = null
41
    ) {
42
        parent::__construct($eventDispatcher, $router);
43
        $this->flashMessages = $flashMessages;
44
    }
45
46
    /**
47
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
48
     * @param \Symfony\Component\HttpFoundation\Request $request
49
     */
50
    protected function action(FormEvent $event, Request $request)
51
    {
52
        /** @var \FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement $element */
53
        $element = $event->getElement();
54
        $objects = $this->getObjects($element, $request);
55
56
        if (empty($objects)) {
57
            $this->setWarningMessage();
58
            return;
59
        }
60
61
        foreach ($objects as $object) {
62
            $element->apply($object);
63
        }
64
    }
65
66
    /**
67
     * @param \FSi\Bundle\AdminBundle\Admin\CRUD\BatchElement $element
68
     * @param \Symfony\Component\HttpFoundation\Request $request
69
     * @return array
70
     * @throws \FSi\Bundle\AdminBundle\Exception\RequestHandlerException
71
     */
72
    private function getObjects(BatchElement $element, Request $request)
73
    {
74
        $objects = [];
75
        $indexes = $request->request->get('indexes', []);
76
77
        if (!count($indexes)) {
78
            return [];
79
        }
80
81
        foreach ($indexes as $index) {
82
            $object = $element->getDataIndexer()->getData($index);
83
84
            if (!isset($object)) {
85
                throw new RequestHandlerException(sprintf("Can't find object with id %s", $index));
86
            }
87
88
            $objects[] = $object;
89
        }
90
91
        return $objects;
92
    }
93
94
    /**
95
     * @param \FSi\Bundle\AdminBundle\Event\FormEvent $event
96
     * @param \Symfony\Component\HttpFoundation\Request $request
97
     * @return bool
98
     */
99
    protected function isValidPostRequest(FormEvent $event, Request $request)
100
    {
101
        $element = $event->getElement();
102
        if ($element instanceof DeleteElement
103
            && $element->hasOption('allow_delete')
104
            && !$element->getOption('allow_delete')
105
        ) {
106
            throw new LogicException(sprintf(
107
                'Tried to delete objects through element "%s", which has option "allow_delete" set to false',
108
                get_class($element)
109
            ));
110
        }
111
112
        return parent::isValidPostRequest($event, $request);
113
    }
114
115
    /**
116
     * @param FormEvent $event
117
     * @param Request $request
118
     * @return RedirectResponse
119
     */
120
    protected function getRedirectResponse(FormEvent $event, Request $request)
121
    {
122
        if ($request->query->has('redirect_uri')) {
123
            return new RedirectResponse($request->query->get('redirect_uri'));
124
        }
125
126
        return parent::getRedirectResponse($event, $request);
127
    }
128
129
    /**
130
     * @return string
131
     */
132
    protected function getPreSaveEventName()
133
    {
134
        return BatchEvents::BATCH_OBJECTS_PRE_APPLY;
135
    }
136
137
    /**
138
     * @return string
139
     */
140
    protected function getPostSaveEventName()
141
    {
142
        return BatchEvents::BATCH_OBJECTS_POST_APPLY;
143
    }
144
145
    private function setWarningMessage()
146
    {
147
        if ($this->flashMessages) {
148
            $this->flashMessages->warning('messages.batch.no_elements');
149
        }
150
    }
151
}
152