]> Raphaël G. Git Repositories - airbundle/blobdiff - Controller/AbstractController.php
Add markdown parsedown requirement
[airbundle] / Controller / AbstractController.php
index f8a0b9949c3e07b0d09e1802879070381ab21918..05a928d77ebbc295824b293a8e372cc9b6aa76e3 100644 (file)
-<?php
+<?php declare(strict_types=1);
+
+/*
+ * This file is part of the Rapsys AirBundle package.
+ *
+ * (c) Raphaël Gertz <symfony@rapsys.eu>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
 namespace Rapsys\AirBundle\Controller;
 
-use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
-use Symfony\Component\Filesystem\Filesystem;
+use Doctrine\Persistence\ManagerRegistry;
+use Psr\Log\LoggerInterface;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as BaseAbstractController;
 use Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait;
+use Symfony\Component\Asset\PackageInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
 
+use Rapsys\AirBundle\Entity\Dance;
+use Rapsys\AirBundle\Entity\Location;
 use Rapsys\AirBundle\Entity\Slot;
-
-use Rapsys\UserBundle\Utils\Slugger;
+use Rapsys\AirBundle\Entity\User;
+use Rapsys\AirBundle\RapsysAirBundle;
 
 /**
- *
  * Provides common features needed in controllers.
  *
- * @todo: pass request_stack, router, slugger_util, path_package as constructor argument ?
- *
  * {@inheritdoc}
  */
