From 4fe31185df451304a1e52df50e52f1786eacab01 Mon Sep 17 00:00:00 2001 From: Marc Ducobu Date: Wed, 23 Mar 2016 18:19:48 +0100 Subject: [PATCH] Good Center - Circle suggested --- Controller/EventController.php | 6 +-- Entity/Event.php | 17 +++--- Form/EventType.php | 82 ++++++++++++++++++++++++++++- Resources/config/services/forms.yml | 11 +++- 4 files changed, 103 insertions(+), 13 deletions(-) diff --git a/Controller/EventController.php b/Controller/EventController.php index b084218df..8d08f281f 100644 --- a/Controller/EventController.php +++ b/Controller/EventController.php @@ -4,10 +4,10 @@ namespace Chill\EventBundle\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\Controller; - use Chill\EventBundle\Entity\Event; use Chill\EventBundle\Form\EventType; + /** * Event controller. * @@ -62,9 +62,9 @@ class EventController extends Controller */ private function createCreateForm(Event $entity) { - $form = $this->createForm(new EventType(), $entity, array( + $form = $this->createForm(EventType::class, $entity, array( 'action' => $this->generateUrl('event_create'), - 'method' => 'POST', + 'method' => 'POST' )); $form->add('submit', 'submit', array('label' => 'Create')); diff --git a/Entity/Event.php b/Entity/Event.php index 763f27f56..d9512fda0 100644 --- a/Entity/Event.php +++ b/Entity/Event.php @@ -2,10 +2,13 @@ namespace Chill\EventBundle\Entity; +use Chill\MainBundle\Entity\HasCenterInterface; +use Chill\MainBundle\Entity\HasScopeInterface; + /** * Event */ -class Event +class Event implements HasCenterInterface, HasScopeInterface { /** * @var integer @@ -120,7 +123,7 @@ class Event } /** - * + * * @return EventType */ public function getType() @@ -129,7 +132,7 @@ class Event } /** - * + * * @param \Chill\EventBundle\Entity\EventType $type * @return \Chill\EventBundle\Entity\Event */ @@ -140,7 +143,7 @@ class Event } /** - * + * * @return \Chill\MainBundle\Entity\Center */ public function getCenter() @@ -149,7 +152,7 @@ class Event } /** - * + * * @return \Chill\MainBundle\Entity\Scope */ public function getCircle() @@ -158,7 +161,7 @@ class Event } /** - * + * * @param \Chill\MainBundle\Entity\Scope $circle * @return \Chill\EventBundle\Entity\Event */ @@ -169,7 +172,7 @@ class Event } /** - * + * * @deprecated * @return \Chill\MainBundle\Entity\Scope */ diff --git a/Form/EventType.php b/Form/EventType.php index 053c02007..5ad2f6414 100644 --- a/Form/EventType.php +++ b/Form/EventType.php @@ -6,15 +6,66 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Chill\EventBundle\Form\Type\TranslatableEventType; +use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; +use Chill\MainBundle\Security\Authorization\AuthorizationHelper; +use Doctrine\Common\Persistence\ObjectManager; +use Chill\MainBundle\Templating\TranslatableStringHelper; +use Chill\MainBundle\Entity\User; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; +use Chill\MainBundle\Entity\Center; +use Chill\MainBundle\Entity\Scope; + +use Symfony\Component\Security\Core\Role\Role; class EventType extends AbstractType { + + /** @var the user running this form */ + protected $user; + + /** @var AuthorizationHelper */ + protected $authorizationHelper; + + /** @var TranslatableStringHelper */ + protected $translatableStringHelper; + + public function __construct( + TokenStorageInterface $tokenStorage, + AuthorizationHelper $authorizationHelper, + TranslatableStringHelper $translatableStringHelper + ) { + if (!$tokenStorage->getToken()->getUser() instanceof User) { + throw new \RuntimeException("you should have a valid user"); + } + $this->user = $tokenStorage->getToken()->getUser(); + $this->authorizationHelper = $authorizationHelper; + $this->translatableStringHelper = $translatableStringHelper; + } + /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { + $userReachableCenters = $this->authorizationHelper + ->getReachableCenters($this->user, new Role('CHILL_EVENT_CREATE')); + + $userReachableCirclesByCircleId = array(); + $userReachableCentersByCircleId = array(); + + foreach ($userReachableCenters as $center) { + foreach ($this->authorizationHelper + ->getReachableCircles($this->user, new Role('CHILL_EVENT_CREATE'), $center) as $circle) { + if (array_key_exists($circle->getId(), $userReachableCirclesByCircleId)) { + array_push($userReachableCentersByCircleId[$circle->getId()], $center); + } else { + $userReachableCirclesByCircleId[$circle->getId()] = $circle; + $userReachableCentersByCircleId[$circle->getId()] = array($center); + } + } + } + $builder ->add('label') ->add( @@ -26,9 +77,36 @@ class EventType extends AbstractType 'format' => 'dd-MM-yyyy' ) ) - ->add('center') + ->add('center', EntityType::class, array( + 'class' => Center::class, + 'choices' => $userReachableCenters, + 'choice_attr' => function (Center $center) { + return array( + 'data-link-category' => $center->getId() + ); + }, + )) + ->add('circle', EntityType::class, array( + 'class' => Scope::class, + 'choices' => array_values($userReachableCirclesByCircleId), + 'choice_label' => function ($circle) { + $helper = $this->translatableStringHelper; + return $helper->localize($circle->getName()); + }, + 'choice_attr' => function ($circle) use ($userReachableCentersByCircleId) { + $centersId = ""; + foreach ($userReachableCentersByCircleId[$circle->getId()] as $center) { + print $center; + $centersId = $centersId.($center->getId()).','; + } + $centersId = trim($centersId, ','); + return array( + 'data-link-categories' => $centersId, + + ); + }, + )) ->add('type', TranslatableEventType::class) - //->add('circle') ; } diff --git a/Resources/config/services/forms.yml b/Resources/config/services/forms.yml index 1dc75d5e4..2f1cb1d00 100644 --- a/Resources/config/services/forms.yml +++ b/Resources/config/services/forms.yml @@ -1,7 +1,16 @@ services: - chill_event.form.event_type_type: + chill.event.form.type.translatable_event_type: class: Chill\EventBundle\Form\Type\TranslatableEventType arguments: - "@chill.main.helper.translatable_string" tags: - { name: form.type } + + chill.event.form.event_type_test: + class: Chill\EventBundle\Form\EventType + arguments: + - "@security.token_storage" + - "@chill.main.security.authorization.helper" + - "@chill.main.helper.translatable_string" + tags: + - { name: form.type }