Déclaration des models
Nous allons déclarer notre premier modèle, le modèle « Department ». Pour le moment, nous allons créer un modèle simple, sans passer par les interfaces que nous verrons dans un prochain chapitre (Services Contracts).
Nous allons lui définir :extends AbstractCollection
– Un prefixe d’evenement ($_eventPrefix)
– Un nom d’objet pour les événements ($_eventObject)
– Un nom de champ ID ($_idFieldName)
Créez le fichier
app/code/Maxime/Jobs/Model/Department.php
Notre classe contiendra donc le contenu suivant :
<?php namespace Maxime\Jobs\Model; use \Magento\Framework\Model\AbstractModel; class Department extends AbstractModel { const DEPARTMENT_ID = 'entity_id'; // We define the id fieldname /** * Prefix of model events names * * @var string */ protected $_eventPrefix = 'jobs'; // parent value is 'core_abstract' /** * Name of the event object * * @var string */ protected $_eventObject = 'department'; // parent value is 'object' /** * Name of object id field * * @var string */ protected $_idFieldName = self::DEPARTMENT_ID; // parent value is 'id' /** * Initialize resource model * * @return void */ protected function _construct() { $this->_init('Maxime\Jobs\Model\ResourceModel\Department'); } }
Remarquez que dans la fonction construct, on déclare un ResourceModel, nous allons le créer lors de l’étape suivante.
Pour le modèle « Job » nous aurons grosso-modo la même chose.
Créez le fichier
app/code/Maxime/Jobs/Model/Job.php
Avec le contenu :
<?php namespace Maxime\Jobs\Model; use \Magento\Framework\Model\AbstractModel; class Job extends AbstractModel { const JOB_ID = 'entity_id'; // We define the id fieldname /** * Prefix of model events names * * @var string */ protected $_eventPrefix = 'jobs'; /** * Name of the event object * * @var string */ protected $_eventObject = 'job'; /** * Name of object id field * * @var string */ protected $_idFieldName = self::JOB_ID; /** * Initialize resource model * * @return void */ protected function _construct() { $this->_init('Maxime\Jobs\Model\ResourceModel\Job'); } }
Déclaration des ResourceModel
Nos deux modèles sont créés, nous devons mettre en place les ResourceModel désormais.
Créez le fichier
app/code/Maxime/Jobs/Model/ResourceModel/Department.php
Et mettez-y ce contenu :
<?php namespace Maxime\Jobs\Model\ResourceModel; use \Magento\Framework\Model\ResourceModel\Db\AbstractDb; /** * Department post mysql resource */ class Department extends AbstractDb { /** * Initialize resource model * * @return void */ protected function _construct() { // Table Name and Primary Key column $this->_init('maxime_department', 'entity_id'); } }
Dans cette classe, peu d’information.
Dans le construct nous definission dans la méthode init deux infos :
– Le nom de la table
– Le nom de la colonne qui est notre colonne primaire
Faisons la même chose pour la classe Job :
app/code/Maxime/Jobs/Model/ResourceModel/Job.php
Avec :
<?php namespace Maxime\Jobs\Model\ResourceModel; use \Magento\Framework\Model\ResourceModel\Db\AbstractDb; /** * Department post mysql resource */ class Job extends AbstractDb { /** * Initialize resource model * * @return void */ protected function _construct() { // Table Name and Primary Key column $this->_init('maxime_job', 'entity_id'); } }
Même principe que pour notre classe précédente !
N’hésitez pas a consulter le contenu de la classe Magento « AbstractDb » histoire de voir de quoi elle se compose 😉
Création des classes Collection
Dernière étape avant de manipuler nos modèles, il faut leur définir une classe collection.
Cela permettra de gérer des collections de données, avec des méthodes très utiles telles que des tris, des limites etc…
On commence donc avec notre objet Department :
app/code/Maxime/Jobs/Model/ResourceModel/Department/Collection.php
Qui contient :
<?php namespace Maxime\Jobs\Model\ResourceModel\Department; use \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; class Collection extends AbstractCollection { protected $_idFieldName = \Maxime\Jobs\Model\Department::DEPARTMENT_ID; /** * Define resource model * * @return void */ protected function _construct() { $this->_init('Maxime\Jobs\Model\Department', 'Maxime\Jobs\Model\ResourceModel\Department'); } }
Vous l’aurez deviné, dans la méthode init, il y’a deux paramètres :
– Le chemin de notre Model
– Le chemin de notre ResourceModel
Et donc cela va de soi pour notre objet Job :
app/code/Maxime/Jobs/Model/ResourceModel/Job/Collection.php
Avec :
<?php namespace Maxime\Jobs\Model\ResourceModel\Job; use \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; class Collection extends AbstractCollection { protected $_idFieldName = \Maxime\Jobs\Model\Job::JOB_ID; /** * Define resource model * * @return void */ protected function _construct() { $this->_init('Maxime\Jobs\Model\Job', 'Maxime\Jobs\Model\ResourceModel\Job'); } }
Pour votre culture, jetez un oeil également à la classe Magento « AbstractCollection » histoire de voir les méthodes qu’elle contient 🙂
Ces modèles vont nous permettre de manipuler des objets de type « Job » et « Department ».
Et ce ce que nous ferons dès le prochain article !
euh… le premier eventPrefix n’est pas plutot ‘departements’ que ‘jobs’ ?
Bonjour,
J’ai le problème suivant après avoir lancer la commande php bin/magento setup:upgrade
Notice: Undefined index: maxime_department in /opt/lampp/htdocs/Proddev/vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php on line 152
Pouvez vous me dire quel est le problème svp ?
Merci !
Bonjour j’ai eu le même problème.
Le soucis venais d’une mauvaise foreign key qu’il fallait régénérer.
On peut trouver la solution sur cette page :
https://stackoverflow.com/questions/60924565/undefined-index-core-website-in-magento-2/62712384#62712384