-abstract class AbstractController extends BaseAbstractController {
+abstract class AbstractController extends BaseAbstractController implements ServiceSubscriberInterface {
        use ControllerTrait {
                //Rename render as baseRender
                render as protected baseRender;
        }
 
+       ///Config array
+       protected $config;
+
+       ///ContainerInterface instance
+       protected $container;
+
+       ///Context array
+       protected $context;
+
+       ///Router instance
+       protected $router;
+
+       ///Translator instance
+       protected $translator;
+
+       /**
+        * Common constructor
+        *
+        * Stores container, router and translator interfaces
+        * Stores config
+        * Prepares context tree
+        *
+        * @param ContainerInterface $container The container instance
+        */
+       public function __construct(ContainerInterface $container) {
+               //Retrieve config
+               $this->config = $container->getParameter(RapsysAirBundle::getAlias());
+
+               //Set the container
+               $this->container = $container;
+
+               //Set the router
+               $this->router = $container->get('router');
+
+               //Set the translator
+               $this->translator = $container->get('translator');
+
+               //Set the context
+               $this->context = [
+                       'description' => null,
+                       'section' => null,
+                       'title' => null,
+                       'contact' => [
+                               'title' => $this->translator->trans($this->config['contact']['title']),
+                               'mail' => $this->config['contact']['mail']
+                       ],
+                       'copy' => [
+                               'by' => $this->translator->trans($this->config['copy']['by']),
+                               'link' => $this->config['copy']['link'],
+                               'long' => $this->translator->trans($this->config['copy']['long']),
+                               'short' => $this->translator->trans($this->config['copy']['short']),
+                               'title' => $this->config['copy']['title']
+                       ],
+                       'site' => [
+                               'donate' => $this->config['site']['donate'],
+                               'ico' => $this->config['site']['ico'],
+                               'logo' => $this->config['site']['logo'],
+                               'png' => $this->config['site']['png'],
+                               'svg' => $this->config['site']['svg'],
+                               'title' => $this->translator->trans($this->config['site']['title']),
+                               'url' => $this->router->generate($this->config['site']['url'])
+                       ],
+                       'canonical' => null,
+                       'alternates' => [],
+                       'facebook' => [
+                               'prefixes' => [
+                                       'og' => 'http://ogp.me/ns#',
+                                       'fb' => 'http://ogp.me/ns/fb#'
+                               ],
+                               'metas' => [
+                                       'og:type' => 'article',
+                                       'og:site_name' => $this->translator->trans($this->config['site']['title']),
+                                       #'fb:admins' => $this->config['facebook']['admins'],
+                                       'fb:app_id' => $this->config['facebook']['apps']
+                               ],
+                               'texts' => []
+                       ],
+                       'forms' => []
+               ];
+       }
+
        /**
         * Return the facebook image
         *
@@ -337,7 +434,6 @@ abstract class AbstractController extends BaseAbstractController {
                return [];
        }
 
-
        /**
         * Renders a view
         *
@@ -356,11 +452,8 @@ abstract class AbstractController extends BaseAbstractController {
                //Set locale
                $parameters['locale'] = str_replace('_', '-', $locale);
 
-               //Get router
-               $router = $this->container->get('router');
-
                //Get context path
-               $pathInfo = $router->getContext()->getPathInfo();
+               $pathInfo = $this->router->getContext()->getPathInfo();
 
                //Iterate on locales excluding current one
                foreach($this->config['locales'] as $current) {
@@ -373,7 +466,7 @@ abstract class AbstractController extends BaseAbstractController {
                        }
 
                        //Retrieve route matching path
-                       $route = $router->match($pathInfo);
+                       $route = $this->router->match($pathInfo);
 
                        //Get route name
                        $name = $route['_route'];
@@ -384,12 +477,12 @@ abstract class AbstractController extends BaseAbstractController {
                        //With current locale
                        if ($current == $locale) {
                                //Set locale locales context
-                               $parameters['canonical'] = $router->generate($name, ['_locale' => $current]+$route, UrlGeneratorInterface::ABSOLUTE_URL);
+                               $parameters['canonical'] = $this->router->generate($name, ['_locale' => $current]+$route, UrlGeneratorInterface::ABSOLUTE_URL);
                        } else {
                                //Set locale locales context
                                $parameters['alternates'][str_replace('_', '-', $current)] = [
-                                       'absolute' => $router->generate($name, ['_locale' => $current]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
-                                       'relative' => $router->generate($name, ['_locale' => $current]+$route),
+                                       'absolute' => $this->router->generate($name, ['_locale' => $current]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
+                                       'relative' => $this->router->generate($name, ['_locale' => $current]+$route),
                                        'title' => implode('/', $titles),
                                        'translated' => $this->translator->trans($this->config['languages'][$current], [], null, $current)
                                ];
@@ -399,8 +492,8 @@ abstract class AbstractController extends BaseAbstractController {
                        if (empty($parameters['alternates'][$shortCurrent = substr($current, 0, 2)])) {
                                //Set locale locales context
                                $parameters['alternates'][$shortCurrent] = [
-                                       'absolute' => $router->generate($name, ['_locale' => $current]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
-                                       'relative' => $router->generate($name, ['_locale' => $current]+$route),
+                                       'absolute' => $this->router->generate($name, ['_locale' => $current]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
+                                       'relative' => $this->router->generate($name, ['_locale' => $current]+$route),
                                        'title' => implode('/', $titles),
                                        'translated' => $this->translator->trans($this->config['languages'][$current], [], null, $current)
                                ];
@@ -412,7 +505,57 @@ abstract class AbstractController extends BaseAbstractController {
                        //Without application form
                        if (empty($parameters['forms']['application'])) {
                                //Fetch doctrine
-                               $doctrine = $this->getDoctrine();
+                               $doctrine = $this->get('doctrine');
+
+                               //Get favorites dances
+                               $danceFavorites = $doctrine->getRepository(Dance::class)->findByUserId($this->getUser()->getId());
+
+                               //Set dance default
+                               $danceDefault = !empty($danceFavorites)?current($danceFavorites):null;
+
+                               //Get favorites locations
+                               $locationFavorites = $doctrine->getRepository(Location::class)->findByUserId($this->getUser()->getId());
+
+                               //Set location default
+                               $locationDefault = !empty($locationFavorites)?current($locationFavorites):null;
+
+                               //With admin
+                               if ($this->isGranted('ROLE_ADMIN')) {
+                                       //Get dances
+                                       $dances = $doctrine->getRepository(Dance::class)->findAll();
+
+                                       //Get locations
+                                       $locations = $doctrine->getRepository(Location::class)->findAll();
+                               //Without admin
+                               } else {
+                                       //Restrict to favorite dances
+                                       $dances = $danceFavorites;
+
+                                       //Reset favorites
+                                       $danceFavorites = [];
+
+                                       //Restrict to favorite locations
+                                       $locations = $locationFavorites;
+
+                                       //Reset favorites
+                                       $locationFavorites = [];
+                               }
+
+                               //With session location id
+                               //XXX: set in session controller
+                               if (!empty($parameters['session']['location']['id'])) {
+                                       //Iterate on each location
+                                       foreach($locations as $location) {
+                                               //Found location
+                                               if ($location->getId() == $parameters['session']['location']['id']) {
+                                                       //Set location as default
+                                                       $locationDefault = $location;
+
+                                                       //Stop search
+                                                       break;
+                                               }
+                                       }
+                               }
 
                                //Create ApplicationType form
                                $application = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [
@@ -420,13 +563,27 @@ abstract class AbstractController extends BaseAbstractController {
                                        'action' => $this->generateUrl('rapsys_air_application_add'),
                                        //Set the form attribute
                                        'attr' => [ 'class' => 'col' ],
-                                       //Set admin
-                                       'admin' => $this->isGranted('ROLE_ADMIN'),
+                                       //Set dance choices
+                                       'dance_choices' => $dances,
+                                       //Set dance default
+                                       'dance_default' => $danceDefault,
+                                       //Set dance favorites
+                                       'dance_favorites' => $danceFavorites,
+                                       //Set location choices
+                                       'location_choices' => $locations,
+                                       //Set location default
+                                       'location_default' => $locationDefault,
+                                       //Set location favorites
+                                       'location_favorites' => $locationFavorites,
+                                       //With user
+                                       'user' => $this->isGranted('ROLE_ADMIN'),
+                                       //Set user choices
+                                       'user_choices' => $doctrine->getRepository(User::class)->findAllWithTranslatedGroupAndCivility($this->translator),
                                        //Set default user to current
-                                       'user' => $this->getUser()->getId(),
-                                       //Set default slot to evening
+                                       'user_default' => $this->getUser()->getId(),
+                                       //Set to session slot or evening by default
                                        //XXX: default to Evening (3)
-                                       'slot' => $doctrine->getRepository(Slot::class)->findOneById(3)
+                                       'slot_default' => $doctrine->getRepository(Slot::class)->findOneById($parameters['session']['slot']['id']??3)
                                ]);
 
                                //Add form to context
@@ -461,6 +618,8 @@ abstract class AbstractController extends BaseAbstractController {
                                'surname' => false,
                                //Without password
                                'password' => false,
+                               //Without slug
+                               'slug' => false,
                                //Without phone
                                'phone' => false
                        ];
@@ -488,14 +647,14 @@ abstract class AbstractController extends BaseAbstractController {
                }
 
                //With page infos and without facebook texts
-               if (empty($parameters['facebook']['texts']) && !empty($parameters['site']['title']) && !empty($parameters['page']['title']) && !empty($parameters['canonical'])) {
+               if (empty($parameters['facebook']['texts']) && !empty($parameters['site']['title']) && !empty($parameters['title']) && !empty($parameters['canonical'])) {
                        //Set facebook image
                        $parameters['facebook']['texts'] = [
                                $parameters['site']['title'] => [
                                        'font' => 'irishgrover',
                                        'size' => 110
                                ],
-                               $parameters['page']['title'] => [
+                               $parameters['title'] => [
                                        'align' => 'left'
                                ],
                                $parameters['canonical'] => [
@@ -513,16 +672,16 @@ abstract class AbstractController extends BaseAbstractController {
                        $parameters['facebook']['metas']['og:url'] = $parameters['canonical'];
                }
 
-               //With page title
-               if (!empty($parameters['page']['title'])) {
+               //With empty facebook title and title
+               if (empty($parameters['facebook']['metas']['og:title']) && !empty($parameters['title'])) {
                        //Set facebook title
-                       $parameters['facebook']['metas']['og:title'] = $parameters['page']['title'];
+                       $parameters['facebook']['metas']['og:title'] = $parameters['title'];
                }
 
-               //With page description
-               if (!empty($parameters['page']['description'])) {
+               //With empty facebook description and description
+               if (empty($parameters['facebook']['metas']['og:description']) && !empty($parameters['description'])) {
                        //Set facebook description
-                       $parameters['facebook']['metas']['og:description'] = $parameters['page']['description'];
+                       $parameters['facebook']['metas']['og:description'] = $parameters['description'];
                }
 
                //With locale
@@ -555,27 +714,19 @@ abstract class AbstractController extends BaseAbstractController {
        }
 
        /**
-        * TODO: define this function to limit subscribed services ???
-        * XXX: see vendor/symfony/framework-bundle/Controller/AbstractController.php
+        * {@inheritdoc}
         *
-       public static function getSubscribedServices() {
-               //TODO: add asset.package ?
-        return [
-            'router' => '?'.RouterInterface::class,
-            'request_stack' => '?'.RequestStack::class,
-            'http_kernel' => '?'.HttpKernelInterface::class,
-            'serializer' => '?'.SerializerInterface::class,
-            'session' => '?'.SessionInterface::class,
-            'security.authorization_checker' => '?'.AuthorizationCheckerInterface::class,
-            'templating' => '?'.EngineInterface::class,
-            'twig' => '?'.Environment::class,
-            'doctrine' => '?'.ManagerRegistry::class,
-            'form.factory' => '?'.FormFactoryInterface::class,
-            'security.token_storage' => '?'.TokenStorageInterface::class,
-            'security.csrf.token_manager' => '?'.CsrfTokenManagerInterface::class,
-            'parameter_bag' => '?'.ContainerBagInterface::class,
-            'message_bus' => '?'.MessageBusInterface::class,
-            'messenger.default_bus' => '?'.MessageBusInterface::class,
-        ];
-       }*/
+        * @see vendor/symfony/framework-bundle/Controller/AbstractController.php
+        */
+       public static function getSubscribedServices(): array {
+               //Return subscribed services
+               return [
+                       //'logger' => LoggerInterface::class,
+                       'doctrine' => ManagerRegistry::class,
+                       'rapsys_pack.path_package' => PackageInterface::class,
+                       'request_stack' => RequestStack::class,
+                       'router' => RouterInterface::class,
+                       'translator' => TranslatorInterface::class
+               ];
+       }
 }