Completed
Push — master ( a812ec...201942 )
by Guilherme
14s
created

PersonAddressController::getDeleteForms()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 4
eloc 12
c 1
b 1
f 0
nc 2
nop 0
dl 0
loc 18
rs 9.2
1
<?php
2
/**
3
 * This file is part of the login-cidadao project or it's bundles.
4
 *
5
 * (c) Guilherme Donato <guilhermednt on github>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace LoginCidadao\CoreBundle\Controller;
12
13
use LoginCidadao\CoreBundle\Model\LocationSelectData;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
16
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
17
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
18
use LoginCidadao\CoreBundle\Entity\PersonAddress;
19
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
20
use Doctrine\Common\Collections\Collection;
21
use Symfony\Component\Form\FormError;
22
use LoginCidadao\CoreBundle\Entity\State;
23
use LoginCidadao\CoreBundle\Entity\City;
24
25
class PersonAddressController extends Controller
26
{
27
28
    /**
29
     * @Route("/person/addresses", name="lc_person_addresses")
30
     * @Template()
31
     */
32
    public function listAction()
33
    {
34
        $deleteForms = $this->getDeleteForms();
35
36
        return compact('deleteForms');
37
    }
38
39
    /**
40
     * @Route("/person/addresses/new", name="lc_person_addresses_new")
41
     * @Template()
42
     */
43
    public function newAddressAction(Request $request)
44
    {
45
        $address = new PersonAddress();
46
        $form = $this->createForm('LoginCidadao\CoreBundle\Form\Type\PersonAddressFormType', $address);
47
48
        $form->handleRequest($request);
49
50
        $em = $this->getDoctrine()->getManager();
51
        if ($form->isValid()) {
52
            $address->setPerson($this->getUser());
53
            $em->persist($address);
54
            $em->flush();
55
56
            return $this->redirect($this->generateUrl('lc_person_addresses'));
57
        }
58
        $deleteForms = $this->getDeleteForms();
59
60
        return compact('form', 'deleteForms');
61
    }
62
63
    private function checkAddressLocation(&$address, $form, &$em)
0 ignored issues
show
Coding Style introduced by
function checkAddressLocation() does not seem to conform to the naming convention (^(?:is|has|should|may|supports)).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
Unused Code introduced by
This method is not used, and could be removed.
Loading history...
64
    {
65
        $form = $form->get('location');
66
        if (!$address->getCountry()) {
67
            $form->get('country')->addError(new FormError($this->get('translator')->trans('required.field')));
68
69
            return false;
70
        }
71
        $isPreferred = $em->getRepository('LoginCidadaoCoreBundle:Country')->isPreferred($address->getCountry());
72
        if (!$address->getState() && !$isPreferred) {
73
            $steppe = ucwords(strtolower(trim($form->get('statesteppe')->getData())));
74
            if ($steppe) {
75
                $repo = $em->getRepository('LoginCidadaoCoreBundle:State');
76
                $ent = $repo->findOneBy(array(
77
                    'name' => $steppe,
78
                    'country' => $address->getCountry(),
79
                ));
80
                if (!$ent) {
81
                    $ent = new State();
82
                    $ent->setName($steppe);
83
                    $ent->setCountry($address->getCountry());
84
                    $em->persist($ent);
85
                }
86
                $address->setState($ent);
87
            }
88
        }
89
        if (!$address->getState()) {
90
            $form->get('state')->addError(new FormError($this->get('translator')->trans('required.field')));
91
92
            return false;
93
        }
94
        if (!$address->getCity() && !$isPreferred) {
95
            $steppe = ucwords(strtolower(trim($form->get('citysteppe')->getData())));
96
            if ($address->getState()) {
97
                $state = $address->getState();
98
            } elseif (isset($ent)) {
99
                $state = $ent;
100
            } else {
101
                $state = null;
102
            }
103
            if ($state && $steppe) {
104
                $repo = $em->getRepository('LoginCidadaoCoreBundle:City');
105
                $ent = $repo->findOneBy(array(
106
                    'name' => $steppe,
107
                    'state' => $state,
108
                ));
109
                if (!$ent) {
110
                    $ent = new City();
111
                    $ent->setName($steppe);
112
                    $ent->setState($state);
113
                    $em->persist($ent);
114
                }
115
                $address->setCity($ent);
116
            }
117
        }
118
        if (!$address->getCity()) {
119
            $form->get('city')->addError(new FormError($this->get('translator')->trans('required.field')));
120
121
            return false;
122
        }
123
124
        return true;
125
    }
