Monthly Archives: avril 2016

Prestashop : Ajouter un client à un groupe automatiqument !

Suite aux précédent billets, nous sommes les heureux possesseurs d’un prestashop tuné, capable de cacher certaines pages et de désactiver certains produits aux utilisateurs n’ayant pas le niveau suffisant.

Ne reste plus qu’a modifier automatiquement les groupes des utilisateurs, suite à l’achat d’un certain produit, disons un ticket d’entrée.

Premiere étape, modifier nos produits pour définir lesquels attribue un nouveau groupe au client, et quel groupe.

BDD :

Créons un champ « nlvl »  int(3) dans la table ps_products, juste apres le champ xlvl du precedent tuto.

Modification du produit :

Reprenons le precedent tuto, en changeant chaque occurrence de « xlvl » par « nlvl ».
N’oublions pas de changer les descriptions, « Niveau de sécurité minimum »  devient « Nouveau groupe client (0 pour désactiver) »

A ce stade, nous devrions pouvoir affecter notre parametres « nouveau groupe » à nos produits via le back office.

Rendons maintenant le mécanisme actif !

Attribution du nouveau groupe

Le code suivant pourrait s’intégrer à plusieurs endroits du processus de commande.  Nous, nous allons choisir de squatter le processus orderHistory.  Quelque soit le canal de paiement, on peut se fier la bonne execution de ce code, pour n’importe quel statut de commande confirmant le paiement (ps_order_status => is_paid)

Editons classes/order/OrderHistory.php et ajoutons ceci juste apres  »        if ($new_os->paid == 1) { »

$customer = new Customer((int)$order->id_customer);
            foreach ($order->getProductsDetail() as $product) {
                $proct = new Product($product['product_id']);
                if($customer->id_default_group < $proct->nlvl){
                    Db::getInstance()->execute('UPDATE `'._DB_PREFIX_."customer` SET id_default_group='".(int)$proct->nlvl."' WHERE `id_customer` = '".(int)$order->id_customer."'");
                    Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_."customer_group` (`id_group`, `id_customer`) VALUES ('".(int)$proct->nlvl."','".(int)$order->id_customer."')");
                    break;
                }
            }

Citons Joey Starr pour finir : « Big up a moi-même ! »

 

linux : Search in files script

A super linux ability : find files containing certain words.
but typing the command (even remembering it! ) is anoying.
Lets create a quick script to ease the use !

sudo nano /usr/bin/myfind

#!/bin/bash
if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
    exit;
fi
grep -rnw -A1 -B1 './' -e "$1"

Type : myfind aword
to list every file containing « aword » in the current directory and his subfolders (recursive !)

Prestashop : Produits privés

De la même manière qu’on a pu modifier nos pages cms pour les rendre privées, en se basant sur le groupe principal de l’utilisateur, modifions également nos pages produits pour désactiver l’ajout au panier aux clients non autorisés.

Dans notre cas, on veux que nos clients puisse voir le produit, mais que seuls certains puissent le commander. La manip est donc à adapter à nos besoin. D’ailleurs, tout ceci n’est qu’une ré-application de l’article précédent.

Base de donnée :

Pas de problème ici, nous allons juste rajouter un champ à la table « ps_product», qui correspondra au niveau de groupe minimum pour voir la page. Appelons le « xlvl »,   INT (3) avec 0 en valeur par défaut, pour que toutes nos pages soient publiques par défaut.
Plaçons le juste après le champ « ean13 », par acquis de conscience.
Rappel : Nos id_group sont, classiquement, (1=>visiteurs, 2=>invités, 3=>clients, 4=>membre, 5=>associé ) pour ce projet.

Classes :

Pas de soucis ici non plus, on édite « /classes/Product.php ». Pas d’override, on est des fous !
Pour commencer, ajoutons nos défintions de variable :

    public $clvl;
    public $xlvl;

Dans la définition de notre objet $definition,, ajoutons la ligne :

            'xlvl' =>            array('type' => self::TYPE_INT),

Pendant que nous sommes sur cette page, ajoutons une nouvelle méthode, chargée de retourner le niveau de l’utilisateur dans nos pages :

