diff --git a/Controller/PersonAddressController.php b/Controller/PersonAddressController.php new file mode 100644 index 000000000..6dcea9de1 --- /dev/null +++ b/Controller/PersonAddressController.php @@ -0,0 +1,151 @@ +, + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\PersonBundle\Controller; + +use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use Chill\PersonBundle\Entity\Person; +use Chill\MainBundle\Form\Type\AddressType; +use Chill\MainBundle\Entity\Address; +use Doctrine\Common\Collections\Criteria; +use Symfony\Component\HttpFoundation\Request; + +/** + * Controller for addresses associated with person + * + * @author Julien Fastré + * @author Champs Libres + */ +class PersonAddressController extends Controller +{ + public function editAction($person_id, $address_id) + { + $person = $this->getDoctrine()->getManager() + ->getRepository('ChillPersonBundle:Person') + ->find($person_id); + + if ($person === NULL) { + throw $this->createNotFoundException("Person with id $person_id not" + . " found "); + } + + $this->denyAccessUnlessGranted('CHILL_PERSON_UPDATE', $person, + "You are not allowed to edit this person."); + + $address = $this->findAddressById($person, $address_id); + + $form = $this->createEditForm($person, $address); + + return $this->render('ChillPersonBundle:Address:edit.html.twig', array( + 'person' => $person, + 'address' => $address, + 'form' => $form->createView() + )); + + + } + + public function updateAction($person_id, $address_id, Request $request) + { + $person = $this->getDoctrine()->getManager() + ->getRepository('ChillPersonBundle:Person') + ->find($person_id); + + if ($person === NULL) { + throw $this->createNotFoundException("Person with id $person_id not" + . " found "); + } + + $this->denyAccessUnlessGranted('CHILL_PERSON_UPDATE', $person, + "You are not allowed to edit this person."); + + $address = $this->findAddressById($person, $address_id); + + $form = $this->createEditForm($person, $address); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $this->getDoctrine()->getManager() + ->flush(); + + $this->addFlash('success', $this->get('translator')->trans( + "The address has been successfully updated")); + + return $this->redirectToRoute('chill_person_view', array( + 'person_id' => $person->getId() + )); + } + + return $this->render('ChillPersonBundle:Address:edit.html.twig', array( + 'person' => $person, + 'address' => $address, + 'form' => $form->createView() + )); + } + + /** + * + * @param Person $person + * @param Address $address + * @return \Symfony\Component\Form\Form + */ + protected function createEditForm(Person $person, Address $address) + { + $form = $this->createForm(AddressType::class, $address, array( + 'method' => 'POST', + 'action' => $this->generateUrl('chill_person_address_update', array( + 'person_id' => $person->getId(), + 'address_id' => $address->getId() + )) + )); + + $form->add('submit', 'submit', array( + 'label' => 'Submit' + )); + + return $form; + } + + /** + * + * @param Person $person + * @param int $address_id + * @return Address + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException if the address id does not exists or is not associated with given person + */ + protected function findAddressById(Person $person, $address_id) + { + // filtering address + $criteria = Criteria::create() + ->where(Criteria::expr()->eq('id', $address_id)) + ->setMaxResults(1); + $addresses = $person->getAddresses()->matching($criteria); + + if (count($addresses) === 0) { + throw $this->createNotFoundException("Address with id $address_id " + . "matching person $person_id not found "); + } + + return $addresses->first(); + } +} diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 91b481ea4..d9983e849 100644 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -69,6 +69,14 @@ chill_person_accompanying_period_close: chill_person_accompanying_period_open: path: /{_locale}/person/{person_id}/accompanying-period/open defaults: { _controller: ChillPersonBundle:AccompanyingPeriod:open } + +chill_person_address_edit: + path: /{_locale}/person/{person_id}/address/{address_id}/edit + defaults: { _controller: ChillPersonBundle:PersonAddress:edit } + +chill_person_address_update: + path: /{_locale}/person/{person_id}/address/{address_id}/update + defaults: { _controller: ChillPersonBundle:PersonAddress:update } chill_person_export: path: /{_locale}/person/export/ diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index 9d7d9f364..959ec8db5 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -70,8 +70,12 @@ Reset: 'Remise à zéro' 'Person details': 'Détails de la personne' 'Update details for %name%': 'Modifier détails de %name%' Accompanying period list: Périodes d'accompagnement + +#address Since %date%: Depuis le %date% No address given: Pas d'adresse renseignée +The address has been successfully updated: L'adresse a été mise à jour avec succès +Update address for %name%: Mettre à jour une adresse pour %name% #timeline 'An accompanying period is opened for %person% on %date%': Une période d'accompagnement a été ouverte le %date% pour %person% diff --git a/Resources/views/Address/edit.html.twig b/Resources/views/Address/edit.html.twig new file mode 100644 index 000000000..b71134745 --- /dev/null +++ b/Resources/views/Address/edit.html.twig @@ -0,0 +1,36 @@ +{# + * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . +#} +{% extends "ChillPersonBundle::layout.html.twig" %} + +{% set activeRouteKey = '' %} + +{% block title %}{{ 'Update address for %name%'|trans({ '%name%': person.firstName|capitalize ~ ' ' ~ person.lastName } )|capitalize }}{% endblock %} + +{% block personcontent %} + + {{ form_start(form) }} + + {{ form_row(form.streetAddress1) }} + {{ form_row(form.streetAddress2) }} + {{ form_row(form.postCode) }} + {{ form_row(form.validFrom) }} + + {{ form_row(form.submit, { 'attr' : { 'class': 'sc-button bt-edit' } } ) }} + + {{ form_end(form) }} + +{% endblock personcontent %} \ No newline at end of file diff --git a/Resources/views/Person/view.html.twig b/Resources/views/Person/view.html.twig index 1f17e7cb6..a2ea48d39 100644 --- a/Resources/views/Person/view.html.twig +++ b/Resources/views/Person/view.html.twig @@ -173,6 +173,9 @@ This view should receive those arguments:
{%- if person.lastAddress is not empty -%} {{ address._render(person.lastAddress) }} + + {{ 'Edit'|trans }} + {%- else -%} {{ 'No address given'|trans }} {%- endif -%}