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 !

One thought on “Prestashop : Produits privés

  1. Salut, ça semble très intéressant. J’essaye de le mettre en place pour voir ce que ça donne mais n’y arrive pas.
    Lorsque je modifie un produit avec un niveau de sécurité ça ne prend pas en compte les changements (j’ai pourtant bien le bandeau vert de mise à jour réussie).
    Je pense que c’est au niveau du renderform() dans AdminProductsController.php que je l’insert mal. Je ne trouve pas « switch active » et ne sais pas ce que ça veut dire, j’ai donc testé d’ajouter le code a plusieurs endroits mais sans succés semble-t-il :/

Laisser un commentaire