public static function getclvl(){
    global $cookie;
    if(isset($cookie->clvl)) {return $cookie->clvl;}
    else return 1;
}

 

Cookie :

Comme dans le tuto précédent, modifions /controllers/front/AuthController.php, pour ajouter cette ligne dans la méthode processSubmitLogin().

$this->context->cookie->clvl = $customer->id_default_group;

et cette ligne dans updateContext():

        $this->context->cookie->clvl=$customer->id_default_group;

Modifier ensuite classes/Cookie.php pour y ajouter cette ligne, dans mylogout() :

        unset($this->_content['clvl']);

 

Controller :

Cette fois ça va saigner !
On va se coller a la définition de ean13, qui m’a servi de fil rouge pour trouver comment faire, et qui nous guidera pour la position de notre xlvl dans les listes ( toujours entre ean13 et upc )

Ouvrons « controllers/admin/AdminProductsController.php » et ajoutons ceci à la fin de la définition de $this->fields_list, dans public function __construct()

           $this->fields_list['xlvl']=array(
            'title' => 'Niveau d\'accès minimum',
            'type' => 'int',
        );

Dans processProductAttribute, la définition devient

$array_checks = array(
                'reference' => 'isReference',
                'supplier_reference' => 'isReference',
                'location' => 'isReference',
                'ean13' => 'isEan13',
                'xlvl'=> 'isInt',
                'upc' => 'isUpc',
                'wholesale_price' => 'isPrice',
                'price' => 'isPrice',
                'ecotax' => 'isPrice',
                'quantity' => 'isInt',
                'weight' => 'isUnsignedFloat',
                'unit_price_impact' => 'isPrice',
                'default_on' => 'isBool',
                'minimal_quantity' => 'isUnsignedInt',
                'available_date' => 'isDateFormat',
            );

// passons queqlues ligne
                                //Tools::getValue('attribute_ean13'),  Tools::getValue('attribute_xlvl'),                             //$this->isProductFieldUpdated('attribute_default') ? Tools::getValue('attribute_default') : null,

// et encore quelques lignes

// null,
// Tools::getValue('attribute_ean13'),
 Tools::getValue('attribute_xlvl'),

Penchons nous sur initFormInformations() et modifions sa liste ainsi :

 array_push($product_props,
 'price', 'wholesale_price', 'id_tax_rules_group', 'unit_price_ratio', 'on_sale',
 'unity', 'minimum_quantity', 'additional_shipping_cost',
 'available_now', 'available_later', 'available_date'
 );

la liste de renderListAttributes() devient

 $this->fields_list = array(
            'attributes' => array('title' => $this->l('Attribute - value pair'), 'align' => 'left'),
            'price' => array('title' => $this->l('Impact on price'), 'type' => 'price', 'align' => 'left'),
            'weight' => array('title' => $this->l('Impact on weight'), 'align' => 'left'),
            'reference' => array('title' => $this->l('Reference'), 'align' => 'left'),
            'ean13' => array('title' => $this->l('EAN-13'), 'align' => 'left'),
            'xlvl' => array('title' => 'niveau d\'acces necessaire', 'align' => 'left'),
            'upc' => array('title' => $this->l('UPC'), 'align' => 'left')
        );

// on ajoutera également ça un peu plus loin dans la fonction, je vous laisse trouver ou :p
                    $comb_array[$combination['id_product_attribute']]['xlvl'] = $combination['xlvl'];

 

Et ceci dans renderForm(), par exemple en dessous de la definition du switch active,  pour avoir notre gestion en back office.

,
                array(
                    'type' => 'text',
                    'label' => "Niveau de sécurité",
                    'name' => 'plvl',
                    'required' => false,
                    'hint' => array(
                        $this->l('Taper 0 pour des pages visibles par tous, 4 pour des pages réservés aux membres et associés, 5 pour les pages réservées aux associés')
                    ),
                )

 

Templates :

Presque fini ! Editons le template product.tpl dans le dossier de votre theme.
Ajoutons cette condition avant la déclaration du div « box-cart-bottom » :

{if $product->getclvl()>$product->xlvl}

Et ceci apres

        {else}
            <p>Vous ne pouvez pas encore commander ce produit</p>
        {/if}

 

