Jump to content
kerlin

Créer une condition pour ne pas afficher un bouton sur my-account

Recommended Posts

Bonjour,

Avec l'aide de tutos et d'un dev patient que j'aimerais ne pas ennuyer éternellement, j'ai créé un petit module pour un PS 1.7.5.2 qui permet d'ajouter des données au compte client. C'est un tableau à remplir avec l'id du client concerné, et des sommes versées.
En BO, sur le compte du client, un nouveau tableau est affiché, reprenant les données qui le concernent.
Et en front, sur la page my-account, un nouveau bouton apparaît, qui lui permet de visualiser le tableau de ces données.
Pour le moment, s'il n'a aucune donnée, un message apparaît.

Mais j'aimerais que le bouton n'apparaisse que s'il y a des données le concernant.

Dans la function du hook correspondant, j'ai essayé avec le code utilisé pour afficher le message en cas d'absence de données. Mais le bouton s'affiche toujours.
J'ai essayé pas mal de choses, mais soit le bouton n'apparaît plus même s'il a des données, soit il apparaît de toute façon.

Je ne suis pas dev PHP alors je viens voir si quelqu'un peut me donner un coup de pouce.

J'ai essayé en dernier avec une requête SELECT COUNT(). Avec PHPMyAdmin, le résultat est bien 0 si aucune donnée correspondante. Mais dans le code, je ne parviens pas à trouver la commande qui permettrait de traiter un retour = 0. Voici mon dernier essai :

 public function hookDisplayCustomerAccount($params)

    {



       $id_customer = $params['id_customer'];

		$idCommission = '

                SELECT COUNT(id_programcustomer)

                FROM `' . _DB_PREFIX_ . 'programcustomer2`

                 WHERE id_customer="$id_customer";

                ' ;
        $resultcount = Db::getInstance()->ExecuteS($idCommission);




        if ($resultcount != 0) {

        return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');

        }

    }

Par ailleurs, pour le tableau qui affiche les données (des montants) j'aimerais faire les totaux par colonne. Si faire les totaux par ligne n'est pas difficile, par colonne, c'est une autre paire de manche ! j'ai essayé avec un SELECT SUM() mais je n'arrive pas à afficher un résultat (pourtant ma requête avec PHPMyadmin affiche bien le total de la commande).

 

Merci d'avance !

Share this post


Link to post
Share on other sites

Bonjour

Et avec ce code :

public function hookDisplayCustomerAccount($params)
{    
    $sql = '
        SELECT id_programcustomer
        FROM `'._DB_PREFIX_.'programcustomer2`
        WHERE `id_customer` = '.$params['id_customer'];
        
    $result = Db::getInstance()->ExecuteS($sql);
    
    if (count($result)) {
        return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');
    }
}

 

Share this post


Link to post
Share on other sites

Peut-être avec un getValue() à la place du ExecuteS().

Share this post


Link to post
Share on other sites
Citation

getValue()
Method signature: getValue($sql, $use_cache = 1).

This method executes a given SQL query and retrieves the first value of the first row of results. It should only be used with 'read' queries (SELECT, SHOW, etc.). The query's results are cached, unless the $use_cache parameter is set to false.

This method automatically adds a LIMIT clause to the query. Be careful not to add one manually.

Example:

$sql = 'SELECT COUNT(*) FROM '._DB_PREFIX_.'shop';

$totalShop = Db::getInstance()->getValue($sql);

getValue() does not protect your code from hacking attempts (SQL injections, XSS flaws and CRSF breaches). You still have to secure your data yourself.
One PrestaShop-specific securization method is pSQL($value): it helps protect your database against SQL injections.

http://doc.prestashop.com/pages/viewpage.action?pageId=51184692

Share this post


Link to post
Share on other sites

@Mediacom87 : merci de te pencher sur mon cas.

J'ai testé, mais il doit manquer quelque part une ' car j'ai eu une erreur. J'ai essayé des modifs sans succès. Si mes vieux yeux voient bien, il y aurait 2 types d'apostrophe ? une toute petite et une plus grande ? A part en faisant un copier coller de la petite, je ne vois pas comment on la fait au clavier. Et à quel moment on utilise, la petite, la moyenne et la double ?? j'y perds mon latin !

J'ai alors fait un copier coller d'une requête utilisée ailleurs, que j'ai adaptée (pour avoir les bonnes apostrophes) mais le $params de l'id_customer ne passe pas, alors je l'ai remis en variable avant, et utilisé la variable dans la requête.

Le count(results) me paraît tout à fait logique, je n'y avais pas pensé.

 

Mais cela ne marche pas : avec le code ci-dessous je n'ai plus le bouton, même si le client a des données dans son tableau. 

    public function hookDisplayCustomerAccount($params)

    {
      
	   $id_customer = $params['id_customer'];
	   $sql =  'SELECT `id_programcustomer`
                FROM `' . _DB_PREFIX_ . 'programcustomer2`
                 WHERE id_customer="$id_customer";
                ' ;

       $result = Db::getInstance()->ExecuteS($sql);
    
   
    
    if (count($result)) {
        return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');
    }

    }

Comme je l'ai dit dans mon premier message, actuellement, si le client n'a pas de données dans son tableau, la page affiche "Vous n'avez pas de commissions". Cela est géré dans le fichier tpl qui affiche cette page par un (if $results).

Je suppose que le résultat est bien calculé selon le fichier du controller front avec ceci :

    <?php



class programcustomer2defaultModuleFrontController extends ModuleFrontController

{
   public $auth = true;
 
   public $id_programcustomer;

   public $title_book;

   public $id_customer;

   public $date_comm;

   public $comm_broched;

   public $comm_brochoth;

   public $comm_ebooked;

   public $comm_ebookoth;

    public function init()
    {
        parent::init();
        $this->customer = $this->context->customer;
    }

	 public function getListCommissionsSql($idCommission = null)

		{

				$sql = 'SELECT DISTINCT
                      a.`id_programcustomer` AS `id`,
                      a.`title_book`,
                      a.`id_customer`,
                      a.`date_comm`,
                      a.`comm_broched`,
                      a.`comm_brochoth`,
                      a.`comm_ebooked`,
                      a.`comm_ebookoth`

                    FROM `' . _DB_PREFIX_ . 'programcustomer2` a

                    WHERE
                        `id_customer` = $id_customer ';
          $idCommission = (int) Db::getInstance()->getValue('
                SELECT `id_programcustomer`
                FROM `' . _DB_PREFIX_ . 'programcustomer2`

                '
            );

        if (!is_null($idCommission)) {
            $sql .= ' AND a.`id_programcustomer` = ' . (int) $idCommission ;
          }

        return $sql;
     }

    public function initContent()
    {
        parent::initContent();
       $id_customer = $this->customer->id;

         //Récupération des commissions liées au clients via une requête sql
     $commissionSql = "SELECT *
                        FROM "._DB_PREFIX_."programcustomer2
                        WHERE
                        `id_customer` = '$id_customer'
						ORDER BY  date_comm DESC ;";


    $results = Db::getInstance()->executeS($commissionSql);

		
    //Assignation et Affichage des résultats dans un template
    $this->context->smarty->assign('results',$results);
 

    $template = $this->setTemplate('module:programcustomer2/views/templates/front/programcustomerfront.tpl');


    }
    
    
    }

Je vais peut-être dire un truc très bête, mais pourquoi ne puis-je pas récupérer le $results directement dans le hook que j'essaie de modifier ?? J'ai essayé en reprenant la requête qui est dans parent::initContent(), ça ne marche pas. Faudrait-il que j'ajoute une public function initContent avant la création du hook ??

En fait, je ne sais pas si c'est l'id du customer qui n'est pas récupérée ou si c'est la requête qui ne convient pas. Bon je pourrais me contenter du message en cas de non résultats, mais ça m'énerve de ne pas trouver !

 

