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
endSetupactiver 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 !