Magento 2 & Magento 1 : les snippets du quotidien
5 novembre 2018
Nous continuons notre série de comparatifs techniques entre Magento 1 et Magento 2. Le second article de cette série s’apparente plutôt à une « cheat sheet » de « snippets » utilisés quotidiennement.
Ceci est d’abord utile aux développeurs expérimentés sur M1 qui adoptent M2 et cherchent quelques repères.
Mais la communauté des technicien•ne•s M2 grandissant, cette checklist leur servira lors d’interventions sur des sites M1 plus anciens !
Templates |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Traduire du texte |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Magento 1 | Magento 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->__('Hello world!') |
__('Hello world!') |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dans M2, la fonction de traduction __() est dans /app/functions.php |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Appeler une méthode du block |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->someMethod() |
$block->someMethod() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Pour une meilleure compréhension de la différente entre $block et $this dans M2, lire ceci. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retrouver un URL |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->getUrl('some/uri') |
$block->getUrl('some/uri') |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
La méthode pour M2 est définie dans \Magento\Framework\View\Element\AbstractBlock::getUrl . De pous, l’usage de * dans l’URi est toujours possible. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retrouver une ressource (ex : une image) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->getSkinUrl('images/some_image.jpg') |
$this->getViewFileUrl('images/some_image.jpg') |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dans M2, la racine de images/some_image.jpg est /pub/static/[AREA]/[PACKAGE]/[THEME]/[LANG] . |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Formatter en devise |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::helper('core')->currency(100) |
$this->helper('Magento\Framework\Pricing\Helper\Data')->currency(100) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Blocks, Models, Resource Models, … |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Appliquer un template |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->setTemplate('path/to/template.phtml') |
$this->setTemplate('My_Module::path/to/template.phtml') |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dans M2, la racine utilisée est le dossier view/[AREA]/templates de My_Module ; toutes surcharges faites par les thèmes prises en compte. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
L’interpolation de directives |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utiliser Mage_Core_Model_Email_Template_Filter et/ou ses classes enfant. Exemple dans Mage_Cms_Block_Block::_toHtml |
Utiliser \Magento\Framework\Filter\Template::filter et/ou ses classes enfant |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Exemple complet pour Magento 2 ici | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Savoir si la date courante du store est dans un intervalle donné |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::app()->getLocale()->isStoreDateInInterval(null, START_DATE, END_DATE) |
Utiliser \Magento\Framework\Stdlib\DateTime\Timezone::isScopeDateInInterval |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rendre une chaîne de caractères « URL friendly » |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getModel('catalog/product_url')->formatUrlKey("TEXTE À FORMATTER") |
Utiliser \Magento\Framework\Filter\FilterManager::translitUrl |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retrouver la valeur d’une configuration système |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::getStoreConfig('path/to/config') |
Utiliser \Magento\Framework\App\Config\ScopeConfigInterface::getValue |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Attention! M2 retourne la valeur du scope « global ». Pour avoir la valeur du scope « store », il faut passer \Magento\Store\Model\ScopeInterface::SCOPE_STORE à l’argument $scopeType |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Encoder / décoder le JSON |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::helper('core')->jsonEncode(DATA_TO_ENCODE) |
json_encode(DATA_TO_ENCODE) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Oui, dans M2, on préférera utiliser les fonctions natives de PHP pour le JSON | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retrouver le store courant |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::app()->getStore() |
Utiliser \Magento\Store\Model\StoreManagerInterface::getStore |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ajouter des messages à la session |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::getSingleton('some/session')->addSuccess('Some message') |
Utiliser les méthodes expposées par \Magento\Framework\Message\ManagerInterface . |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Attention! Plusieurs méthodes sont dépréciées sur M2. Utiliser en priorité : addSuccessMessage , addErrorMessage , addWarningMessage , addNoticeMessage |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Charger une instance depuis la BDD |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::getModel('some/model')->load(SOME_ID) |
Magento 2 renforce l’application du principe de « séparation des rôles » and scinde clairement l’instance d’un modèle des resources utilisées pour l’alimenter en données. Voir un exemple ici | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dans M2, il reste préférable d’utiliser les Service Contracts (API) mais l’objet de ce billet est de montrer les différences « côte-à-côte » entre M1 et M2. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retrouver un singleton |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::getSingleton('some/singleton') |
Il suffit d’injecter la classe à utiliser en tant que singleton | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dans M2, il reste préférable d’utiliser les Service Contracts (API) mais l’objet de ce billet est de montrer les différences « côte-à-côte » entre M1 et M2. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Retrouver la connection à la BDD |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->getReadConnection() depuis un resource model |
$this->getConnection() depuis un resource model |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comparé à M1, M2 interdit aux classes extérieure de choisir la connexion à utiliser. Celle-ci est désormais intimement liée à la resource. Analyser le traitement de $connectionName dans \Magento\Framework\Model\ResourceModel\Db\AbstractDb::getConnection . |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Les Helper |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mage::helper('some/helper') |
Évitons de les utiliser! Préférons la création d’un modèle que l’on injectera en tant que singleton. L’usage d’un virtual type basé sur \Magento\Framework\DataObject peut s’avérer intéressante car elle évite de coder une classe PHP tout en permettant au singleton de profiter des fonctionnalités apportées par DataObject (Varien_Object sur Magento 1). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
S’il reste nécessaire d’utiliser des helpers, utiliser l’object manager: Injecter l’object manager (\Magento\Framework\ObjectManager\ObjectManager ) et utiliser uniquement sa méthode get . Exemple: $this->objectManager->get(\My\Module\\Helper\Data::class)->setData(['key' => 'value']) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Les migrations de BDD |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Les constantes de configuration des tables MySql |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Elles sont définies dans Varien_Db_Ddl_Table |
Elles sont définies dans \Magento\Framework\DB\Ddl\Table |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Pour utilisation dans les classes de schema et data setup / upgrade | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Les migrations récurrentes |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Indisponible | Les migrations récurrentes sont des migrations lancées à chaque setup:upgrade . Il suffit de créer un fichier Setup/Recurring.php (pour les migrations de schema) ou Setup/RecurringData.php (pour les migrations de données). Exemple : \Magento\Theme\Setup\RecurringData |