Test : prendre le fichier ressource et tester la route app_dev.php/test2fini/Produit
php bin/console generate:bundle --namespace=test2crudBundle --no-interaction --format=annotation
Nom du Bundle : test2crudBundle (laisser les options par défaut : dossier src pour les sources, les routes sont définies avec les annotations).
prefix: /test2
devant chaque nom de route définie pour ce Bundle., exemple :test2crud:
resource: "@test2crudBundle/Controller/"
type: annotation
prefix: /test2
Créer un fichier src/test2crudBundle/Controller/ProduitController.php
Recopier les vues : dossier produit le fichier v_layout.html.twig et v_menu.html.twig depuis src/test2finicrudBundle/Resources/views/ dans le dossier views du nouveau Bundle.
Dans chaque vue, remplacer test2finicrudBundle par test2crudBundle
Dans les vues, faire référence au Bundle (c’est obligatoire) :
{% include "test2crudBundle::v_menu.html.twig" %}
dans le fichier /src/test2crudBundle/Resources/views/v_layout.html.twig{% extends("test2crudBundle::v_layout.html.twig") %}
dans les 4 fichiers /src/test2crudBundle/Resources/views/produit
remarque : {% extends "::base.html.twig" %}
fait référence au dossier app/Resources/views/base.html.twig
Il faut commencer par générer une entité
Pour créer une entité :
php bin/console generate:doctrine:entity
Nom de l’entité : test2crudBundle:sproduits avec les annotations, ( l’identifiant (de nom id) est généré par défaut)
- typeProduit_id : integer
- nom : string (255)
- prix : float
- photo : string (255)
Cette entité permet d’accéder aux données via des setter et getter de la base de données
php bin/console doctrine:schema:update --dump-sql
Pour créer la table : php bin/console doctrine:schema:update --force
Vérifier que la table existe dans votre base de données et insérer les données suivantes :
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'salade', '2.00','salade.jpeg');
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'choux', '2.50','choux.jpeg');
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'pomme de terre', '1.50','pommeterre.jpeg');
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'tomate', '1.50','tomate.jpeg');
Pour les rapides : il est possible d’utiliser des fixtures pour remplir la base de données (très utile pour un projet à plusieurs car les données sont partagées sur github) http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
php bin/console generate:doctrine:entity --no-interaction --entity=test2crudBundle:sproduits --format=annotation --fields=" typeProduit_id:integer nom:string(255) prix:float photo:string(255)"
use test2crudBundle\Entity\sproduits;
$instanceRepositorySproduit = $this->getDoctrine()->getManager()->getRepository("test2crudBundle:sproduits");
$produits = $instanceRepositorySproduit->findAll();
Définir un objet de type sproduits , mettre les attributs aux bonnes valeurs avec les setter (la classe sproduits a été importée lors de la dernière étape)
$produit = new sproduits();
$produit->setNom($donnees['nom']);
$produit->setPrix($donnees['prix']);
$produit->setPhoto($donnees['photo']);
$produit->setTypeProduitId($donnees['typeProduit_id']);
Persister les données (enregistrer dans la base)
// On récupère l'EntityManager
$em = $this->getDoctrine()->getManager();
// Étape 1 : On « persiste » l'entité
$em->persist($produit);
// Étape 2 : On « flush » tout ce qui a été persisté avant
$em->flush();
Il faut récupérer l’identifiant
$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $id));
var_dump($produit);
die();
supprimer l’instruction var_dump et die
Tester le code ci dessous dans la méthode validFormEdit pour modifier les données :
$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $donnees['id']));
$produit->setNom($donnees['nom']);
$produit->setPrix($donnees['prix']);
$produit->setPhoto($donnees['photo']);
$produit->setTypeProduitId($donnees['typeProduit_id']);
$em = $this->getDoctrine()->getManager();
$em->persist($produit);
$em->flush();
$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $id));
$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $id));
$em->remove($produit);
$em->flush();
php bin/console generate:doctrine:entity --no-interaction --entity=test2crudBundle:stypeProduits --format=annotation --fields="libelle:string(255)"
php bin/console doctrine:schema:update --dump-sql
php bin/console doctrine:schema:update --force
INSERT INTO stype_produits (id, libelle) VALUES
(1, 'type 1'),
(2, 'type 2'),
(3, 'type 3');
$instanceRepositoryStypeproduit = $this->getDoctrine()->getManager()->getRepository("test2crudBundle:stypeProduits");
$typeProduits=$instanceRepositoryStypeproduit->findAll();
Ce code ne semble pas utile avant la définition du contrôleur
use test2crudBundle\Entity\stypeProduits;
Classe dans laquelle, on crée ses propres requêtes (pour les requêtes de type select un peu compliqué) avec le language DQL (Doctrine Query Language)
Dans le fichier sproduitsRepository
public function getProduits(){
// http://symfony.com/doc/current/doctrine/associations.html#joining-related-records
// $query = $this->getEntityManager()
// ->createQuery("SELECT p.id, t.libelle, p.nom, p.prix, p.photo
// FROM test2crudBundle:sproduits as p
// JOIN test2crudBundle:stypeProduits as t
// WHERE p.typeProduit_id=t.id
// ORDER BY p.nom");
//
// return $query->getResult();
$qb=$this->createQueryBuilder('p'); // il lui faut une lettre, i : item en base de données donc schéma
$qb->select('p.id', 't.libelle', 'p.nom', 'p.prix', 'p.photo')
->join( 'test2crudBundle:stypeProduits', 't')
->where('p.typeProduit_id=t.id')
->addOrderBy('p.nom', 'ASC');
return $qb->getQuery()->getResult();
}
$produits = $this->getDoctrine()
->getRepository('test2crudBundle:sproduits')
->getProduits();
ManyToOne
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html
Déclaration de la relation dans la bonne entité (entity : sproduits)
/**
* @var int
*
* @ORM\Column(name="type_produit_id", type="integer")
*/
/**
* @ORM\ManyToOne(targetEntity="stypeProduits")
* @ORM\JoinColumn(name="typeProduit_id", referencedColumnName="id")
*/
Utilisation dans les vues (twig)
{{produit.typeProduitId.libelle}}
php bin/console doctrine:schema:update --dump-sql
php bin/console doctrine:schema:update --force