Magento – Page de maintenance Pour que le site soit en maintenance, il faut créer un fichier « maintenance.flag » à la racine du projet. Pour rendre accessible le site à certaines IP, on peut modifier le fichier index.php : PHP $ip = $_SERVER['REMOTE_ADDR']; if (file_exists($maintenanceFile) && !in_array($ip, array('192.168.2.1'))) { include_once dirname(__FILE__) . '/errors/503.php'; exit; } 123456 $ip = $_SERVER['REMOTE_ADDR']; if (file_exists($maintenanceFile) && !in_array($ip, array('192.168.2.1'))) { include_once dirname(__FILE__) . '/errors/503.php'; exit;} Les pages dans le dossiers errors peuvent être customisées. Voir cet article : Customisation des pages d’erreur… Read More
Magento – Customisation des pages d’erreur Il faut tout d’abord créer un répertoire dans le dossier errors (ex: lefetz) avec tous les fichiers que l’on peut retrouver dans le dossiers « default » (404.phtml, 503.phtml, page.phtml, report.phtml). Il faut ensuite modifier le fichier design.xml pour indiquer à Magento qu’il faut utiliser le nouveau répertoire : XHTML <config> <skin>lefetz</skin> </config> 123 <config> <skin>lefetz</skin></config> … Read More
Magento – Admin – Ajout d’un onglet pour un produit Pour créer un nouvel onglet, il suffit de créer un block et de surcharger le layout. Dans la config, on déclare que les blocks et on déclare notre layout ainsi que la localisation de nos templates : XHTML <global> <blocks> <lefetz_adminhtml> <class>Lefetz_Adminhtml_Block</class> </lefetz_adminhtml> </blocks> <adminhtml> <layout> <updates> <lefetz_adminhtml> <file>lefetz_adminhtml.xml</file> </lefetz_adminhtml> </updates> </layout> </adminhtml> <stores> <admin> <!-- default admin design package and theme --> <design> <package> <name>default</name> </package> <theme> <default>lefetz</default> </theme> </design> </admin> </stores> </global> 123456789101112131415161718192021222324252627282930 <global> <blocks> <lefetz_adminhtml> <class>Lefetz_Adminhtml_Block</class> </lefetz_adminhtml> </blocks> <adminhtml> <layout> <updates> <lefetz_adminhtml> <file>lefetz_adminhtml.xml</file> </lefetz_adminhtml> </updates> </layout> </adminhtml> <stores> <admin> <!-- default admin design package and theme --> <design> <package> <name>default</name> </package> <theme> <default>lefetz</default> </theme> </design> </admin> </stores></global> On créé un block : PHP class Lefetz_Adminhtml_Block_Catalog_Product_Tab_Test extends Mage_Adminhtml_Block_Template implements Mage_Adminhtml_Block_Widget_Tab_Interface { public function __construct() { $this->setTemplate('catalog/product/tab/test.phtml'); parent::__construct(); } public function getTabLabel() { return Mage::helper('lefetz_adminhtml')->__('Test Tab'); } public function getTabTitle() { return Mage::helper('lefetz_adminhtml')->__('Test Tab'); } public function canShowTab() { return true; } public function isHidden() { return false; } } 123456789101112131415161718192021222324 class Lefetz_Adminhtml_Block_Catalog_Product_Tab_Test extends Mage_Adminhtml_Block_Template implements Mage_Adminhtml_Block_Widget_Tab_Interface{ public function __construct() { $this->setTemplate('catalog/product/tab/test.phtml'); parent::__construct(); } public function getTabLabel() { return Mage::helper('lefetz_adminhtml')->__('Test Tab'); } public function getTabTitle() { return Mage::helper('lefetz_adminhtml')->__('Test Tab'); } public function canShowTab() { return true; } public function isHidden() { return false; }} Pour finir, on déclare notre block dans le layout : XHTML <?xml version="1.0"?> <layout> <adminhtml_catalog_product_new> <reference name="product_tabs"> <action method="addTab"> <name>Test</name> <block>lefetz_adminhtml/catalog_product_tab_test</block> </action> </reference> </adminhtml_catalog_product_new> <adminhtml_catalog_product_edit> <reference name="product_tabs"> <action method="addTab"> <name>Test</name> <block>lefetz_adminhtml/catalog_product_tab_test</block> </action> </reference> </adminhtml_catalog_product_edit> </layout> 1234567891011121314151617181920 <?xml version="1.0"?><layout> <adminhtml_catalog_product_new> <reference name="product_tabs"> <action method="addTab"> <name>Test</name> <block>lefetz_adminhtml/catalog_product_tab_test</block> </action> </reference> </adminhtml_catalog_product_new> <adminhtml_catalog_product_edit> <reference name="product_tabs"> <action method="addTab"> <name>Test</name> <block>lefetz_adminhtml/catalog_product_tab_test</block> </action> </reference> </adminhtml_catalog_product_edit></layout> … Read More
Magento – Ajouter des liens au fil d’ariane (breadcrumb) Pour ajouter des liens, il faut soit passer par le layout, soit par le contrôleur : XHTML <reference name="breadcrumbs"> <action method="addCrumb" translate="crumbInfo.label crumbInfo.title"> <crumbname>Home</crumbname> <crumbinfo> <label>Home</label> <title>Home</title> <link>catalog/category/all</link> </crumbinfo> </action> </reference> 12345678910 <reference name="breadcrumbs"> <action method="addCrumb" translate="crumbInfo.label crumbInfo.title"> <crumbname>Home</crumbname> <crumbinfo> <label>Home</label> <title>Home</title> <link>catalog/category/all</link> </crumbinfo> </action> </reference> Ou PHP if ($crumbs = Mage::app()->getLayout()->getBlock('breadcrumbs')) { $crumbs->addCrumb('Home', array( 'label' => Mage::helper('page')->__('Home'), 'title' => Mage::helper('page')->__('Home'), 'link' => Mage::getUrl('catalog/category/all') )); } 1234567 if ($crumbs = Mage::app()->getLayout()->getBlock('breadcrumbs')) { $crumbs->addCrumb('Home', array( 'label' => Mage::helper('page')->__('Home'), 'title' => Mage::helper('page')->__('Home'), 'link' => Mage::getUrl('catalog/category/all') ));} … Read More
Magento – Bypass le tunnel de vente Pour bypass le tunnel de vente, il faut mettre à jour le contrôleur « OnepageController », la méthode « indexAction ». Voici un exemple qui fonctionne dans mon cas parce que je n’utilise pas les adresses de livraison/facturation : PHP public function indexAction() { $checkout = $this->getOnepage(); $data = $this->getRequest()->getParams(); try { $checkout->initCheckout(); //Le type de checkout est utilisateur+connecté $checkout->saveCheckoutMethod(Mage_Checkout_Model_Type_Onepage::METHOD_CUSTOMER); //on set la methode de payment qui correspond le mieux pour la situation (paiement différé) $checkout->savePayment(array('method'=>'checkmo')); $checkout->saveOrder(); $checkout->getQuote()->save(); //on redirige vers le récap de commande $this->_redirect("*/*/success"); } catch (Exception $e) { //si erreur, on stoque le emssage dans la session pour affichage sur le front Mage::getSingleton("checkout/session")->addError($e->getMessage()); //on redirige vers le panier $this->_redirect("checkout/cart"); } } } 1234567891011121314151617181920212223242526 public function indexAction() { $checkout = $this->getOnepage(); $data = $this->getRequest()->getParams(); try { $checkout->initCheckout(); //Le type de checkout est utilisateur+connecté $checkout->saveCheckoutMethod(Mage_Checkout_Model_Type_Onepage::METHOD_CUSTOMER); //on set la methode de payment qui correspond le mieux pour la situation (paiement différé) $checkout->savePayment(array('method'=>'checkmo')); $checkout->saveOrder(); $checkout->getQuote()->save(); //on redirige vers le récap de commande $this->_redirect("*/*/success"); } catch (Exception $e) { //si erreur, on stoque le emssage dans la session pour affichage sur le front Mage::getSingleton("checkout/session")->addError($e->getMessage()); //on redirige vers le panier $this->_redirect("checkout/cart"); } }} Le « checkmo » correspond au paiement par chèque, il n’y a donc pas d’impacte de paiement.… Read More
Magento – Design sur la page confirmation de commande Pour rester sur la page de confirmation de commande lorsque l’on rafraîchit, il faut empêcher la suppression de la session. On retrouve la ligne dans la méthod « successAction » du contrôleur « OnepageController » ligne 296 : PHP public function successAction() { $session = $this->getOnepage()->getCheckout(); if (!$session->getLastSuccessQuoteId()) { $this->_redirect('checkout/cart'); return; } $lastQuoteId = $session->getLastQuoteId(); $lastOrderId = $session->getLastOrderId(); $lastRecurringProfiles = $session->getLastRecurringProfileIds(); if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) { $this->_redirect('checkout/cart'); return; } $session->clear(); $this->loadLayout(); $this->_initLayoutMessages('checkout/session'); Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId))); $this->renderLayout(); } 275276277278279280281282283284285286287288289290291292293294295296 public function successAction() { $session = $this->getOnepage()->getCheckout(); if (!$session->getLastSuccessQuoteId()) { $this->_redirect('checkout/cart'); return; } $lastQuoteId = $session->getLastQuoteId(); $lastOrderId = $session->getLastOrderId(); $lastRecurringProfiles = $session->getLastRecurringProfileIds(); if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) { $this->_redirect('checkout/cart'); return; } $session->clear(); $this->loadLayout(); $this->_initLayoutMessages('checkout/session'); Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId))); $this->renderLayout(); } Il faut donc mettre temporairement en commentaire la ligne 296 pour garder les informations de la commande et pouvoir faire… Read More
Magento – créer des scripts shell Création de la classe Il faut créer la classe dans le répertoire Shell : PHP require_once 'abstract.php'; class Mage_Shell_Importer extends Mage_Shell_Abstract { public function __construct() { parent::__construct(); } /** * Run script * */ public function run () { if ($this->getArg('type')) { $type = $this->getArg('type'); $debug = $this->getArg('debug'); Mage::getModel("lefetz_init/importer")->importData($type, $debug); } else { echo "Import type is missing\n\n"; echo $this->usageHelp(); } } /** * Retrieve Usage Help Message * */ public function usageHelp () { return <<<USAGE Usage: php -f importer.php -- [options] --type <products> Import type --debug <0|1> Show verbose USAGE; } } $shell = new Mage_Shell_Importer(); $shell->run(); 123456789101112131415161718192021222324252627282930313233343536373839404142434445 require_once 'abstract.php'; class Mage_Shell_Importer extends Mage_Shell_Abstract{ public function __construct() { parent::__construct(); } /** * Run script * */ public function run () { if ($this->getArg('type')) { $type = $this->getArg('type'); $debug = $this->getArg('debug'); Mage::getModel("lefetz_init/importer")->importData($type, $debug); } else { echo "Import type is missing\n\n"; echo $this->usageHelp(); } } /** * Retrieve Usage Help Message * */ public function usageHelp () { return <<<USAGEUsage: php -f importer.php -- [options] --type <products> Import type --debug <0|1> Show verbose USAGE; }} $shell = new Mage_Shell_Importer();$shell->run(); On peut ensuite créer un model qui fera les actions selon le type d’import demandé : PHP class Lefetz_Init_Model_Importer extends Mage_Core_Model_Abstract { public function importData($type, $debug) { switch($type) { case 'products' : Mage::getModel('lefetz_catalog/importer')->loadProducts(); break; } } } 1234567891011 class Lefetz_Init_Model_Importer extends Mage_Core_Model_Abstract{ public function importData($type, $debug) { switch($type) { case 'products' : Mage::getModel('lefetz_catalog/importer')->loadProducts(); break; } }} … Read More
Magento – Surcharge ou création d’un block Surchage d’un block PHP class Lefetz_Catalog_Block_Product_View extends Mage_Catalog_Block_Product_View { } 1234 class Lefetz_Catalog_Block_Product_View extends Mage_Catalog_Block_Product_View{ } Déclaration de la surcharge dans le config.xml XHTML <blocks> <catalog> <rewrite> <product_view>Lefetz_Catalog_Block_Product_View</product_view> </rewrite> </catalog> </blocks> 1234567 <blocks> <catalog> <rewrite> <product_view>Lefetz_Catalog_Block_Product_View</product_view> </rewrite> </catalog> </blocks> Création d’un block PHP class Lefetz_Customer_Block_Message extends Mage_Core_Block_Template { } 1234 class Lefetz_Customer_Block_Message extends Mage_Core_Block_Template{ } Déclaration des blocks du module dans le fichier config.xml XHTML <blocks> <lefetz_catalog> <class>Lefetz_Catalog_Block</class> </lefetz_catalog> </blocks> 12345 <blocks> <lefetz_catalog> <class>Lefetz_Catalog_Block</class> </lefetz_catalog> </blocks> … Read More
Magento – Url et Chemin d’accès aux répertoires URL pour accéder aux contenu des répertoires Magento : PHP /* Dans n'importe quel fichier PHP Magento */ echo $this->helper('core/url')->getCurrentUrl(); // => L'URL courante echo Mage::helper('core/url')->getHomeUrl(); // => La page d'accueil echo Mage::getBaseUrl (Mage_Core_Model_Store::URL_TYPE_MEDIA); echo Mage::getBaseUrl('media'); // => http://www.monsite.fr/media echo Mage::getBaseUrl (Mage_Core_Model_Store::URL_TYPE_JS); echo Mage::getBaseUrl('js'); // => http://www.monsite.fr/js echo Mage::getBaseUrl('web'); echo Mage::getBaseUrl(Mage_Core_Model_Store:: URL_TYPE_WEB) // http://www.monsite.fr/ echo Mage::getBaseUrl (Mage_Core_Model_Store::URL_TYPE_SKIN); // => http://www.monsite.fr/frontend/package/theme /* dans un block core/template */ echo $this->getBaseUrl() // http://www.monsite.fr/ echo $this->getSkinUrl($this->getImgSrc()) // http://www.monsite.fr/frontend/package/theme/images/ 12345678910111213141516171819202122232425262728293031 /* Dans n'importe quel fichier PHP Magento */ echo $this->helper('core/url')->getCurrentUrl();// => L'URL courante echo Mage::helper('core/url')->getHomeUrl();// => La page d'accueil echo Mage::getBaseUrl (Mage_Core_Model_Store::URL_TYPE_MEDIA);echo Mage::getBaseUrl('media'); // => http://www.monsite.fr/media echo Mage::getBaseUrl (Mage_Core_Model_Store::URL_TYPE_JS); echo Mage::getBaseUrl('js'); // => http://www.monsite.fr/js echo Mage::getBaseUrl('web'); echo Mage::getBaseUrl(Mage_Core_Model_Store:: URL_TYPE_WEB) // http://www.monsite.fr/ echo Mage::getBaseUrl (Mage_Core_Model_Store::URL_TYPE_SKIN); // => http://www.monsite.fr/frontend/package/theme /* dans un block core/template */ echo $this->getBaseUrl() // http://www.monsite.fr/ echo $this->getSkinUrl($this->getImgSrc()) // http://www.monsite.fr/frontend/package/theme/images/ Dans un block CMS : XHTML <img src="{{skin url='images/machin.png}}"/> <!-- Récupération d'une page CMS --> <a href="{{store url='identifiant'}}"></a> <a href="{{store url='customer/account'}}">Accueil client</a> 12345 <img src="{{skin url='images/machin.png}}"/> <!-- Récupération d'une page CMS --><a href="{{store url='identifiant'}}"></a><a href="{{store url='customer/account'}}">Accueil client</a> Chemin d’accès PHP echo Mage::getBaseDir('design'); // => Get design directory path echo Mage::getBaseDir('code'); // => Gives code directory file path echo Mage::getBaseDir('lib'); // => Gives lib directory file path echo Mage::getBaseDir('skin'); // => Dossier skin echo Mage::getBaseDir('var'); // => Dossier var echo Mage::getBaseDir('cache'); // => Dossier cache echo Mage::getBaseDir('log'); // => Dossier log 1234567891011121314151617181920 echo Mage::getBaseDir('design'); // => Get design directory path echo Mage::getBaseDir('code'); // => Gives code directory file path echo Mage::getBaseDir('lib'); // => Gives lib directory file path echo Mage::getBaseDir('skin'); // => Dossier skin echo Mage::getBaseDir('var'); // => Dossier var echo Mage::getBaseDir('cache'); // => Dossier cache echo Mage::getBaseDir('log'); // => Dossier log … Read More
Magento – surcharge ou création d’un contrôleur Surcharger un contrôleur Par exemple, je souhaite avoir une page avec toutes les catégories : PHP require_once Mage::getModuleDir('controllers', 'Mage_Catalog').DS.'CategoryController.php'; class Lefetz_Catalog_CategoryController extends Mage_Catalog_CategoryController { public function allAction() { $this->loadLayout(); $this->renderLayout(); } } 12345678910 require_once Mage::getModuleDir('controllers', 'Mage_Catalog').DS.'CategoryController.php'; class Lefetz_Catalog_CategoryController extends Mage_Catalog_CategoryController{ public function allAction() { $this->loadLayout(); $this->renderLayout(); }} La première ligne correspond au chemin du contrôleur de Magento, il faut le spécifier, car Magento ne fait pas la réécriture comme les autres (Blocks, Helpers, …). Ensuite, je déclare la classe de mon contrôleur héritant de celle de Magento.… Read More