Installer et Upgrader son module sous magento 2

Ce tutoriel est le 5eme d’une longue série de tutoriel magento2. Il sera mis à jour au fur et à mesure des évolutions de la plateforme. Vous allez maintenant apprendre a créer setup sql pour faire un traitement automatiquement à l'installation de votre module Magento2. Si vous ne connaissez pas magento (v1) ce n’est pas grave, je vais en parler bien sur mais il n’est pas nécessaire de connaitre la plateforme magento (v1) pour maitriser ce tutoriel sur magento2. Dans le tutoriel précédent nous avons vu comment créer un bloc sous magento2 pour notre extension ! Nous allons maintenant voir comment lancer un traitement qui rajoutes une table à notre base de donnée automatiquement à l'installation de notre module. Pour cela, on va repartir des fichiers de notre tutoriel précédent.

Quelle est la version de notre module ?

Allez dans /app/code/Pfay/Contacts/etc/module.xml et vérifier que la version de notre module magento2 est bien 0.1.0

<module name="Pfay_Contacts" setup_version="0.1.0">

Creer notre installer pour magento2

maintenant on va créer le fichier qui sera lancé lors de l'installation de notre module, sous magento il s'apelle toujours de la même maniere : InstallSchema et quand on l'apelle il exécute la fonction install. Créez donc le fichier /app/code/Pfay/Contacts/Setup/InstallSchema.php comme ceci :

<?php

namespace Pfay\Contacts\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallSchema implements InstallSchemaInterface
{
    /**
     * @param SchemaSetupInterface $setup
     * @param ModuleContextInterface $context
     * @throws \Zend_Db_Exception
     */

    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();
        /**
         * Create table 'pfay_contacts'
         */

        if (!$setup->getConnection()->isTableExists($setup->getTable('pfay_contacts'))) {
            $table = $setup->getConnection()
                ->newTable($setup->getTable('pfay_contacts'))
                ->addColumn(
                    'pfay_contacts_id',
                    \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                    null,
                    ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
                    'Contacts ID'
                )
                ->addColumn(
                    'name',
                    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    100,
                    ['nullable' => false, 'default' => 'simple'],
                    'Name'
                )
                ->addColumn(
                    'email',
                    \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    100,
                    ['nullable' => false, 'default' => 'simple'],
                    'Email'
                )
                ->setComment('Pfay Contacts Table')
                ->setOption('type', 'InnoDB')
                ->setOption('charset', 'utf8');

            $setup->getConnection()->createTable($table);
        }
        $setup->endSetup();
    }
}

dans ce setup, on crée la table en base de donnée qui va nous servir pour la suite des tutoriels. Vous remarquez la fonction getTable qui permet juste de s'assurer du formatage du nom de la table, pas besoin de déclarer 'pfay_contacts' autre part (comme sur magento1). On crée donc la table avec la fonction newTable puis on lui rajoute des colonnes avec addColumn, un commentaire avec setComment et on spécifie les options lié à la base de donnée avec setOption On enregistre ensuite la table dans la base de donnée à partir de la connection et de la fonction createTable. Comme pour magento1, un installeur commence par startSetup et fini par endSetup

activer le module, mettre à jour les tables et remettre les droits sur le cache

via les commandes suivantes :

php bin/magento module:enable Pfay_Contacts
php bin/magento setup:upgrade 
chmod 777 -R var/

On vérifies ensuite que la table a bien été crée :

mysql> show tables where Tables_in_magento2 like '%pfay%';         
+--------------------+
| Tables_in_magento2 |
+--------------------+
| pfay_contacts      |
+--------------------+
1 row in set (0.01 sec)

mysql> select * from pfay_contacts;
Empty set (0.00 sec)

mysql> describe pfay_contacts;     
+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| pfay_contacts_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name             | varchar(100)     | NO   |     | simple  |                |
| email            | varchar(100)     | NO   |     | simple  |                |
+------------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Visiblement ca a l'air plutot pas mal ;)

Upgrade d'un module magento2

