Prestashop : Ajouter des champs dans un formulaire d’administration

Depuis la version 1.6 de Prestashop, il est possible de rajouter rapidement et facilement le formulaire d’édition d’un objet dans l’administration via un module personnalisé.
Et ceci sans surcharge particulière en utilisant tout simplement les hooks existants.

Les objets éditables via cette méthodes sont notamment les suivants :

  • Catégories Produits
  • Adresses clients
  • Clients
  • … ( Presque tous les éléments admin sauf les produits sous Prestashop 1.7 )

Cette modification est réalisable via les hooks dynamiques suivants :

Dans la fonction renderForm de la classe AdminController

Hook::exec('action'.$this->controller_name.'FormModifier')

Dans la fonction postProcess de la classe AdminController via aux choix les hooks suivants :

//Avant l'exécution de l'action du controller admin
Hook::exec('actionAdmin'.ucfirst($this->action).'Before', array('controller' => $this));
Hook::exec('action'.get_class($this).ucfirst($this->action).'Before', array('controller' => $this));
 
 //Après l'exécution de l'action du controller admin
 Hook::exec('actionAdmin'.ucfirst($this->action).'After', array('controller' => $this, 'return' => $return));
 Hook::exec('action'.get_class($this).ucfirst($this->action).'After', array('controller' => $this, 'return' => $return));

Vu comme ça les hooks paraissent un peu barbares mais il n’en est rien :-), ce sera beaucoup plus parlant avec un exemple.

Exemple

Pour illustrer comment réaliser cela nous allons modifier le formulaire d’édition d’une catégorie produit.
Nous souhaitons rajouter plusieurs paramètres personnalisés puis les sauvegarder ensuite.