Pour le backoffice, modifions /adminXXX/theme/default/template/controllers/products/information.tpl  et ajoutez ce champ là où ça vous chante (il faut chanter juste quand même !)

    <div class="form-group">
        <label class="control-label col-lg-3" for="xlvl">
            <span class="label-tooltip" data-toggle="tooltip"
                title="{l s='Niveau de sécurité necessaire : 0 pour tous, 3 pour pages reservées aux membre & associé, 4 pour les associés'}">
                {$bullet_common_field} {l s='Niveau de sécurité minimum'}
            </span>
        </label>
        <div class="col-lg-3">
            <input maxlength="13" type="text" id="xlvl" name="xlvl" value="{$product->xlvl|htmlentitiesUTF8}" />
        </div>
    </div>

Ca avait l’air plus compliqué sans le tuto !

Prestashop : Pages CMS privées

Aloha !
aujourd’hui, on se bat avec prestashop !
Objectif : Limiter l’acces de certaines pages CMS a certains groupes de clients.
La méthode : quick & dirty, codage en dur des groupes autorisés, et choix techniques aléatoires ! Ayant 0 expérience  sur smarty , ça n’aide pas à avoir du recul ..

Mais peu importe :]

Base de donnée :

Pas de probleme ici, nous allons juste rajouter un champ à la table « ps_cms », qui correspondra au niveau de groupe minimum pour voir la page. Appellons le « plvl »,   INT (3) avec 0 en valeur par défaut, pour que toutes nos pages soient publiques par défaut.
Nos id_group sont, classiquement, (1=>visiteurs, 2=>invités, 3=>clients). Nous aurons également (4=>membre, 5=>associé ) pour ce projet.

Classes :

Pas de soucis ici non plus, on édite « /classes/CMS.php ». Pas d’override, on est des fous !
Pour commencer, ajoutons nos défintions de variable :

    public $plvl;
    public $clvl;

Dans la définition de notre objet cms[« fields »], apres la définitation de « active », ajoutons la ligne :

            'plvl' =>            array('type' => self::TYPE_INT),

 

Controller :

Ouvrons « controllers/admin/AdminCmsController.php » et ajoutons ceci dans à la fin de la définition de $this->fields_list

            , 'plvl' => array('title' => $this->l('Niveau d\'accès minimum'))

Et ceci dans renderForm(), par exemple en dessous de la definition du switch active,  pour avoir notre gestion en back office.

,
                array(
                    'type' => 'text',
                    'label' => "Niveau de sécurité",
                    'name' => 'plvl',
                    'required' => false,
                    'hint' => array(
                        $this->l('Taper 0 pour des pages visibles par tous, 4 pour des pages réservés aux membres et associés, 5 pour les pages réservées aux associés')
                    ),
                )

Cookie :

Pour que notre id_group soit disponible au chargement de la page, il va nous falloir passer par les cookies. Gestion de la création, destruction et mise à jour donc (tout un programme … lol ). Modifions /controllers/front/AuthController.php, pour ajouter cette ligne dans la méthode processSubmitLogin().

$this->context->cookie->clvl = $customer->id_default_group;

et cette ligne dans updateContext():

        $this->context->cookie->clvl=$customer->id_default_group;

Modifier ensuite classes/Cookie.php pour y ajouter cette ligne, dans mylogout() :

        unset($this->_content['clvl']);

et ajoutons une méthode à la classe cms (/classes/CMS.php)

public static function getclvl(){
    global $cookie;
    if(isset($cookie->clvl)) {return $cookie->clvl;}
    else return 1;
}

 

Template :

Presque fini ! Editons le template cms.tpl dans le dossier de votre theme.
Remplacons :

    <div class="rte{if $content_only} content_only{/if}">
        {$cms->content}
    </div>

par :

    <div class="rte{if $content_only} content_only{/if}">
       {if $cms->getclvl()>$cms->plvl}
            {$cms->content}
        {else}
            <p>Vous ne pouvez pas acceder à cette page.</p>
        {/if}
    </div>

Voila une MAJ un peu sauvage qui va bien !
Peut-être y avait t’il moyen de procéder sans les cookies ?