Jump to content

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)
Link to comment
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.

Link to comment
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)
Link to comment
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+

Link to comment
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!

Link to comment
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)

Link to comment
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)
Link to comment
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)
Link to comment
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 ?

Link to comment
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();
  }


}
Link to comment
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...