Skip to content

Instantly share code, notes, and snippets.

@saro0h
Last active August 29, 2015 14:07
Show Gist options
  • Save saro0h/1673ddefcceb0c945f9b to your computer and use it in GitHub Desktop.
Save saro0h/1673ddefcceb0c945f9b to your computer and use it in GitHub Desktop.
Upload de fichier

En tant qu'utilisateur, je dois pouvoir uploader un fichier PDF lors de la création d'un produit.

Critères d'acceptances :
[x] La création de produit se fait avec un formulaire.
[x] Un produit constitué d'un nom, d'un prix et d'un fichier PDF.
[x] Utiliser la configuration sémantique dans le bundle afin de rendre configurable le chemin d'upload de fichier et valider cette configuration.

Étapes :

  1. Générer un bundle qu'il faut appeler : Vendor/ShopBundle.
  2. Créer une entité Product avec 3 propriétés : name, price and document.
  3. Ajouter les annotation @ORM de façon à déclarer le schéma Doctrine.
  4. Lancer la commande php app/console doctrine:database:create puis php app/console doctrine:schema:update.
  5. Créer la classe ProductType dans le dossier "Form", avec 4 champs : name, price, document and submit.
  6. Déclarer la comme service service.
  7. Créer la classe ProductController étendant Symfony\Bundle\FrameworkBundle\Controller\Controller (ainsi nous aurons accès au container d'injection dépendance ainsi qu'à l'ensemble de méthodes raccourcies).
  8. Créer une action newAction dans la classe ProductController avec l'url /product/new et faire en sorte de créer le formulaire et le passer à la vue.
  9. Restreindre la méthode HTTP de la route (GET and POST)
  10. Créer une vue dans le dossier Resources/views/Product la vue nommée new.html.twig afin de rendre le formulaire.
  11. Ajouter les contraintes de validation pour les champs de la classe Produit gràce aux annotations.
  12. Ajouter le form thème afin d'englober chacun des champs avec un "fieldset".
  13. Dans le template, désactiver la validation HTML5, et ajouter le form_enctype dans la balise ouvrante <form….
  14. Appeler la méthode handleRequest() dans l'action.
  15. Ajouter la logique dans le if ($form->isValid()) afin de persister le produit dans l'upload du document.
  16. Créer un service Uploader dans le dossier Vendor\ShopBundle\Services avec la méthode upload().
  17. Dans la méthode upload(), implementer la logique pour générer le nom du document uploadé et le déplacer dans le bon dossier . La méthode doit retourner le nom de fichier généré.
  18. Déclarer l'Uploader en tant que service et injecter le service filesystem via son constructeur.
  19. Créer la configuration sémantique pour déclarer le chemin d'upload (dossier).
  20. Indiquer la clé vendor_shop.upload_path dans app/config/config.yml avec la valeur "%upload_path%".
  21. Déclarer le noeud dans la classe src/Vendor/ShopBundle/DependencyInjection/Configuration.php.
  22. Ajouter l'argument upload_path à la définition du service vendor.uploader dans la méthode src/Vendor/ShopBundle/DependencyInjection/VendorShopExtension::load().
  23. Ajouter la propriété privée $path dans la classe Uploader de manière à ce qu'elle soit initialisée dans le constructeur du service
  24. Dans l'action, récupérer le service uploader et appeler la méthode upload().
  25. Ne pas oublier de mettre à jour la priopriété $product->document.
  26. Lorsque le produit est persité, rediriger l'utilisateur vers la page ayant la route /product/show/{id} afin de montrer le produit nouvellement créé en base de données.
  27. Créer une action showAction avec la route /product/show/{id}.
  28. Créer le template show.html.twig dans le dossier src/Vendor/ShopBundle/Resources/views/Product afin d'afficher les informations du produits.

Et voilà!

Un peu de documentation :

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment