Les modèles

Afin de sauvegarder nos demandes de devis, nous allons devoir créer l'entité "Demande de devis".

Générer le code d'un module

La création d'une entité est longue et fastidieuse et n'a pas grand intérêt en soi. Nous allons donc utiliser Mage2gen pour générer un module.

Télécharger le module généré, le copier-coller dans PhpStorm, et ne pas remplacer les fichiers existants, nous les avons déjà créés.

Le repository

Un repository est la classe qui va nous permettre d'intéragir avec l'entité modèle. En effet, le système de service contract de Magento 2 prévoit qu'un modèle ne doit pas faire d'action telle que se sauvegarder, se charger ou se supprimer. C'est donc le repository qui va nous permettre de faire cela.

En général, un repository disposera des fonctions suivantes :

  • save
  • delete
  • getById
  • getList

L'utilisation des ces fonctions est plutôt triviale, seule la fonction getList est un peu particulière avec l'utilisation d'un SearchCriteria.

Notre controller POST ajoutera donc dans sa DI l'interface du repository.

La classe Data/Entity

Toujours dans l'esprit du service contract, Mage2gen a généré la classe Model\Data\<Entity>. Cette classe est utilisée par le repository, soit en paramètre dans le cas d'une sauvegarde ou d'une suppression ou retournée dans le cas d'un chargement ou d'une sauvegarde. Elle a pour but de faire abstraction de l'entité modèle et de ne servir qu'à afficher ou à set les données.

Si nous sommes en train de manipuler le modèle, cette classe est accessible via la méthode getDataModel().

La factory

Ce n'est pas un fichier directement généré par Mage2gen mais un fichier généré automatiquement par Magento lors de la compilation de la DI. Une factory permet de créer une nouvelle instance de notre entité. Nous l'utiliserons comme ceci :

/**
 * @var \Adexos\Formation\Model\EntityFactory
 */
private $entityFactory;

public function __construct(\Adexos\Formation\Model\EntityFactory $entityFactory) 
{
    $this->entityFactory = $entityFactory;
}

public function createEntityInstance() 
{
    $entity = $this->entityFactory->create();
    [...]
}

Les limites de Mage2gen

Attention au code généré par Mage2gen, notamment au niveau des controllers d'admin. En effet, il utilise de nombreuses fonctions dépréciées telles que des save ou des load directement appelées par le modèle.

TP - Modifier notre POST pour qu'il sauvegarde les demandes de devis

TP - Afficher l'ensemble des demandes de devis sur une page

  • Créer une page avec l'URL rewrite listedesdemandes.
  • Cette page doit lister l'ensemble des demandes de devis existantes
  • (Optionnel) Ajouter la colonne is_open indiquant si une demande de devis est ouvert ou non
  • (Optionnel) La liste des devis ne doit afficher que les demandes de devis ouverts