Jump to content
sangria777

Prestashop & requete sql

Recommended Posts

Bonjour à tous,

 

Je me décide à demander de l'aide après des heures de recherche !

Même si ma demande est surement très bête, je n'y arrive pas, je ne comprend pas...

Le sujet est souvent abordé, mais il me manque des billes !

 

Je voudrais comprendre tout le fonctionnement pour une faire une requete sql.

Je suis en version 1.5.2

 

Par exemple sur une table que j'ai ajouté (oo-promo) et sur la page authentication.

 

première étape

Je dois faire une class avec ma requête.

Je l'ai mis dans class/controller/FrontControler, c'est bien la ?

public function testPromo()
	{
		global $smarty, $cookie;

		$req = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'ad-promo`');
		$this->context->smarty->assign('requete',$req);
		$this->setTemplate(_PS_THEME_DIR_.'authentication.tpl');
	}

Est-ce que le code est correct ?

 

Deuxième étape

Je dois mettre dans le authentication.tpl un code pour afficher le résultat de la requête.

{foreach from=$requete item=testPromo}
        promo : {$testPromo}
        {/foreach}

Mais je ne comprend pas ce que je dois mettre pour item : le nom de la class ?

 

Et normalement ça suffit ?

 

 

Merci vraiment à ceux qui prendrons le temps de m'expliquer la démarche pour ma version.

J'aimerai vraiment comprendre !

Edited by sangria777 (see edit history)

Share this post


Link to post
Share on other sites

Il vous faut vous renseigner au sujet des "surcharges" (override) des controller.

Sinon, vous ne pourrez pas mettre à jour votre boutique si vous modifier directement les classes ou controller.

 

Ensuite, concernant le template. Dans votre controller, vous assigner au template des variables (int, string, array, ...) et ce sont ces variables que vous appelez dans le template.

Share this post


Link to post
Share on other sites

Merci pour cette réponse, je voudrais vraiment comprendre !

 

J'ai déjà surchargé des class et j'ai lu beaucoup de chose à ce sujet, mais la je ne vois pas ou et surtout laquelle, enfaite.

 

Si je veux afficher un élément d'un table perso sur une page comme authentication.tpl

 

Dans quel fichier je dois mettre ma fonction avec la requete sql ?

Edited by sangria777 (see edit history)

Share this post


Link to post
Share on other sites

Est-ce dans le fichier override/classes/controller/FrontController.php ?

 

Peux-être que si je met la fonction ici je pourrais l'afficher dans n'importe quel .tpl, c'est ça ?

Share this post


Link to post
Share on other sites

Je n'ai jamais eu l'occaz et l'utilisé d'avoir à  effectuer un override, donc je ne pourrais répondre à votre question.

En attendant qu'un dev passe dans le coin...

Share this post


Link to post
Share on other sites

Ha ok, est-ce que quelqu'un sait si je suis au bon endroit et surtout si ma démarche est la bonne ?

Share this post


Link to post
Share on other sites

Bonjour,

 

Oula ! tout ça semble bien confus !

 

Pour aller plus vite, indiquez exactement ce que vous souhaitez faire.

Est-ce que vous souhaitez afficher une seule donnée de votre table dans la page d'authentification (quelle étape exactement ?), ou plusieurs ?

 

Il faut savoir où vous souhaitez agir et avec quoi, et on pourra vous aider plus.

 

pour votre demande sur l'item testPromo, c'est pas une classe non ;) c'est simplement une variable temporaire qui permettra de faire ressortir vos données dans la boucle par : item.monchampdelatable, puisque que vous faites un select * dans la sql.

 

A+

Share this post


Link to post
Share on other sites

Bonjour,

 

Alors je vais essayer d être plus clair!!

 

Dans la table que j ai crée je vais chercher 3 valeurs (une date d application, une date de fin et un libellé)

 

Je veux afficher ces valeurs dans la page authentification.

 

Je pensais devoir faire une class, mais c est vrai que je veux seulement afficher des variables!

 

Merci pour votre aide!

Share this post


Link to post
Share on other sites

Pour ce que j'ai compris:

Si  tes valeurs sont associées à ta table customer, il te suffit d'overrider le modèle customer, et modifier ton template.

Sinon, il vaut probablement mieux:

-soit overrider le controlleur d'authentification.