Merci !

 

Share this post


Link to post
Share on other sites
Il y a 3 heures, lagui a dit :

Peut-être avec un getValue() à la place du ExecuteS().

@lagui merci pour ta réponse. C''est la première chose qui a été tentée avec ceci :

  public function hookDisplayCustomerAccount($params)

    {



       $id_customer = $params['id_customer'];

				$idCommission = (int) Db::getInstance()->getValue('

                SELECT `id_programcustomer`

                FROM `' . _DB_PREFIX_ . 'programcustomer2`

                 WHERE id_customer="$id_customer";

                ' );





        if (!is_null($idCommission)) {

        return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');

        }

    }

Mais alors le bouton est affiché dans tous les cas 😞

Share this post


Link to post
Share on other sites

Et  comme ça :

public function hookDisplayCustomerAccount($params)

    {

       $id_customer = $params['id_customer'];
		$idCommission = '
                SELECT COUNT(`id_programcustomer`)
                FROM `'._DB_PREFIX_.'programcustomer2`
                 WHERE id_customer= "'.$id_customer.'";
                ' ;
        $resultcount = Db::getInstance()->getValue($idCommission);

        if ($resultcount) {
            return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');
        }
    }

 

Share this post


Link to post
Share on other sites

Je crois que j'ai trouvé grâce à un autre post ! (https://www.prestashop.com/forums/topic/717599-recupereion-de-lid-client/

 

J'ai remplacé 

$id_customer = $params['id_customer'];

 

par

$id_customer = (int)$this->context->customer->id;

Avec juste un if $results

Et quand je vide les données correspondant au client, le bouton ne s'affiche plus. Je remets des données, le bouton s'affiche.

Le code final est 

    public function hookDisplayCustomerAccount($params)

    {
      
	   $id_customer = (int)$this->context->customer->id;

         //Récupération des commissions liées au clients via une requête sql
     $commissionSql = "SELECT *
                        FROM "._DB_PREFIX_."programcustomer2
                        WHERE
                        `id_customer` = '$id_customer'
						;";


    $results = Db::getInstance()->executeS($commissionSql);
    
   
    
    if ($results) {
        return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');
    }

Oooouuuufff ! 

Maintenant il n'y a plus que le souci des totaux par colonnes à régler. Je crée un autre post pour que ce soit plus clair.

Merci à tous les 2 !

Share this post


Link to post
Share on other sites
il y a 15 minutes, lagui a dit :

Et  comme ça :


public function hookDisplayCustomerAccount($params)

    {

       $id_customer = $params['id_customer'];
		$idCommission = '
                SELECT COUNT(`id_programcustomer`)
                FROM `'._DB_PREFIX_.'programcustomer2`
                 WHERE id_customer= "'.$id_customer.'";
                ' ;
        $resultcount = Db::getInstance()->getValue($idCommission);

        if ($resultcount) {
            return $this->display(__FILE__, 'views/templates/hook/my-accountcomm.tpl');
        }
    }

 

Essayé aussi, mais sans succès non plus. Manifestement, c'est la récupération de l'id_customer qui ne se faisait pas. Après modification comme indiqué dans mon précédent post, ça marche !

Merci en tout cas !

Share this post


Link to post
Share on other sites
Il y a 2 heures, kerlin a dit :

Manifestement, c'est la récupération de l'id_customer

Ne me dites pas que vous n'aviez pas contrôlé la présence de id_customer dans $params ????

Share this post


Link to post
Share on other sites

bon, ben je ne vais pas le dire alors 😉

Ca marchait pour une autre fonction, donc je ne voyais pas pourquoi cela n'aurait pas marché pour celle là ...

Et puis d'abord, comment fait-on pour tester ? oui, j'ai déjà lu un truc à ce sujet mais n'ai pas encore eu l'occasion d'approfondir la question pour savoir comment il faut le faire.

J'apprends au fur et à mesure ...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More