Table des matières

Code de MyCentraleAssos

Le code de MyCentraleAssos est ouvert uniquement à l'équipe travaillant sur l'appli. Ce code est disponible sur la forge de l'école : https://forge.centrale-marseille.fr/projects/plateform-assos/repository

Technologies utilisées

MyCentraleAssos utilise la norme de développement du GInfo avec les technologies suivantes :

La liste complète ainsi que les versions sont disponibles sur le composer.json du projet.

L'application est conçue pour tourner avec un serveur Apache 2 et un serveur MySQL pour la base de données.

Les technologies utilisées pour le développement sont :

De plus diverses libraries sont utilisées en front :

La liste complète ainsi que les versions sont disponibles sur le package.json du projet.

Entités

Le schéma relationnel de MyCA peut être résumé par le diagramme UML suivant :

Le schéma est correct à quelques champs près pour quelques entités.

Utilisateurs

Détail

Associations

Détail

Cotisations

Détails

Contrôleurs

les controllers sont répartis suivant une logique fonctionnelle dans divers dossiers :

Particularités de code de MyCentraleAssos

Envoi de mails

Pour envoyer des mails facilement, on peut utiliser le service Mailer écrit pour My. Pour l'utiliser il suffit de le passer en argument de l'action, comme ceci :

    /**
     * @Route("/addMember/{id}", name="groupe_add_member")
     * @Security("is_granted('ROLE_USER')")
     */
    public function addMember(Groupe $groupe, Request $request, Mailer $mailer)
    {

Celui-ci permet d'envoyer des mails en html et la version txt en utilisant Twig. Il faut créer des templates correspondant dans templates/Mail/

Utilisation :

public function sendMail($destinataire, $titre, $params, $html_template, $plain_template=null, $piece_jointe=false)

Exemple d'utilisation :

            $mailer->sendMail(
                [$user->getEmail() => $user->getFullName()],
                'Vous avez été ajouté au groupe '.$groupe->getNom(),
                ['gm' => $newgm],
                'Mail/Groupe/addMember.html.twig',
                'Mail/Groupe/addMember.txt.twig'
            );

Pour un exemple avec pièces jointes voir le CotisationController.php

Champ de recherche d'utilisateur

Pour mettre un champ de recherche d'utilisateur, il suffit d'avoir un select ayant la class userseach et d'inclure le fichier userSearch.js.

Exemple :

<select name="addUser" id="addUser" class="usersearch form-control"></select>

ou un form avec twig :

{{ form_row(form.user, {'attr': {'class': 'usersearch'}}) }}

Import du fichier JS :

<script src="{{ asset('build/userSearch.js') }}"></script>

Très important : lors de l'utilisation avec un form, on envoie le select vide (recherche via ajax) mais il faut rajouter les choix sinon le form passe pas la validation. Cela se fait comme ceci (exemple formulaire cotisation) :

ublic function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            [...]
            ->add('user', EntityType::class, [
                'class' => 'App\Entity\User',
                'required' => true,
                'choices' => [],
                'choice_label' => function(User $user){ return $user->getNom().' '.$user->getPrenom(); }
            ])
            [...}
        ;
 
        // Comme pas de choix disponibles sur le User (autocomplete), il faut rajouter le choix de l'utilisateur aux possibilités
        $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event){
            $data = $event->getData();
 
            if(!$data || empty($data['user'])) return;
 
            $event->getForm()->add('user', EntityType::class,
                [
                    'class' => 'App\Entity\User',
                    'required' => true,
                    'query_builder' => function(EntityRepository $repo) use ($data){
                        return $repo->createQueryBuilder('u')->where('u.id = :id')->setParameter('id', $data['user']);
                    },
                    'choice_label' => function(User $user){ return $user->getNom().' '.$user->getPrenom(); }
                ]);
        });
    }

Cas particulier : Non validation du formulaire (sans rafraîchissement) on peut réinitialiser le champ via le code suivant (exemple ajout utilisateur dans groupe sans rechargement) :

$('#addUser').change(function(){
    let uid = $(this).val(),
    gid = $('#groupe_id').val(),
    csrf = $('#admin_csrf').val();
 
    if(!uid)
        return;
 
    $(this).val('').trigger('change.abs.preserveSelected').selectpicker('refresh');
 
    [...}

DataTable