Admin

Publié il y a 9 mois,21 jours

 

Voici ce qu'il nous reste à faire :

 

  • Ajouter une image au formulaire d'ajout de film
  • faire une page d'accueil avec la liste des derniers films et des derniers acteurs
  • faire un module de critique de film
  • intégrer un système d'utilisateur pour identifier les personnes autorisées à critiquer les films
  • envoyer un mail de confirmation lors de l'inscription
  • faire le module de vote sur les critiques
  • intégrer un système de commentaire Disqus

 

Ajouter une image au formulaire d'ajout de film

Pour ce qui est de l'ajout d'un champ d'upload d'image au formulaire, je ne trouve pas ca vraiment extremement pratique... Ca requiert pas mal de code et je pense que ca aurait pu être mieux fait. J'ai été voir sur le site de symfony ou ils parlent de l'upload de fichier mais leur méthode ne m'a pas satisfait, je vais vous présenter ma méthode.

Pour commencer, on va modifier l'entité Movie (/src/Greanstone/GreanstoneHollywebBundle/entity/Movie.php en lui ajoutant un champ picture. On ajoute ces quelques lignes.

 

    /**
     * @Assert\File(maxSize="6000000")
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $picture;    /**

 

 

     * Set picture
     *
     * @param string $picture
     */
    public function setPicture($picture) {
        $this->picture = $picture;
    }
 
    /**
     * Get picture
     *
     * @return string
     */
    public function getPicture() {
        return $this->picture;
    }
 
Notez l'utilisation dans les annotations d'Assert. Assert concerne la validation des champs dans les formulaires. Pour pouvoir l'utiliser il faut l'inclure au début du fichier. Il faut donc s'assurer que cette ligne existe :
 
 
use Symfony\Component\Validator\Constraints as Assert;
 
Comme l'on a spécifié Assert\File..., le formulaire saura que c'est un fichier et donc qu'il doit afficher le widget d'upload de fichier. Plutot intélligent. En parlant du formulaire, étant donné qu'on l'a genéré avec l'ancienne entité, il faut le mettre à jour. Ajoutons donc le champ dans le formulaire :
MovieType.php
$builder
            ->add('title','text')
            ->add('picture')
            ->add('created_at')
            ->add('updated_at')
            ->add('category')
            ->add('actors');
L'exécution de la commande php console doctrine:schema:update --force mettera à jour la base de données en ajoutant un colonne picture à la table movie.
Donc récapitulons, nous avons donc notre entité avec un nouveau champ, un formulaire avec un nouveau widget, et une base de données avec une nouvelle colonne.
Créons désormais un répertoire dans lequel les images de films seront enregistrées. Créons le fichier /uploads/movies et donnons lui les droits d'écriture (777).
Nous metterons les images de chaque film dans le dossier portant l'id du film. Par exemple pour le film d'id = 1, nous metterons l'image dans le dossier /uploads/movies/1
 
C'est à ce moment précis que ca se complique.
Voici le fonctionnement : Le fomulaire va uploader un fichier. L'action de création ou d'édition doit se charger d'enregistrer le nom du fichier en base de données et de copier le fichier au bon endroit, c'est à dire /uploads/movies/{{entity.id}}/{{entity.picture}}
 

Doctrine2 va nous sauver la vie.

Doctrine2 nous permet de définir des méthodes à exécuter à un moment précis du processus de traitement de l'entité, par exemple avant ou après la création, avant ou après la mise à jour, avant ou après la suppression etc.. 
Pour faire cela, il faut que notre entité ait l'annotation  :
 
/**
 * Greanstone\HollywebBundle\Entity\Movie
 *
 * @ORM\Table()
 * @ORM\HasLifecycleCallbacks
 * @ORM\Entity
 */
class Movie { ...
On n'a plus qu'à ajouter l'annotation adéquat au fonctionnement attendu. Les différents types d'annotations sont accessibles içi : http://www.doctrine-project.org/docs/orm/2.0/en/reference/annotations-reference.html#annref-postremove
Voici toutes les fonctions que je vais utiliser pour faire le traitement de l'upload :
 
  • getFullPicturePath // renvoit le chemin complet 
    de l'image dans le système de fichier
  • getUploadRootDir  // définit le répertoire d'upload pour le film 
  • getTmpUploadRootDir  // définit le repertoire temporaire
  • uploadPicture  // permet de téléverser l'image dans le repertoire temporaire (si fim nouveau) ou directement dans le bon repertoire (si mise à jour)
  • movePicture    // permet de déplacer l'image dans le repertoire nommé de l'identifiant du film
  • removePicture //permet de supprimer l'image lors de la suppression du film
 
Code Source : 
 

public function getFullPicturePath() {
        return null === $this->picture ? null : $this->getUploadRootDir(). $this->picture;
    }