126
127
    /**
128
     * @Route("/person/addresses/{id}/edit", name="lc_person_addresses_edit")
129
     * @Template("LoginCidadaoCoreBundle:PersonAddress:newAddress.html.twig")
130
     */
131
    public function editAction(Request $request, $id)
132
    {
133
        $em = $this->getDoctrine()->getManager();
134
        $addresses = $em->getRepository('LoginCidadaoCoreBundle:PersonAddress');
135
        /** @var PersonAddress $address */
136
        $address = $addresses->find($id);
137
        if ($address->getPerson()->getId() !== $this->getUser()->getId()) {
138
            throw new AccessDeniedException();
139
        }
140
141
        $address = $this->prepareAddressForEdition($address);
142
143
        $form = $this->createForm('LoginCidadao\CoreBundle\Form\Type\PersonAddressFormType', $address);
144
        $form->handleRequest($request);
145
146
        if ($form->isValid()) {
147
            $address->setPerson($this->getUser());
148
149
            $em->flush();
150
151
            return $this->redirect($this->generateUrl('lc_person_addresses'));
152
        }
153
        $deleteForms = $this->getDeleteForms();
154
        $edit_form = $form->createView();
0 ignored issues
show
Coding Style introduced by
$edit_form does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
155
156
        return compact('edit_form', 'deleteForms');
157
    }
158
159
    /**
160
     * @Route("/person/addresses/{id}/remove", name="lc_person_addresses_delete")
161
     * @Template()
162
     */
163
    public function deleteAction(Request $request, $id)
164
    {
165
        $translator = $this->get('translator');
166
        $form = $this->createForm('LoginCidadao\CoreBundle\Form\Type\RemovePersonAddressFormType');
167
        $form->handleRequest($request);
168
169
        if ($form->isValid()) {
170
            $person = $this->getUser();
171
            $em = $this->getDoctrine()->getManager();
172
            $addresses = $em->getRepository('LoginCidadaoCoreBundle:PersonAddress');
173
            $address = $addresses->find($id);
174
175
            try {
176
                if ($address->getPerson()->getId() !== $person->getId()) {
177
                    throw new AccessDeniedException();
178
                }
179
                $em->remove($address);
180
                $em->flush();
181
            } catch (AccessDeniedException $e) {
182
                $this->get('session')->getFlashBag()->add('error',
183
                    $translator->trans("Access Denied."));
184
            } catch (\Exception $e) {
185
                $this->get('session')->getFlashBag()->add('error',
186
                    $translator->trans("Wasn't possible to remove this address."));
187
                $this->get('session')->getFlashBag()->add('error',
188
                    $e->getMessage());
189
            }
190
        } else {
191
            $this->get('session')->getFlashBag()->add('error',
192
                $translator->trans("Wasn't possible to remove this address."));
193
        }
194
195
        return $this->redirect($this->generateUrl('lc_person_addresses'));
196
    }
197
198
    protected function getDeleteForms()
199
    {
200
        $person = $this->getUser();
201
        $deleteForms = array();
202
        $addresses = $person->getAddresses();
203
204
        if (is_array($addresses) || $addresses instanceof Collection) {
205
            foreach ($addresses as $address) {
206
                $data = array('address_id' => $address->getId());
207
                $deleteForms[$address->getId()] = $this->createForm(
208
                    'LoginCidadao\CoreBundle\Form\Type\RemovePersonAddressFormType',
209
                    $data)
210
                    ->createView();
211
            }
212
        }
213
214
        return $deleteForms;
215
    }
216
217
    private function prepareAddressForEdition(PersonAddress $address)
218
    {
219
        if ($address->getId() > 0) {
220
            $city = $address->getCity();
221
            if ($city instanceof City) {
222
                if (!$address->getLocation() instanceof LocationSelectData) {
223
                    $address->setLocation(new LocationSelectData());
224
                }
225
                $state = $city->getState();
226
                $country = $state->getCountry();
227
                $address->getLocation()->setCity($city)
228
                    ->setState($state)->setCountry($country);
229
            }
230
        }
231
232
        return $address;
233
    }
234
}
235