E-lycée

Projet de fin d'année – dev09

amélie_meunier && gabriel_cousin

Organisation

Back

Front

Front

Public

Modal de login
Load-more

- Scripts -

Dashboard

Vérification de formulaires
Polyfill Datetimepicker
Accordion
Actions multiples
Toggle status
Graph de statistiques
Material.js – Loader – Notifications

Front

Sass

BrowserSync

Autoprefixer

Minifier (CSS + JS)

gulp.task('css:build', function() {
  return gulp.src('web/dev/scss/*.scss')
    .pipe(plumber())
    .pipe(sass({
      errLogToConsole: true
    }))
    .pipe(autoprefixer({
      browsers: ['last 2 versions']
    }))
    .pipe(minifyCSS({
      aggressiveMerging: false,
      keepSpecialComments: 0
    }))
    .pipe(gulp.dest('web/css'));
});

gulp.task('js', function() {
  return gulp.src([
    'web/dev/js/material.js',
    'web/dev/js/better-dom.js',
    ...
  ])
    .pipe(concat('scripts.js'))
    .pipe(minifyJS())
    .pipe(gulp.dest('web/js'));
});

- Workflow -

Front

2 CSS : app_home.css (16Ko Gzip)
+ app_dashboard (15Ko Gzip)

(préfixage standard : IE10+ / 2 last versions)

- Statistiques -

1 JS : scripts.js (24Ko Gzip)

(youmightnotneedjquery)

Back

- Gestions des Bundles -

PublicBundle

DashboardBundle

UserBundle

PublicController

DefaultController

FichesController

ScoresController

PostsController

extends FOSUserBundle

DefaultController

Post

Commentaire

Status

ContactEmail

Fiche

Choix

Niveau

Scores

User

Back

- Modèle des données -

    private $createAt;

    /**
     * @ORM\ManyToOne(targetEntity="Status")
     * @ORM\JoinColumn(name="status_id", referencedColumnName="id")
     *
     */
    private $status;

    /**
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="posts")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     *
     */
    private $auteur;

    /**
     * @ORM\OneToMany(targetEntity="Commentaire", mappedBy="post")
     */
    protected $commentaires;

Post

Commentaire

Status

FOS_user

0,n

0,n

0,n

1,1

1,1

1,1

PublicBundle/Entity/Post.php

Back

- Modèle des données -

  public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('content')
            ->add('choices','collection',array(
                'type' => new ChoixType(),
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false
            ))
            ->add('niveau','entity',array(
                'class' => 'DashboardBundle:Niveau',
                'property' => 'name'
            ))
        ;
    }

Fiche

Choix

Status

FOS_user

0,n

0,n

1,1

0,n

DashboardBundle/Form/FicheType.php

1,1

Score

1,1

0,n

1,n

1,1

1,1

1,n

1,1

etudiant

professeur

Back

- Bundles utilisés -

Swiftmailer

$message = \Swift_Message::newInstance()
      ->setSubject('E-mail de contact')
      ->setFrom('elycee.dev@gmail.com')
      ->setTo(array('elycee.dev@gmail.com', $form->getData()->getEmail()))
      ->setBody($this->renderView('PublicBundle:Public:contactEmail.html.twig', array('contact' => $contact)), 'text/html');
$this->get('mailer')->send($message);

FOSJsRouting

PublicBundle/Controller/PublicController.php

var route = Routing.generate('public.news.ajax', { page: this.pageToLoad }, true);

web/js/dev/pagination.js

/**
* @Route("/ajaxnews/{page}", name="public.news.ajax", options = {"expose" = true})
*/
public function ajaxnewsAction(Request $request,$page)

PublicBundle/Controller/PublicController.php

Back

- Bundles utilisés -

FOSUser

class User extends BaseUser
{

UserBundle/Entity/User.php

    firewalls:
        #...
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                default_target_path: public.home.index
                use_referer: true
                success_handler: redirect.after.login
            logout:
                target: public.home.index
            anonymous: true

    access_control:
           #...
        - { path: ^/professeur, role: ROLE_TEACHER }
        - { path: ^/eleve, role: ROLE_STUDENT }

app/config/security.yml

Back

- Bundles utilisés -

iPHPFileStore

  public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ..
            ->add('picture', 'iphp_file')
            .. ; 
    }

PublicBundle/Form/PostType.php

 * @FileStore\Uploadable
 */
class Post
{

/* (...) */ 

/**
 * @var string
 *
 * @ORM\Column(name="picture", type="array", nullable=true)
 * @Assert\Image(
 *      maxSize="2M",
 *      mimeTypes={"image/jpeg","image/png","image/gif"},
 *      mimeTypesMessage="Vous devez transférer des JPG,PNG ou GIF uniquement."
 * )
 * @FileStore\UploadableField(mapping="picture")
 */
private $picture;

PublicBundle/Entity/Post.php

Back

- Bundles utilisés -

OrnicarAkismet

ornicar_akismet:
    api_key:        "%api_key_askimet%"
    url:            "%urlSite%"

app/config/config.yml

$data = $formCommentaire->getData();
            $akismet = $this->container->get('ornicar_akismet');
            $isSpam = $akismet->isSpam(array(
                 'comment_author'  => $data->getUsername(),
                 'comment_content' => $data->getContenu()
            ));
            if (!$isSpam){
                $commentaire->setCreateAt(new \DateTime());
                $commentaire->setPost($article);
                $em = $this->getDoctrine()->getManager();
                $em->persist($commentaire);
                $em->flush();
                $message = "Votre commentaire a été ajouté";

            }

PublicBundle/Controller/PublicController.php

Améliorations 

E-lycée

By Gabriel Cousin

E-lycée

  • 188