Magento – Page de maintenance 31 décembre 2016 | Laissez un commentaire 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
Ionic 2 – Itération dans une GRID 30 décembre 2016 | Laissez un commentaire Pour le code, on a un tableau, on indique le nombre de colonne que l’on souhaite : JavaScript export class Grid { constructor() { let items = []; items.push({name: 'Thomas'}); items.push({name: 'Aymeric'}); items.push({name: 'Ludovic'}); this.populateGrid(items, 2); } populateGrid(items: [], size: number) { this.rows = []; let i = 0; let total = items.length; do { let cols = []; for (let j = 0; j < size; j++) { if ((i + j) < total) { cols.push(items[i + j]); } } this.rows.push(cols); i += size; } while(i < total); } } 1234567891011121314151617181920212223242526272829303132 export class Grid { constructor() { let items = []; items.push({name: 'Thomas'}); items.push({name: 'Aymeric'}); items.push({name: 'Ludovic'}); this.populateGrid(items, 2); } populateGrid(items: [], size: number) { this.rows = []; let i = 0; let total = items.length; do { let cols = []; for (let j = 0; j < size; j++) { if ((i + j) < total) { cols.push(items[i + j]); } } this.rows.push(cols); i += size; } while(i < total); }} Pour le HTML, il suffit d’itérer sur les lignes : XHTML <ion-grid *ngIf="rows.length > 0"> <ion-row *ngFor="let col of rows"> <ion-col width-50 *ngFor="let item of col"> {{ item.name }} </ion-col> </ion-row> </ion-grid> 1234567 <ion-grid *ngIf="rows.length > 0"> <ion-row *ngFor="let col of rows"> <ion-col width-50 *ngFor="let item of col"> {{ item.name }} </ion-col> </ion-row></ion-grid> … Read More
Ionic 2 – Mettre un bouton à droite dans le header 29 décembre 2016 | Laissez un commentaire XHTML <ion-header> <ion-navbar> <ion-title>My title</ion-title> <ion-buttons end> <button ion-button icon-only (click)="showOptions($event)"> <ion-icon name="md-more"></ion-icon> </button> </ion-buttons> </ion-navbar> </ion-header> 123456789101112 <ion-header> <ion-navbar> <ion-title>My title</ion-title> <ion-buttons end> <button ion-button icon-only (click)="showOptions($event)"> <ion-icon name="md-more"></ion-icon> </button> </ion-buttons> </ion-navbar></ion-header> … Read More
Magento – Customisation des pages d’erreur 28 décembre 2016 | Laissez un commentaire 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
npm au travers d’un proxy 19 décembre 2016 | Laissez un commentaire Shell npm config set proxy http://user:password@proxyhost:port npm config set https-proxy http://user:password@proxyhost:port 12 npm config set proxy http://user:password@proxyhost:portnpm config set https-proxy http://user:password@proxyhost:port … Read More
Magento – Admin – Ajout d’un onglet pour un produit 23 septembre 2016 | Laissez un commentaire 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) 17 février 2016 | Laissez un commentaire 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 16 février 2016 | Laissez un commentaire 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 15 février 2016 | Laissez un commentaire 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 14 février 2016 | Laissez un commentaire 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