    protected function getUploadRootDir() {
        // the absolute directory path where uploaded documents should be saved
        return $this->getTmpUploadRootDir().$this->getId()."/";
    }

    protected function getTmpUploadRootDir() {
        // the absolute directory path where uploaded documents should be saved
        return __DIR__ . '/../../../../web/uploads/movies/';
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function uploadPicture() {
        // the file property can be empty if the field is not required
        if (null === $this->picture) {
            return;
        }
        if(!$this->id){
            $this->picture->move($this->getTmpUploadRootDir(), $this->picture->getClientOriginalName());
        }else{
            $this->picture->move($this->getUploadRootDir(), $this->picture->getClientOriginalName());
        }
        $this->setPicture($this->picture->getClientOriginalName());
    }
    
    /**
     * @ORM\PostPersist()
     */
    public function movePicture()
    {
        if (null === $this->picture) {
            return;
        }
        if(!is_dir($this->getUploadRootDir())){
            mkdir($this->getUploadRootDir());
        }
        copy($this->getTmpUploadRootDir().$this->picture, $this->getFullPicturePath());
        unlink($this->getTmpUploadRootDir().$this->picture);
    }

    /**
     * @ORM\PreRemove()
     */
    public function removePicture()
    {
        unlink($this->getFullPicturePath());
        rmdir($this->getUploadRootDir());
    }

 

Partie 1 : http://leny-bernard.com/fr/afficher/article/creer-un-site-facilement-en-symfony2

Partie 2 : http://leny-bernard.com/fr/afficher/article/creer-un-site-facilement-en-symfony2-partie-2

Partie 3 : http://leny-bernard.com/fr/afficher/article/creer-un-site-facilement-en-symfony2-partie-3

Partie 4 : http://leny-bernard.com/fr/afficher/article/creer-un-site-facilement-en-symfony2-partie-4


Ajout d'un commentaire :

 

Votre email ne sera jamais publié

Doit débuter par http:// ou https://
 
Vincent
il y a 9 mois,19 jours...

Bonjour et merci pour ces quatre premières parties ;) ! Impatient de voir la suite :).

Blog passé en favoris car j'attends d'autres retours d'expérience avec joie :D !

 
il y a 9 mois,6 jours...

Hey,

Merci Vincent ! J'étais en vacances depuis 15 jours, je vais continuer le tutoriel d'içi quelques jours.

A+

 
Drakun
il y a 9 mois,0 jour...

Un grand merci a LENNY.

Vivement la suite !

 
il y a 7 mois,25 jours...

Deja 1 mois et 26 jours depuis le dernier tuto !! et le site n'avance toujours pas... :(

Je n'ai vraiment pas beaucoup de temps ces jours-ci, les tutos devraient reprendre dans 1 mois et demi...

Désolé pour le délai !

Ceci dit, si ca tente quelqu'un d'écrire la suite, ca peut se gérer !

 
il y a 7 mois,25 jours...

Deja 1 mois et 26 jours depuis le dernier tuto !! et le site n'avance toujours pas... :(

Je n'ai vraiment pas beaucoup de temps ces jours-ci, les tutos devraient reprendre dans 1 mois et demi...

Désolé pour le délai !

Ceci dit, si ca tente quelqu'un d'écrire la suite, ca peut se gérer !

 
Pixys
il y a 7 mois,23 jours...

Bonsoir,

petite question, si je veux afficher l'URL de mon fichier dans une vue twig pour pouvoir le télécharger, comment je m'y prends ?

Merci beaucoup :-)

 
Vins
il y a 3 mois,29 jours...

Save my day :) THX

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
tribal
il y a 1 mois,19 jours...

Salut,

Super ton petit script merci du partage.

Par contre j'ai un petit soucis lorsque je veux juste editer un enregistrement dans ma base sans change l'image il me supprime automatiquement l'image.

Aurais tu une idée de comment faire pour qu'il ne supprime pas l'image si elle ne change pas.

 
il y a 4 jours et 0 heure...

Cette méthode d'upload d'image est certes plus légère, mais il vaut mieux se fier à celle du Cookbook Symfony2 car elle permet d'éditer les enregistrements sans effacer l'image (bien que je sois d'accord avec toi sur le fait qu'elle aurait pu être mieux construite).

Sinon, dommage que tu te sois arrêté en si bon chemin, ce tuto était très prometteur. ;)