-soit y accrocher un hook de display qui renseigne le smarty (peut être que ça doit passer par l'override du controller)

Et bien entendu, modifier le template (de préférence dans un thème à toi)

Share this post


Link to post
Share on other sites

Alors les valeurs sont dans une table que j'ai créer : ad-promo

 

Du coup on arrive la ou je but : ou puis-je overider le controller d'authentification ?

 

Dans override/controllers/front ? -> je n'ai pas de fichier authentication ??

Edited by sangria777 (see edit history)

Share this post


Link to post
Share on other sites

A mon avis, tu peux t'en sortir sans override avec un de ces hooks:

 

displayCustomerAccount

Display on page account of the customer

displayCustomerAccountForm

Display some information on the form to create a customer account

 

Sinon, voir:

controllers/front/AuthController.php         qui gère le login et l'appel des formulaires de compte client (+ éventuellement adresses)

ou controllers/front/MyAccountController.php              appelle aussi ces formulaires, depuis 'mon compte'

et controllers/admin/AdminCustomersController.php   qui prépare réellement le smarty du  formulaire client

note: tout ceci est à vérifier, je n'ai pas exploré en profondeur

Par ailleurs, je pense que c'est toujours mieux d'éviter un override s'il n'est pas nécessaire (pour les updates à venir, et éviter les conflits avec d'éventuels autres overrides).

Edited by spacm (see edit history)

Share this post


Link to post
Share on other sites

Merci pour ta réponse spacm,

 

Bien que je ne la comprenne pas tout !

 

Si c'est mieux d'éviter un override, que dois-je faire avec les hooks ?

ça se passe ou ?

Share this post


Link to post
Share on other sites

Les hooks, ça se passe dans ton module si tu en développe un (j'avais supposé que c'était le cas).

Dans le script principal de ton module, tu définis une fonction qui s'accrochera (hook) là où le hook est défini dans prestashop.

Cette fonction peut éventuellement appeler un modèle perso que tu auras défini dans un coin de ton module.

require_once('models/MonModele.php'); //MonModele hérite de ObjectModel (si tu utilises un modele)

class MonModule extends Module {

    public function __construct() {

        $this->name         = 'MonModule';
        $this->tab             = 'front_office_features';
        $this->version         = 0.1;
        $this->author         = 'moi';
        $this->displayName     = $this->l('Mon module');
        $this->description     = $this->l('Module pour ajouter 3 champs à l'inscription client.');

        parent :: __construct();
        //$this->registerHook('displayCustomerAccount');  // ça, on peut le décommenter une fois pour enregistrer le module
    }

    //pour l'installation du module dans le Back Office
    public function install() {
        return parent :: install()
            && $this->resetDb() //drop si existe et install des tables
            && $this->registerHook('displayCustomerAccount');            ;
    }

    private function resetDb() {
      //opérations en BD pour installer le module
    }

    public function hookDisplayCustomerAccount($params) {

//on prépare le smarty, éventuellement en utilisant la classe dérivée d'ObjectModel appropriée, ou avec une requete SQL
this->context->smarty->assign(...

//ça peut être suffisant si tu as modifié directement le template dans ton thème

//sinon, peut être
            return $this->display(__FILE__, 'MonTEmplateAInserer.tpl');
    }
    
}
Edited by spacm (see edit history)

Share this post


Link to post
Share on other sites

Heu non, pas de module enfaite.

 

Du coup je regarde le override/controllers/front/AuthController.php

 

J'y ai mis la class :

public function testPromo()
	{
		global $smarty, $cookie;

		$req = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'ad-promo`');
		$this->context->smarty->assign('requete',$req);
		$this->setTemplate(_PS_THEME_DIR_.'authentication.tpl');
	}

Ensuite dans authentication.tpl, j'ai mis :

{foreach from=$requete item=testPromo}
        promo : {$testPromo}
{/foreach}

ça ne marche pas, pourtant c'est quelque chose comme ça que je dois faire ?

Share this post


Link to post
Share on other sites

Bonjour,

 

Est-ce que je suis sur la bonne piste ?

Les codes sont-ils au bon endroit ?

 

Merci pour vos réponses!

Share this post


Link to post
Share on other sites

Pas de réponse ! Est-ce qu'il faut que j'explique d'autre chose ?

Ou peut être y a-t-il des tutos pour faire une requête d'une table perso ?

Dites-moi ce que je dois faire pour être plus claire !

Share this post


Link to post
Share on other sites

Quand tu fais un override, c'est en principe pour remplacer une classe existante de prestashop par une classe fille dans laquelle tu redéfinis certaines fonctions.

 

donc plutôt un contenu du genre:

class AuthController extends AuthControllerCore {
//la fonction que tu veux redéfinir/ étendre, par exemple intiContent()

  public function initContent() {
     //éventuellement, ta requête à la main pour récupérer tes valeurs
     //cependant; il est en principe mieux de passer par une classe dérivée d'objectModel pour accéder à tes ressources dans la base
     //tes assign smarty à toi
     parent::initContent();
  }


}

Share this post


Link to post
Share on other sites

Du coup dans mon cas : je veux faire une requête sur une table 'perso'.

 

Est-ce un override que je dois faire ?

Car ce n'est pas vraiment une redéfinition de fonction, si ?

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