Pour l'upgrade (les mises à jour apres l'installation) on va rajouter un champs commentaire (de type TEXT).
L'ugrade d'un module magento utilise toujours son fichier UpgradeSchema et exécute la méthode upgrade
on crée donc le fichier /app/code/Pfay/Contacts/Setup/UpgradeSchema.php comme ceci :
On

<?php
namespace Pfay\Contacts\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Catalog\Model\ResourceModel\Product\Gallery;
use Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter;

/**
 * Upgrade the Catalog module DB scheme
 */
class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        if (version_compare($context->getVersion(), '0.2.0', '<')) {

            $tableName = $setup->getTable('pfay_contacts');
            $setup->getConnection()->addColumn($tableName, 'comment', [
                'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                'length'    => 255,
                'unsigned' => true,
                'nullable' => false,
                'default' => '0',
                'comment' => 'Comment'
            ]);
        }
        $setup->endSetup();
    }
}

Ici on formatte encore le nom de la table avec getTable puis on ajoute avec la méthode addColumn de la connection.
On démarre également avec startSetup et on fini avec endSetup

<?php
namespace Pfay\Contacts\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Catalog\Model\ResourceModel\Product\Gallery;
use Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter;

/**
 * Upgrade the Catalog module DB scheme
 */
class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        if (version_compare($context->getVersion(), '0.2.0', '<')) {

            $tableName = $setup->getTable('pfay_contacts');
            $setup->getConnection()->addColumn($tableName, 'comment', [
                'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                'length'    => 255,
                'unsigned' => true,
                'nullable' => false,
                'default' => '0',
                'comment' => 'Comment'
            ]);
        }
        $setup->endSetup();
    }
}

Les numéros courants des versions de module magento sont définis dans la table setup_module, si vous avez déja installé votre module et que finalement vous voulez relancer l'update voici comment faire :

mysql> update setup_module set schema_version='0.1.0', data_version='0.1.0' where module like 'Pfay_Contacts';
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Effectivement...on supprime tout simplement la ligne dans la table (si on veut relancer l'installeur) ou on met à jour vers la version voulue si on veut relancer l'update.
Finalement nous, nous avons :

mysql> update setup_module set schema_version='0.1.0', data_version='0.1.0' where module like 'Pfay_Contacts';
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

on met à jour notre numéro de module :

<module name="Pfay_Contacts" setup_version="0.2.0">

et on lance l'update :

php bin/magento setup:db-schema:upgrade

et finalement :

mysql> describe pfay_contacts;                                                 
+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| pfay_contacts_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name             | varchar(100)     | NO   |     | simple  |                |
| email            | varchar(100)     | NO   |     | simple  |                |
| comment          | varchar(255)     | NO   |     | 0       |                |
+------------------+------------------+------+-----+---------+----------------+

Quelques erreurs possibles :

ma table ne se crée pas lors de l'installeur magento2 :

La solution :

mysql> delete from setup_module where module like '%Pfay_Contacts';
Query OK, 1 row affected (0.04 sec)

"Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory."

La solution :

php bin/magento setup:upgrade

"Fatal error: Uncaught RuntimeException: Can't create directory /var/www/html/magento2/var/generation/Magento/Framework/App/ResourceConnection"

La solution :

chmod 777 -R var/

"Fatal error: Uncaught Zend_Cache_Exception: cache_dir "/var/www/html/magento2/var/cache/" is not writable"

La solution :

chmod 777 -R var/

Et voilà ! c'est la fin de ce tutoriel. Cela ne fonctionne pas chez vous ? Télécharger le code en bas. Vous savez maintenant Ajouter un installer dans votre module magento2...Félicitation ! Comme d'habitude, si vous avez aimé ce tutoriel, s’il vous plait remerciez moi en 1 clic en partageant cet article sur twitter, googleplus ou facebook, ça peut paraitre inutile mais pour moi c’est très important. Merci à ceux qui le feront ;) N’hésitez pas également à poser vos questions dans les commentaires (pour ceux qui partagent l’article), j’essaierai de répondre rapidement. Bon courage à tous pour la suite de ces tutoriels sur magento2 !
Documents disponibles pour cet article :
Questions sur cette leçon
Pas de questions pour cette leçon. Soyez le premier !

Vous devez etre connecté pour demander de l'aide sur une leçon.