AppExtension.php 8.81 KB
Newer Older
1 2 3 4
<?php

namespace App\Twig;

5
use App\Entity\Comptoir;
6
use App\Entity\Flux;
7
use App\Entity\Groupe;
8
use App\Entity\Groupeprestataire;
Julien Jorry committed
9
use App\Entity\News;
10
use App\Entity\Prestataire;
11
use App\Entity\Rubrique;
Julien Jorry committed
12
use App\Entity\Siege;
13
use App\Entity\User;
Julien Jorry committed
14 15 16
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
17
use Symfony\Component\HttpFoundation\Request;
Julien Jorry committed
18 19
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
20
use Symfony\Component\Security\Core\User\UserInterface;
21 22 23
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
24
use Twig\TwigTest;
25 26 27

class AppExtension extends AbstractExtension
{
Julien Jorry committed
28
    public $em;
29
    public $security;
30
    public $container;
31
    public $paginator;
Julien Jorry committed
32
    public $session;
33

34
    public function __construct(ContainerInterface $container, Security $security, EntityManagerInterface $em, PaginatorInterface $paginator, SessionInterface $session)
35
    {
Julien Jorry committed
36
        $this->em = $em;
37
        $this->security = $security;
38
        $this->container = $container;
39
        $this->paginator = $paginator;
Julien Jorry committed
40
        $this->session = $session;
41 42 43 44 45
    }

    public function getFunctions()
    {
        return [
46
            new \Twig_SimpleFunction('showModalGroupChoice', array($this, 'showModalGroupChoice')),
47 48 49 50
            new \Twig_SimpleFunction('getCurrentComptoir', array($this, 'getCurrentComptoir')),
            new \Twig_SimpleFunction('getCurrentGroupe', array($this, 'getCurrentGroupe')),
            new \Twig_SimpleFunction('getCurrentPrestataire', array($this, 'getCurrentPrestataire')),
            new \Twig_SimpleFunction('isCotisationValid', array($this, 'isCotisationValid')),
Julien Jorry committed
51
            new \Twig_SimpleFunction('getSiege', array($this, 'getSiege')),
Julien Jorry committed
52
            new \Twig_SimpleFunction('isDevFixture', array($this, 'isDevFixture')),
Julien Jorry committed
53
            new \Twig_SimpleFunction('getLastNews', array($this, 'getLastNews')),
54
            new \Twig_SimpleFunction('getAllPrestataires', array($this, 'getAllPrestataires')),
55
            new \Twig_SimpleFunction('getAllGroupePrestataires', array($this, 'getAllGroupePrestataires')),
56
            new \Twig_SimpleFunction('getAllComptoirs', array($this, 'getAllComptoirs')),
57 58
            new \Twig_SimpleFunction('getAllRubriques', array($this, 'getAllRubriques')),
            new \Twig_SimpleFunction('getAllGroupes', array($this, 'getAllGroupes')),
59
            new \Twig_SimpleFunction('getAllFlux', array($this, 'getAllFlux')),
60
            new \Twig_SimpleFunction('mediaurl', array($this, 'mediaurl')),
Julien Jorry committed
61
            new \Twig_SimpleFunction('parameter', function ($name) {
62 63 64 65
                return $this->container->getParameter($name);
            })
        ];
    }
66

67 68 69 70 71 72 73 74 75 76 77 78 79
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('json_decode', [$this, 'jsonDecode']),
            new \Twig_SimpleFilter('safe_email', [$this, 'safeEmailFilter']),
        );
    }

    public function jsonDecode($string)
    {
        return json_decode($string, true);
    }

80 81 82 83 84 85 86 87 88 89
    public function showModalGroupChoice()
    {
        if ($this->security->getUser() != null) {
            if (count($this->security->getUser()->getPossiblegroups()) > 1 && count($this->security->getUser()->getGroups()) == 0) {
                return true;
            }
        }
        return false;
    }

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
    public function getCurrentComptoir()
    {
        if (!$this->session->has('_comptoirgere')) {
            return null;
        }
        return $this->em->getRepository(Comptoir::class)->findOneById($this->session->get('_comptoirgere')->getId());
    }
    
    public function getCurrentGroupe()
    {
        if (!$this->session->has('_groupegere')) {
            return null;
        }
        return $this->em->getRepository(Groupe::class)->findOneById($this->session->get('_groupegere')->getId());
    }
    
    public function getCurrentPrestataire()
    {
        if (!$this->session->has('_prestagere')) {
            return null;
        }
        return $this->em->getRepository(Prestataire::class)->findOneById($this->session->get('_prestagere')->getId());
    }

    public function isCotisationValid(): bool
    {
        if ($this->security->getUser() != null) {
117
            if ($this->security->getUser()->isGranted('ROLE_ADHERENT') && $this->security->getUser()->getAdherent() != null) {
118
                $query = $this->em->getRepository(Flux::class)->getQueryByAdherent($this->security->getUser()->getAdherent(), 'cotisation');
119
            } elseif ($this->security->getUser()->isGranted('ROLE_PRESTATAIRE') && $this->session->get('_prestagere') != null) {
120 121 122 123 124 125 126 127 128 129 130 131
                $query = $this->em->getRepository(Flux::class)->getQueryByPrestataire($this->session->get('_prestagere'));
            }
            $cotisations = $query->getResult();
            foreach ($cotisations as $cotisation) {
                if ($cotisation->getCotisationInfos()->getFin() > new \DateTime("now")) {
                    return true;
                }
            }
        }
        return false;
    }

