, * * 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\AbstractController; use Symfony\Component\Form\Extension\Core\Type\SubmitType; 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; use Symfony\Component\Validator\Validator\ValidatorInterface; /** * Class PersonAddressController * Controller for addresses associated with person * * @package Chill\PersonBundle\Controller * @author Julien Fastré * @author Champs Libres */ class PersonAddressController extends AbstractController { /** * @var ValidatorInterface */ protected $validator; /** * PersonAddressController constructor. * * @param ValidatorInterface $validator */ public function __construct(ValidatorInterface $validator) { $this->validator = $validator; } public function listAction($person_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_SEE', $person, "You are not allowed to edit this person." ); return $this->render('ChillPersonBundle:Address:list.html.twig', array( 'person' => $person )); } public function newAction($person_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 = new Address(); $form = $this->createCreateForm($person, $address); return $this->render('ChillPersonBundle:Address:new.html.twig', array( 'person' => $person, 'form' => $form->createView() )); } public function createAction($person_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 = new Address(); $form = $this->createCreateForm($person, $address); $form->handleRequest($request); $person->addAddress($address); if ($form->isSubmitted() && $form->isValid()) { $validatePersonErrors = $this->validatePerson($person); if (count($validatePersonErrors) !== 0) { foreach ($validatePersonErrors as $error) { $this->addFlash('error', $error->getMessage()); } } elseif ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->flush(); $this->addFlash( 'success', $this->get('translator')->trans('The new address was created successfully') ); return $this->redirectToRoute('chill_person_address_list', array( 'person_id' => $person->getId() )); } else { $this->addFlash('error', $this->get('translator') ->trans('Error! Address not created!')); } } return $this->render('ChillPersonBundle:Address:new.html.twig', array( 'person' => $person, 'form' => $form->createView() )); } 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() and $form->isValid()) { $validatePersonErrors = $this->validatePerson($person); if (count($validatePersonErrors) !== 0) { foreach ($validatePersonErrors as $error) { $this->addFlash('error', $error->getMessage()); } } elseif ($form->isValid()) { $this->getDoctrine()->getManager() ->flush(); $this->addFlash('success', $this->get('translator')->trans( "The address has been successfully updated" )); return $this->redirectToRoute('chill_person_address_list', array( 'person_id' => $person->getId() )); } else { $this->addFlash('error', $this->get('translator') ->trans('Error when updating the period')); } } 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() )), 'has_no_address' => true )); $form->add('submit', SubmitType::class, array( 'label' => 'Submit' )); return $form; } /** * * @param Person $person * @param Address $address * @return \Symfony\Component\Form\Form */ protected function createCreateForm(Person $person, Address $address) { $form = $this->createForm(AddressType::class, $address, array( 'method' => 'POST', 'action' => $this->generateUrl('chill_person_address_create', array( 'person_id' => $person->getId() )), 'has_no_address' => true )); $form->add('submit', SubmitType::class, 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(); } /** * @param Chill\PersonBundle\Entity\Person $person * @return \Symfony\Component\Validator\ConstraintViolationListInterface */ private function validatePerson(Person $person) { $errors = $this->validator ->validate($person, null, array('Default')); $errors_addresses_consistent = $this->validator ->validate($person, null, array('addresses_consistent')); foreach($errors_addresses_consistent as $error) { $errors->add($error); } return $errors; } }