Le controller admin concerné pour les catégorie est AdminCategories.
Les hooks à implémenter seront donc les suivants :

  • actionAdminCategoriesFormModifier ($this->controller_name = AdminCategories  => Modification du formulaire )
  • actionAdminCategoriesControllerSaveBefore ( get_class($this) = AdminCategoriesController // $this->action = Save  => Exécutée avant l’action « Save du controller » )
  • actionAdminCategoriesControllerSaveAfter ( get_class($this) = AdminCategoriesController // $this->action = Save  => Exécutée avant l’action « Save du controller » )

Nous pourrions également utiliser les hooks généraux

  • actionAdminSaveBefore
  • actionAdminSaveAfter

Cependant je ne le recommande pas dans ce cas, car il sont exécutés lors des enregistrements de l’ensemble des entités en back office.
Dans notre cas il vaut mieux cibler plus précisément l’action.

Mise en oeuvre

Pour mettre en oeuvre ces concepts, nous allons créer un module Hh_SampleAdminForm

Voici la base ( déclaration / installation / désinstallation )

public function __construct()
    {
        $this->name = 'hh_sampleadminform';
        $this->tab = 'others';
        $this->version = '0.1.0';
        $this->author = 'hhennes';
        $this->bootstrap = true;
        parent::__construct();
 
        $this->displayName = $this->l('Sample Admin form');
        $this->description = $this->l('Sample module for admin form hooks');
        $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
    }
 
    /**
     * Installation du module
     * @return bool
     */
    public function install()
    {
        if ( ! parent::install()
            || !$this->registerHook('actionAdminCategoriesControllerSaveAfter')
            || !$this->registerHook('actionAdminCategoriesFormModifier')
        ) {
            return false;
        }
 
        return true;
    }
 
    /**
     * Désinstallation du module
     * @return bool
     */
    public function uninstall()
    {
        return parent::uninstall();
    }

Affichage des nouveaux champs

Passons ensuite à l’affichage de nos nouveaux paramètres.
Il existe plusieurs possibilités :

  • Ajouter au formulaire existant
  • Créer un nouveau fieldset

Les codes reprennent l’utilisation d’un helperForm Standard.
Les paramètres passés à la fonction étant les suivants :

Hook::exec('action'.$this->controller_name.'FormModifier', array(
                'fields' => &$this->fields_form,
                'fields_value' => &$fields_value,
                'form_vars' => &$this->tpl_form_vars,
            ));

Attention au fait que les variables sont passées par référence ( signe & ) ce qui signifie qu’on peut les modifier directement dans le hook.

public function hookActionAdminCategoriesFormModifier($params)
    {
 
        //Ajout d'un champ au fieldset par défaut
        $params['fields'][0]['form']['input'][] =  array(
                        'type' => 'text',
                        'label' => $this->l('Custom field 1'),
                        'name' => $this->name.'_newfield1',
                    );
 
        //Création d'un nouveau fieldset
        $params['fields'][$this->name] = array(
            'form' => array(
                'legend' => array(
                    'title' => $this->l('Sample Category Fieldset'),
                    'icon' => 'icon-tags',
                ),
                'description' => $this->l('New sample fieldset'),
                'input' => array(
                    array(
                        'type' => 'text',
                        'label' => $this->l('Custom field New Fieldset 1'),
                        'name' => $this->name.'_newfieldset1',
                    ),
                    array(
                        'type' => 'text',
                        'label' => $this->l('Custom field New Fieldset 2'),
                        'name' => $this->name.'_newfieldset2',
                    ),
                )
            )
        );
 
        //Pour remonter les valeurs des champs
        $params['fields_value'][$this->name.'_newfield1'] = 'Custom value 1';
        $params['fields_value'][$this->name.'_newfieldset1'] = 'Custom value fieldset 1';
        $params['fields_value'][$this->name.'_newfieldset2'] = 'Custom value fieldset 2';
    }

Le rendu est le suivant :

Nouveaux champs admin prestashop

Enregistrement des données

Il est temps à présent de passer à l’enregistrement des données.
Les hooks actionAdminCategoriesControllerSaveAfter et actionAdminCategoriesControllerSaveBefore étant redondants pour notre example je n’utiliserais que l’After
Pour le traitement des données nous n’auront qu’a récupérer les variables posts envoyées par le formulaire

 public function hookActionAdminCategoriesControllerSaveAfter($params)
    {
        //Récupération des variables custom soumises via le formulaire
        $custom1 = Tools::getValue($this->name.'_newfield1');
        $fiedlset1 = Tools::getValue($this->name.'_newfieldset1');
        $fiedlset2 = Tools::getValue($this->name.'_newfieldset2');
 
        //Faites ensuite le traitement souhaité
    }

Et voila nous avons rajouté facilement des informations à un formulaire admin sans faire de surcharge de classe 😉

 

Pas de commentaires

Fichier .gitignore pour site prestashop de production

Une petite ressource rapide, voici un fichier .gitignore optimisé pour gérer votre site Prestashop ( < 1.7 ) en mode projet

.idea/
/admin-dev/autoupgrade/backup
/admin-dev/backups
/admin-dev/export
/cache/
!/cache/index.php
!/cache/*/index.php
/config/xml/
!/config/xml/index.php
!/config/xml/.htaccess
!/config/xml/themes/index.php
/download
!/download/index.php
!/download/.htaccess
/img/
!/img/index.php
!/img/admin
!/img/jquery-ui
!/img/*/index.php
!/img/*/.htaccess
/log
!/log/index.php
!/log/.htaccess
/modules/*/config*.xml
/themes/*/cache
!/themes/*/cache/index.php
/tools/tcpdf/cache
!/tools/tcpdf/cache/index.php
/upload
!/upload/.htaccess

Il exclus les fichiers des dossiers liés aux contenus du site, mais conserve les fichiers index.php pour que les dossiers soient tout de même bien présent dans le dépot 🙂
Il faut également remplacer « admin-dev » par le chemin de votre admin
N’hésitez pas à soumettre vos optimisations.

Pas de commentaires

Prestashop 1.7 : Les widgets

La version 1.7 apporte une nouveauté intéressante dans le développement des modules : les widgets

Le principe est relativement simple et pratique, vous pouvez à n’importe quel endroit dans un template afficher le contenu de votre module via le code suivant.
Les exemples ci-dessous sont basé sur le module hh_samplemodule ( sur la branche 17 disponible sur github )

{widget name="hh_samplemodule"}

Vous pouvez également passer n’importe quel paramètre et le récupérer dans votre code

{widget name="hh_samplemodule" hook="top" var1="test" var2="test2" allvars="test"}

Comment l’implémenter dans votre module :

C’est très simple il suffit d’implémenter l’interface WidgetInterface via le code suivant :

class Hh_Samplemodule extends Module implements WidgetInterface

Puis de définir les fonctions renderWiget et getWidgetVariables via le code suivant par exemple

 /**
     * Affichage du widget
     * @param type $hookName
     * @param array $configuration : Ensemble des variables du widget
     * @return array
     */
    public function renderWidget($hookName = null, array $configuration = []) {
        //En fonction des variables du widget 
        //vous pouvez mettre en place des conditions d'affichage
        $this->smarty->assign($this->getWidgetVariables($hookName, $configuration));
        return $this->display(__FILE__, 'views/templates/widget/sample.tpl');
 
    }
 
    /**
     * Récupération des variables du widget
     * @param type $hookName
     * @param array $configuration
     * @return array
     */
    public function getWidgetVariables($hookName = null , array $configuration = [] ){
 
        return  [
            'test' => 'test_var',
            'test2'=> 'test_var2'
            ];
 
    }
Pas de commentaires

Magento : Configurer plusieurs boutiques sur une seule instance

Nativement la plateforme Magento permets de créer plusieurs sites webs totalement différents tout en utilisant le même code et le même dossier sur votre serveur et cela avec des urls différentes !

Il est cependant ensuite nécessaire de réaliser un mapping pour que Magento trouve quelle boutique charger avec quelle url

En partant des pré-requis suivants :

  • votre configuration apache ou nginx est déjà en place et que l’ensemble des noms de domaines pointent bien vers le même dossier
  • Nous allons tester 3 sites
    • www.shop.fr ( Site FR / Code du magasin magento : fr )
    • www.shop.de ( Site DE / Code du magasin magento : de )
    • www.shop.com ( Site EN / Code du magasin magento : en )
  • Les configurations des magasins sont en place dans magento

Nous allons voir ensemble les différentes possibilités qui existent pour réaliser cela.

Serveur Apache : fichier .htacess
Editer le fichier .htacess situé à la racine de magento et rajouter les lignes suivantes

SetEnv MAGE_RUN_TYPE store
SetEnvIf Host www\.shop\.fr MAGE_RUN_CODE=fr
SetEnvIf Host www\.shop\.de MAGE_RUN_CODE=de
SetEnvIf Host www\.shop\.com MAGE_RUN_CODE=en

Serveur nginx : fichier conf
Dans le fichier de configuration de votre vhost avant le noeud « server » rajouter la map suivante :

map $http_host $magecode {
       www.shop.fr fr;
       www.shop.de de;
       www.shop.com en;
    }

Puis dans la configuration des fichiers php , rajouter les éléments suivants :

location ~ \.php$ { ## Execute PHP scripts
        ...
        fastcgi_param  MAGE_RUN_CODE $magecode;
        fastcgi_param  MAGE_RUN_TYPE store;
        ..
    }

Toutes plateformes : fichier index.php
Avant l’appel du code

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';
 
/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Ajouter les lignes suivantes :

$mageRunType = 'store';
switch($_SERVER['HTTP_HOST']) {
    case 'www.shop.fr':
        $mageRunCode = 'fr';
    break;
    case 'www.shop.de':
        $mageRunCode = 'de';
    break;
    case 'www.shop.com':
        $mageRunCode = 'en';
    break;
 
}

 

A vous de choisir parmi ces solutions celle qui correspond le mieux à vos besoins ou à vos accès sur l’hébergement 😉

Pas de commentaires

Détecter vos contenus mixtes avec les CSP

Je continue ma série d’articles sur le https avec une problématique assez chronophage qui est la détection des contenus mixtes sur une page https.
Avec les nouvelles sécurité des navigateurs si une image , une feuille de style ou un fichier javascript n’est pas appellé en https il ne sera pas interprété.

Et donc votre site ne sera pas affiché correctement.
La tâche d’identification de ces contenus est relativement longue et implique de passer sur toutes les pages de votre site si vous souhaitez le faire manuellement.
La bonne nouvelle est que ce n’est pas nécessaire 🙂

Avec les headers Content Security Policy ( CSP ) il est possible de détecter automatiquement les éléments bloquants.
Mon exemple est relativement basique, pour des informations complètes sur les CSP vous pouvez consulter le site suivant : https://content-security-policy.com/

Comme le nom ( header ) le défini, nous allons ajouter l’entête spécifique à notre document.

Content-Security-Policy-Report-Only "default-src https://your-site.com https: 'unsafe-inline';report-uri https://your-site.com/csp-https-report.php"

Celle-ci signifie que nous souhaitons avoir un rapport d’erreur sur l’url https://your-site.com/csp-https-report.php, dès qu’un média ( js/image/font/css ) n’est pas appelé en https

Cette entête peut être rajoutée de différente manière

Apache : dans le fichier htaccess

 Header set Content-Security-Policy-Report-Only "default-src https://your-site.com https: 'unsafe-inline';report-uri https://your-site.com/csp-https-report.php"

Nginx : dans votre fichier de conf

 add_header Content-Security-Policy-Report-Only "default-src https://your-site.com https: 'unsafe-inline';report-uri https://your-site.com/csp-https-report.php";

Directement dans votre document php

 header('Content-Security-Policy-Report-Only "default-src https://your-site.com https: 'unsafe-inline';report-uri https://your-site.com/csp-https-report.php";');

Voici à présent le contenu du fichier php qui va traiter ces retours.
Il ajoute tout simplement les erreurs dans un fichier de log, qui vous permettra de corriger les erreurs.

 <?php
$data = file_get_contents('php://input');
if ($data = json_decode($data, true)) {
   //On mets les résultats dans un fichiers de log
   $fp = fopen('https-errors.log','a+');
   fputs($fp,date("Y-m-d H:i:s").' Erreur https '.$data['csp-report']['blocked-uri'].' - source '.$data['csp-report']['document-uri']."\n");
   fclose($fp);
}
?>

En consultant ce fichier de log, vous pourrez donc identifier facilement les éléments qui posent problème ! 🙂

Pas de commentaires

Prestashop : Passer au déploiement continu

Vous mettez encore à jour vos sites via Ftp ? Vous perdez du temps à déployer votre code lors de chaque livraison de nouvelle fonctionnalité ?
Il est temps d’optimiser cela et de passer au déploiement continu !

Pour l’exemple nous allons voir comment mettre en place du déploiement continu sur un site prestashop de base ( version 1.6.1.x ).
L’exemple est assez basique, mais peut servir de base pour des stratégies de déploiement plus complexes.

Les prérequis étant les suivants :

  • site hébergé sur un hébergement avec accès SSH

Pour mettre en place ce processus nous allons utiliser les outils suivants :

  • git
  • gilab

Les étapes à réaliser seront les suivantes :

 1/ Création du projet sur gitlab

Pour commencer il faut s’inscrire sur gitlab.com.
Vous pouvez ensuite créer votre projet en mode public ou privé selon vos besoins.
Je ne détaille pas le processus de création qui est relativement aisé, nous reviendrons plus tard sur les configurations spécifiques.
Il est également possible d’héberger sa propre plateforme gitlab, mais ce n’est pas l’objet de cet article.

 2/ Installation de Prestashop en local

Notre site de développement local étant configuré, il est est temps de versionner le projet avec git.
Pour cela vous pouvez exécuter la commande suivante dans le dossier d’installation.

git init .

Pour éviter de versionner les fichiers non nécessaires, vous pouvez ensuite mettre en place le fichier .gitignore suivant :

 # Editors, tools and OS's
 
.buildpath
.project
.settings
.idea
.svn
.DS_Store
.sass-cache
config.codekit
*.sublime-project
*.sublime-workspace
nbproject
bower_components
composer.lock
 
# Cache, temp and personal files
 
cache/*
!cache/index.php
!cache/*/index.php
download/*
!download/index.php
!download/.htaccess
img/*
!img/admin/*
!img/admin/jquery-ui/*
!img/index.php
!img/*/index.php
log/*
!log/index.php
upload/*
!upload/index.php
!upload/.htaccess
admin-dev/autoupgrade/*
admin-dev/backups/*
admin-dev/import/*
 
themes/*/cache/*
admin-dev/themes/*/cache/*
 
# Config
 
config/settings.inc.php
config/settings.old.php
config/xml/*
!config/xml/themes/default.xml
 
# Themes, modules and overrides
admin-dev/themes/default/sass/ie.sass
admin-dev/themes/default/sass/print.sass
admin-dev/themes/default/screen.sass
admin-dev/themes/default/css/ie.css
admin-dev/themes/default/css/print.css
admin-dev/themes/default/css/screen.css
 
# Translations and emails templates
 
translations/*
!translations/index.php
!translations/fr/
mails/*
!mails/fr/
themes/default-bootstrap/lang/*
themes/default-bootstrap/modules/*/translations/*.php
themes/default-bootstrap/mails/*
!themes/default-bootstrap/mails/en/
themes/default-bootstrap/modules/*/mails/*
!themes/default-bootstrap/modules/*/mails/en
 
# MISC
 
*sitemap.xml
robots.txt

Puis ajouter l’ensemble des fichiers au dépôt

git add .
git commit -m "Creation du projet"

Votre versionning local est maintenant en place, vous pouvez déjà développer et historiser vos modifications.

Pour finaliser la configuration de git nous allons ajouter notre dépôt gitlab en dépôt distant

 git remote add origin https://youruser@gitlab.com/youruser/your-project.git

( Note : vous pouvez ajouter l’url en https ou en ssh selon vos préférences )

Poussez vos modifications sur le dépôt distant avant de passer à l’étape suivante :

 git push origin master

 

 3/ Installation initiale de prestashop distant

 

Après avoir créés le vhost et la base de données nécessaire à l’installation du projet.
– Rendez-vous dans le dossier ou vous souhaitez installer le projet et clonez le depuis gitlab

git clone https://youruser@gitlab.com/youruser/your-project.git

– Importer votre base de données sur le serveur en changeant bien les urls dans la table ps_shop_url
– Récupérer votre fichier local config/settings.inc.php et modifier le avec les informations du serveur

Votre serveur de prod est à présent installé, votre projet et gité.
Il est déjà possible de procéder à des mises à jour assez facilement manuellement, via des git push et des git pull sur les différents environnements.
C’est déjà bien mais cela nécessite encore de se connecter en ssh au serveur pour puller les changements.
Avec gitlab il est possible de faire tout ça de manière automatique 🙂

 

 4/ Configuration gitlab et serveur

 

– Mise en place d’une deploy key

Pour commencer il faut pouvoir puller les mises à jour du serveur sans avoir de mot de passe à saisir.
C’est possible avec gitlab avec le principe des deploys-keys qui se base sur une authentification ssh.

Pour commencer il faut donc générer une clé ssh (sans passphrase ) sur votre serveur
Via la commande suivante :

 ssh-keygen -t rsa -b 4096 -C "cle gitlab"

Laissez ensuite les options par défaut, et n’entrez pas de passphrase.
Récupérer le contenu de votre clé publique via la commande

cat ~/.ssh/id_rsa.pub

Dans gitlab rendez-vous dans « Settings / Repository »

Gitlab deploy key

Donner un titre à votre clé, puis copier la clé publique.
Vous pouvez ensuite à votre choix autoriser ou non l’accès en écriture au dépot.

Une fois votre clé ajoutée au dépot, vous pouvez changer l’url du remote pour prendre l’accès SSH

git remote set-url origin git@gitlab.com:youruser/your-project.git

Puis à tester un git pull pour vérifier que tout fonctionne sans saisie de mot de passe.
Ceci devrait donner un résultat comme cela

Gitlab ssh key

– Création des variables du projet

Il est temps à présent de configurer les variables nécessaires au déploiement continu de votre projet.
Pour cela rendez-vous dans « Settings » puis CI/CD Pipelines » , puis dans la partie « Secret Variables »

Nous allons définir les variables suivantes ( à adapter avec vos accès ) :

SSH_HOST : (hôte de connexion ssh ) ex: [email protected]
PROJECT_PATH : ( chemin du projet sur le serveur ) ex: /var/www/mywebsite/

SSH_KEY : ( clé ssh ) :
Pour cette variable c’est un peu particulier, il va falloir autoriser le runner de déploiement à se connecter à votre serveur via ssh pour lancer les commandes de mise à jour.
Il est donc nécessaire de créer une clé ssh ( sans passphrase ) permettant l’accès à votre serveur, et de coller la clé privée dans ce champ.

Il est possible d’utiliser des runners privés, mais dans notre cas nous utiliserons les runners accessibles à l’ensemble des projets gitlab.

La configuration est à présent terminée, il est temps de voir le plus intéressant, le fichier gitlab-ci 😉

 

 5/ Création du fichier .gitlab-ci.yml

 

Le fichier .gitlab-ci.yml est l’élément le plus important de votre déploiement continu, c’est lui qui va contenir les instructions de déploiement.
Je ne vais pas vous détailler tout son fonctionnement, ce serait trop long et la documentation officielle le fait très bien : https://docs.gitlab.com/ce/ci/yaml/README.html

Ce fichier doit être créé à la racine de votre projet, et vous pouvez y mettre le contenu suivant :

stages:
    - deploy
 
before_script:
 - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
 - eval $(ssh-agent -s)
 - mkdir -p ~/.ssh
 - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
 - ssh-add <(echo "$SSH_KEY")
 
 
deploy:production:
    stage: deploy
    only:
        - master
    tags:
        - gitlab-org
    script:
        - ssh $SSH_HOST -C " cd $PROJECT_PATH && git pull "

Voici bloc par bloc les explications de ce fichier

stages:
    - deploy

Définitions des étapes du déploiement continu, dans notre cas une seule étape : le déploiement.

before_script:
 - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
 - eval $(ssh-agent -s)
 - mkdir -p ~/.ssh
 - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
 - ssh-add <(echo "$SSH_KEY")

Code exécuté avant notre script, il vérifie si ssh est installé sur le runner,
puis insère notre clé privée issue de nos variables de configuration

deploy:production:
    stage: deploy
    only:
        - master
    tags:
        - gitlab-org
    script:
        - ssh $SSH_HOST -C " cd $PROJECT_PATH && git pull "

Définition de notre job de déploiement :
lors de l’étape deploy, uniquement dans la branche master.
Le runnder gitlab-org est appellé et se connecte à notre serveur pour faire un git pull dans le dossier du projet.

Commitez ce fichier et pousser le sur le dépôt gitlab.
Votre premier déploiement continu devrait fonctionner 🙂

Vous pouvez voir les résultats du déploiement dans l’onglet « Pipelines » de votre projet.

Pipeline gitlab

Si tout est vert, c’est que tout à bien fonctionné.
Sinon il faut cliquer sur le détails du pipeline pour voir les messages d’erreurs et rejouer le déploiement 😉

Pas de commentaires

Prestashop 1.7 : Correction bug traduction dans controller admin d’un module

La dernière version de Prestashop 1.7 apporte de nombreux changements ( j’ y reviendrais sans doute plus longuement dans un article à venir ), et notamment dans la gestion des traductions dans l’administration.

Celle-ci se base à présent sur Symfony, tout en gardant quand même une rétrocompatibilité (théorique ) avec l’ancien système.
Les dernières recommandations ( à date ) de l’équipe Prestashop étaient de conserver l’ancien système de traduction pour les modules.

Dans le cadre de l’adaptation de l’un de mes module j’ai cependant fait face à la problématique suivante , impossible d’accéder à mon controller Admin, et affichage de la belle page d’erreur suivante :

Erreur traduction prestashop

Après analyse, du code erreur :

FatalErrorException in AdminController.php line 2735: Error: Call to a member function trans() on null

il s’avère que la fonction de traduction des modules ne marchait pas correctement dans mon cas et j’ai du surcharger cette fonction dans mon controller.

Voici donc le code qui a permis de faire fonctionner le module correctement

 /**
     * Surcharge de la fonction de traduction sur PS 1.7 et supérieur.
     * La fonction globale ne fonctionne pas
     * @param type $string
     * @param type $class
     * @param type $addslashes
     * @param type $htmlentities
     * @return type
     */
    protected function l($string, $class = null, $addslashes = false, $htmlentities = true)
    {
        if ( _PS_VERSION_ >= '1.7') {
            return Context::getContext()->getTranslator()->trans($string);
        } else {
            return parent::l($string, $class, $addslashes, $htmlentities);
        }
    }

Si vous avez aussi rencontré ce problème et trouvé une autre solution n’hésitez pas à la partager 😉

2 commentaires

Installer rapidement une Vm avec Magento2

Après le passage de la certification Magento 1 il est temps pour moi de creuser un peu plus intensément Magento 2.

Pour commencer voici donc un petit script bien utile qui va installer Magento 2 ainsi que tout ses prérequis ( nginx / php-fpm ) sur une Vm Ubuntu 16.04 brute
Dans mon cas celle-ci est hébergée dans AWS.

Voici le script complet

 #!/bin/bash
 
#Mise à jour du serveur
sudo apt-get update && sudo apt-get -y upgrade
 
#Installation des libs nécessaires au serveur
sudo apt-get -y install nginx git unzip htop php-fpm php-mysql php7.0-curl php7.0-mcrypt php7.0-xsl php7.0-intl php7.0-gd php7.0-mbstring php7.0-zip
 
#Installation de mysql
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password root"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password root"
sudo apt-get install -y mysql-server
 
#Récupération de magento2
cd /var/www/html/
sudo mkdir magento2
sudo chown -R ubuntu:www-data magento2
cd magento2
echo "Recupération et extraction de l'archive"
[email protected] : Trouver un miroir avec les versions de magento2
sudo wget http://web.h-hennes.fr/magento2/Magento-CE-2.1.5_sample_data.zip
sudo unzip Magento-CE-2.1.5_sample_data.zip
 
#Mise à jour des droits
echo "Mise à jour des droits des fichiers"
sudo find . -type f -exec chmod 664 {} \;
sudo find . -type d -exec chmod 775 {} \;
sudo chown -R ubuntu:www-data .
 
#Ajout de l'user ubuntu au group www-data
sudo usermod -a -G www-data ubuntu
 
#creation de la base de données
mysql -u root -proot -e "CREATE DATABASE magento2"
 
#Installation de magento via la ligne de commande
php bin/magento setup:install --base-url=http://amazon.dev/ \
--db-host=localhost --db-name=magento2 --db-user=root --db-password=root \
--admin-firstname=admin --admin-lastname=admin --admin-email=admin@test.com \
--admin-user=admin --admin-password=admin123 --language=fr_FR \
--currency=EUR --timezone=Europe/Paris --use-rewrites=1
 
#Remise à jour des droits ( car script lancé avec user ubuntu )
sudo chown -R ubuntu:www-data .
 
#Configuration Nginx avec les noms de domaines de tests amazon.dev
echo "Configuration nginx"
cd /etc/nginx/sites-available/
sudo cat <<CONF > magento2.conf
upstream fastcgi_backend {
    server  unix:/run/php/php7.0-fpm.sock;
 }
 server {
    listen 80;
    server_name amazon.dev www.amazon.dev;
    set $MAGE_ROOT /var/www/html/magento2;
    include /var/www/html/magento2/nginx.conf.sample;
}
CONF
sudo ln -s /etc/nginx/sites-available/magento2.conf /etc/nginx/sites-enabled/magento2.conf
sudo service nginx reload

 

Pour installer magento2 il vous suffit de lancer la commande suivante :

#Commande à lancer pour installer via le script
bash <(curl -s https://gist.githubusercontent.com/nenes25/135ab5ad2636c0aa09d1fd9bea6d6e7e/raw/5b003a7263937c2fc1bedef5cb780adf15aa72a0/install-magento2-vm.sh)

Dans mon cas je lie la vm au domaine amazon.dev, du coup il faut associer l’ip de la vm au nom de domaine dans votre fichier host, et le tour est joué.
En quelques minutes vous avez une instance de Magento 2 disponible et testable.

Pas de commentaires

Passage du blog en https

Après tous les articles récents publiés sur le https, il était temps de mettre la recommandation du passage en full https sur ce blog en application.
Pour le coup c’est plutôt facile à faire avec wordpress, et c’était en place en moins de 30 minutes 🙂

Voici les différentes étapes effectuées pour passer wordpress en https.

A savoir que le https est déjà géré et disponible sans configuration via les dns cloudflare que j’utilise ( c’est pareil pour tous les hébergements mutualisés via les dns ovh également )

Configuration de wordpress

Pour commencer , il suffit de changer les urls du site dans la configuration de wordpress en allant dans « Réglages / Généraux »

Correction du contenu mixte

Le site est à présent disponible en https, cependant si vous avez des images vous allez rapidement constater des avertissements de contenus mixtes.
C’est à dire que votre navigateur vous alerte que votre page charge des éléments non sécurisés ( protocole http ), sur une page sécurisée ( https )

Pour corriger cela il va être nécessaire de mettre à jour votre base de données pour remplacer les urls http par du https
(Attention à bien sauvegarder votre base avant )

Dans mon cas cela est passé par l’éxécution de la requête suivante

UPDATE wp_posts SET `post_content` = REPLACE (`post_content`, 'http://www.h-hennes.fr', 'https://www.h-hennes.fr')

Une fois cette requête exécutés tout vos liens vers des médias ou entre les différents articles sont mis à jours.

Correction du duplicate content

Pour finir afin d’éviter les contenus dupliqués nous allons rediriger l’ensemble des url http vers l’url similaire en https en 301 pour indiquer aux moteurs de recherche que celles-ci remplacent les anciennes urls.
Pour cela ajouter les lignes suivantes ( entre les commentaires) dans le fichier .htacess situé à la racine de votre blog

RewriteEngine On
#Redirection http vers https
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.h-hennes.fr/blog/$1 [R=301,L]
#Fin Redirection http vers https
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
Pas de commentaires

Générer un certificat SSL autosigné

Afin de pouvoir utiliser le protocole https lors de vos développements locaux, il est nécessaire de générer un certificat https.

Voici une commande rapide qui vous permettra de générer un certificat auto-signé qui aura une validité d’un an.

 openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/ssl/ssl.crt -keyout /etc/ssl/ssl.key

Dans le cas d’un site live, il est recommandé d’utiliser un vrai certificat ssl ( qu’il soit payant ou généré via LetsEncrypt cf. https://www.h-hennes.fr/blog/2016/10/11/passer-au-https-avec-letsencrypt/ )

Vous pouvez ensuite ajouter ce certificat facilement à votre configuration nginx ou apache :

Nginx :

server {
    listen 443 ssl;
    ssl_certificate /etc/ssl/ssl.crt
    ssl_certificate_key /etc/ssl/ssl.key;
 
    server_name local.dev;
    root /home/www;
}

 

Apache :

<VirtualHost *:443>
       
        ServerName local.dev
        DocumentRoot /home/www
        SSLEngine on
        SSLCertificateFile /etc/ssl/ssl.crt
        SSLCertificateKeyFile /etc/ssl/ssl.key
 
        <Directory "/home/www">
           Options Indexes FollowSymLinks MultiViews
           Order allow,deny
           Allow from all
           AllowOverride All
           # New directive needed in Apache 2.4.3:
           Require all granted
        </Directory>
 
 
</VirtualHost>

 

Pas de commentaires
Magento certified developper
Modules Prestashop
Compte Github