Julien Jorry committed
132 133 134 135 136 137 138 139 140 141 142
    public function isDevFixture(?string $username = null)
    {
        if ($username == null) {
            $user = $this->em->getRepository(User::class)->findBy(array('username' => ['user_redacteur', 'user_tresorier', 'user_prestataire', 'user_contact']));

            return (count($user) === 4);
        }

        return ($this->em->getRepository(User::class)->findOneByUsername($username) != null);
    }

Julien Jorry committed
143 144
    public function getSiege()
    {
Julien Jorry committed
145
        return $this->em->getRepository(Siege::class)->findOneById(1);
Julien Jorry committed
146 147
    }

Julien Jorry committed
148 149
    public function getLastNews($limit = 5)
    {
Julien Jorry committed
150
        return $this->em->getRepository(News::class)->findBy(array('enabled' => true), array('createdAt' => 'DESC'), $limit);
Julien Jorry committed
151 152
    }

153 154
    public function getAllPrestataires()
    {
Julien Jorry committed
155
        return $this->em->getRepository(Prestataire::class)->findBy(array('mlc' => false, 'enabled' => true), array('raison'=> 'ASC'));
156 157
    }

158 159
    public function getAllGroupePrestataires($type = '')
    {
Julien Jorry committed
160
        return $this->em->getRepository(Groupeprestataire::class)->findBy(array('type' => $type, 'enabled' => true));
161 162
    }

163 164
    public function getAllComptoirs()
    {
Julien Jorry committed
165
        return $this->em->getRepository(Comptoir::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
166 167
    }

168 169
    public function getAllRubriques()
    {
Julien Jorry committed
170
        return $this->em->getRepository(Rubrique::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
171
    }
172

Julien Jorry committed
173
    public function getAllFlux(User $user, Request $request, $parenttype = null)
174 175
    {
        $query = null;
Julien Jorry committed
176 177 178 179 180 181 182 183
        if ($this->session->get('_prestagere') != null) {
            $query = $this->em->getRepository(Flux::class)->getQueryByPrestataire($this->session->get('_prestagere'), $parenttype);
        } elseif ($user->getAdherent() != null) {
            $query = $this->em->getRepository(Flux::class)->getQueryByAdherent($user->getAdherent(), $parenttype);
        } elseif ($this->session->get('_comptoirgere') != null) {
            $query = $this->em->getRepository(Flux::class)->getQueryByComptoir($this->session->get('_comptoirgere'));
        } elseif ($this->session->get('_groupegere') != null) {
            $query = $this->em->getRepository(Flux::class)->getQueryByGroupe($this->session->get('_groupegere'));
184 185 186 187 188 189 190 191 192 193 194 195 196
        }
        if ($query != null) {
            $pagination = $this->paginator->paginate(
                $query, /* query NOT result */
                $request->query->getInt('page', 1)/*page number*/,
                10/*limit per page*/
            );

            return $pagination;
        }
        return null;
    }

197 198
    public function getAllGroupes()
    {
Julien Jorry committed
199
        return $this->em->getRepository(Groupe::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
200 201
    }

202 203 204
    public function mediaurl($media, $format)
    {
        $provider = $this->container->get($media->getProviderName());
Julien Jorry committed
205

206 207 208
        return $provider->generatePublicUrl($media, $format);
    }

209
    public function getTests(): array
210 211
    {
        return [
212
            new TwigTest('instanceof', [$this, 'instanceof']),
213 214 215
        ];
    }

216
    public function instanceof($var, $instance)
217
    {
218
        $reflexionClass = new \ReflectionClass($instance);
Julien Jorry committed
219 220
        ;

221
        return $reflexionClass->isInstance($var);
222
    }
223 224 225 226 227 228 229 230 231 232 233 234

    /**
     * Protects email address.
     * (inspired by : https://github.com/getgrav/grav/blob/develop/system/src/Grav/Common/Twig/TwigExtension.php )
     *
     * @param  string $str
     *
     * @return string
     */
    public function safeEmailFilter($str)
    {
        $email   = '';
Julien Jorry committed
235 236 237 238
        for ($i=0, $len = strlen($str); $i < $len; $i++) {
            $j = mt_rand(0, 1);
            if ($j === 0) {
                $email .= '&#'.ord($str[$i]).';';
Julien Jorry committed
239
            } elseif ($j === 1) {
240 241 242
                $email .= $str[$i];
            }
        }
Julien Jorry committed
243
        return str_replace('@', '&#64;', $email);
244
    }
245
}