Jump to content

Récupérer le résultat d'une fonction php dans un TPL


Recommended Posts

Bonjour, 

alors je tiens à prévenir que je suis débutant dans le codage en général.

Je suis sous prestashop 1.7

je souhaite récupérer dans mon fichier breadcrumb.tpl un tableau qui contient toutes les catégories de mon produit.

J’ai actuellement :

public static function getcatforbred(){
	if ($product!= NULL ){
global $catebredcrum;
$id_search=$product->id_product;
$this->query = 'SELECT id_category FROM prstshp_category_product WHERE id_product ='.$idsearch.'';
$result = Db::getInstance()->ExecuteS($this->query);
$catebredcrum->assign('catearray', $result);		
}}

 dans mon fichier tools.php (je ne sais même pas s’il est bien à sa place) 

et :

{$catearray}

dans mon fichier breadcrumb.tpl

mais le site ce met en erreur 500.

Quelqu'un pourrait m'aider ? 

Link to comment
Share on other sites

Bonjour, 

Non je n'ai pas créé d'override je modifie le fichier au chemin httpdocs>classes>tools.php

L'erreur qui s'affiche est :

Parse error: syntax error, unexpected 'public' (T_PUBLIC), expecting end of file in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/Tools.php on line 4413

Edited by thibaut33 (see edit history)
Link to comment
Share on other sites

Bonjour,

Tout d'abord, je conseille la création d'une surcharge, c'est plus sécurisé.

Après une modification de classe, on doit généralement effacer le ou les dossiers situés dans le répertoire : /var/cache/

Dans ta condition, tu n'as pas besoin du "!= NULL" je pense, s'il n'y a pas de produit, alors ce sera false et ta condition ne sera pas confirmé.

$id_search reçoit-il un entier ou un string ?

Link to comment
Share on other sites

C'est ça pour la classe. Remplacer le nom de la classe par : "class Tools extends ToolsCore" et bien vider le cache, voir réinitialiser certains module en fonction du besoin.

Pour l'erreur, tout d'abord il faut vérifier que la requête soit bonne avec un entier en paramètre sur un logiciel de gestion de BDD.

Link to comment
Share on other sites

Essaye de "var_dump($product);die;" au début de ta fonction avant la condition.

Si rien ne ce passe sur le site alors que tu as effectué l'action qui est sensé appeler ta fonction, alors elle n'est juste pas bien appelée.

Dans le cas où cela marche, si tu obtiens un produit NULL, il faut surement le passer en paramètre de la fonction.

Si tu reçois bien le produit, alors on vera.

Link to comment
Share on other sites

Si tu n'appelles pas ta fonction alors elle ne sera jamais exécutée.

Il faut que tu réfléchisses à quand est-ce que tu veux exécuter cette fonction (Génération de page, au clic d'un bouton, ...) et que tu trouves le controller / hook qui effectue cette action. Une fois ce dernier trouvé, tu auras une surcharge à faire de ce dernier et, dans la fonction DEJA EXISTANTE souhaitée, tu ajouteras une ligne comme : "getcatforbred();"

Link to comment
Share on other sites

Je ne parviens pas à trouver FrontController.php dans controller>front 

et pour cette surcharge il suffit aussi de recréer un fichier FrontController.php dans override>controller>front ? Il n'y à pas de class à étendre dans ce cas précis ? J’ai juste à appeler la fonction si je suis bien 

Link to comment
Share on other sites

Il est dans classes/controller/FrontController.php, en fonction de ton IDE tu peux utiliser le raccourci : double shift pour rechercher un fichier.

Pour ce qui est de la surcharge tu auras quelques de ce type : "class FrontController extends FrontControllerCore"

Le chemin pour la surcharge sera override/classes/controller/FrontController.php

Tu ajoutes juste l'appel de ta fonction à la fin du constructeur.

Link to comment
Share on other sites

Tu dois laisser le controller déjà existant et lui ajouter ton appel.

Tu auras un fonction de ce style dans ton controller.

public function __construct()
    {
        $this->controller_type = 'front';

        global $useSSL;

        parent::__construct();

        if (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')) {
            $this->ssl = true;
        }

        if (isset($useSSL)) {
            $this->ssl = $useSSL;
        } else {
            $useSSL = $this->ssl;
        }

        $this->objectPresenter = new ObjectPresenter();
        $this->cart_presenter = new CartPresenter();
        $this->templateFinder = new TemplateFinder($this->context->smarty->getTemplateDir(), '.tpl');
        $this->stylesheetManager = new StylesheetManager(
            [_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__],
            new ConfigurationAdapter()
        );
        $this->javascriptManager = new JavascriptManager(
            [_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__],
            new ConfigurationAdapter()
        );
        $this->cccReducer = new CccReducer(
            _PS_THEME_DIR_ . 'assets/cache/',
            new ConfigurationAdapter(),
            new Filesystem()
        );
        getcatforbred();
    }

 

Link to comment
Share on other sites

Ok je viens de copier l'intégralité du controlleur et j'ai rajouté ma fonction à l'emplacement excat montré ci-dessus, 

j'ai une erreur 500 coté front , en activant le mode debug j'obtiens

Fatal error: Uncaught Error: Call to undefined function getcatforbred() in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php:216 Stack trace: #0 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/controller/Controller.php(233): FrontControllerCore->__construct(false, false) #1 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/Dispatcher.php(510): ControllerCore::getController('ProductControll...') #2 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/index.php(28): DispatcherCore->dispatch() #3 {main} thrown in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php on line 216 

Link to comment
Share on other sites

image.png.4834eebeef8b0af5b0b7b789d24b5db8.png

Comme ceci ? Dans la surcharge je suppose ? 

 

 

L'erreur me retourne

Parse error: syntax error, unexpected 'class' (T_CLASS) in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php on line 35

 

 

enfaite j'avais oublié un ';' derrière la ligne l'erreur qu'on me retourne est

atal error: Uncaught Error: Call to undefined function getcatforbred() in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php:217 Stack trace: #0 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/controller/Controller.php(233): FrontControllerCore->__construct(false, false) #1 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/Dispatcher.php(510): ControllerCore::getController('ProductControll...') #2 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/index.php(28): DispatcherCore->dispatch() #3 {main} thrown in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php on line 217

Edited by thibaut33 (see edit history)
Link to comment
Share on other sites

J'ai mis

image.png.6d3cdf91afbdac2547bc8eaf772280c5.png

Dans ma surcharge , l'erreur qui me revient  est


Fatal error: Uncaught Error: Call to undefined method Tools::getcarforbred() in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php:217 Stack trace: #0 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/controller/Controller.php(233): FrontControllerCore->__construct(false, false) #1 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/Dispatcher.php(510): ControllerCore::getController('ProductControll...') #2 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/index.php(28): DispatcherCore->dispatch() #3 {main} thrown in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php on line 217

 

Edited by thibaut33 (see edit history)
Link to comment
Share on other sites

oui je viens de le refaire l'erreur est toujours : 

Fatal error: Uncaught Error: Call to undefined method Tools::getcarforbred() in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php:217 Stack trace: #0 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/controller/Controller.php(233): FrontControllerCore->__construct(false, false) #1 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/Dispatcher.php(510): ControllerCore::getController('ProductControll...') #2 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/index.php(28): DispatcherCore->dispatch() #3 {main} thrown in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php on line 217

Link to comment
Share on other sites

Personnellement ça marche pour moi, j'ai

class Tools extends ToolsCore
{
    public function getcatforbred(){
        var_dump('1');die;
        if($product){
            global $catebredcrum;
            $id_search = $product->id_product;
            $this->query = "SELECT id_category FROM ps_category_product WHERE id_product = ' . $id_search . '";
            $result = Db::getInstance()->executeS($this->query);
            $catebredcrum->assign('catearray', $result);
        }
    }
}

 

class FrontController extends FrontControllerCore
{
    public function __construct()
    {
        $this->controller_type = 'front';

        global $useSSL;

        parent::__construct();

        if (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')) {
            $this->ssl = true;
        }

        if (isset($useSSL)) {
            $this->ssl = $useSSL;
        } else {
            $useSSL = $this->ssl;
        }

        $this->objectPresenter = new ObjectPresenter();
        $this->cart_presenter = new CartPresenter();
        $this->templateFinder = new TemplateFinder($this->context->smarty->getTemplateDir(), '.tpl');
        $this->stylesheetManager = new StylesheetManager(
            [_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__],
            new ConfigurationAdapter()
        );
        $this->javascriptManager = new JavascriptManager(
            [_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__],
            new ConfigurationAdapter()
        );
        $this->cccReducer = new CccReducer(
            _PS_THEME_DIR_ . 'assets/cache/',
            new ConfigurationAdapter(),
            new Filesystem()
        );
        Tools::getcatforbred();
    }
}

 

Link to comment
Share on other sites

J'ai copié coller tout ton premier dans override>classes>tools.php

et tout ton deuxième override>classes>controller>Frontcontroller.php

j'ai vidé les caches, et j'obtiens

Fatal error: Uncaught Error: Class 'ObjectPresenter' not found in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php:22 Stack trace: #0 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/controller/Controller.php(233): FrontController->__construct(false, false) #1 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/classes/Dispatcher.php(510): ControllerCore::getController('ProductControll...') #2 /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/index.php(28): DispatcherCore->dispatch() #3 {main} thrown in /var/www/vhosts/investir-loi-ferrand-2018.com/httpdocs/override/classes/controller/FrontController.php on line 22

j'ai surement mal fait quelque chose ....

 

une fois le 'var_dump('1');die;" retiré en front j'ai

image.thumb.png.6f13f0cf256782d44292824de979dbd3.png

Edited by thibaut33 (see edit history)
Link to comment
Share on other sites

c'est fait, je n'ai rien en haut de ma fiche produit

image.thumb.png.3f78ce08d3f9f7c1a9f85942e55eac0c.png

j'ai bien vidé les caches et mon fichier override>classes> tools.php contient 

<?php
class Tools extends ToolsCore
{
    public function getcatforbred(){
		var_dump($product);die;
               if($product){
            global $catebredcrum;
            $id_search = $product->id_product;
            $this->query = "SELECT id_category FROM ps_category_product WHERE id_product = ' . $id_search . '";
            $result = Db::getInstance()->executeS($this->query);
            $catebredcrum->assign('catearray', $result);
        }
    }
}
?>

 

Link to comment
Share on other sites

Quand je mets le die dans la classe tools ça m'affiche une page blanche avec marqué 1 en haut 

Je l'ai mis en dehors de la fonction, et quand je le mets dans l'overide de la class tools en dehors de la fonction aussi ça me donne le même résultat ça prouve que l'overide est bien prise en compte 

Edited by thibaut33 (see edit history)
Link to comment
Share on other sites

Les fichiers "/var/cache/prod" et "/var/cache/dev" ont été supprimé ?

Le cache du navigateur "Ctrl + Maj + Supr" vidé ?

Voir même le cache Smarty via l'administration dans les paramètres du site vidé ?

Mode debug désactivé ? Même si je penses que oui sinon il y aurait une erreur

 

Link to comment
Share on other sites

Et avec ces code rien ne marche 🤔

<?php
class Tools extends ToolsCore
{
    public function getcatforbred(){
        var_dump($product);die;
        if($product){
            global $catebredcrum;
            $id_search = $product->id_product;
            $this->query = "SELECT id_category FROM ps_category_product WHERE id_product = ' . $id_search . '";
            $result = Db::getInstance()->executeS($this->query);
            $catebredcrum->assign('catearray', $result);
        }
    }
}

 

<?php
use PrestaShop\PrestaShop\Adapter\Configuration as ConfigurationAdapter;
use PrestaShop\PrestaShop\Adapter\ContainerBuilder;
use PrestaShop\PrestaShop\Adapter\Image\ImageRetriever;
use PrestaShop\PrestaShop\Adapter\Presenter\Cart\CartPresenter;
use PrestaShop\PrestaShop\Adapter\Presenter\Object\ObjectPresenter;
use Symfony\Component\Debug\Debug;
use Symfony\Component\Filesystem\Filesystem;

class FrontController extends FrontControllerCore
{
    public function __construct()
    {
        $this->controller_type = 'front';

        global $useSSL;

        parent::__construct();

        if (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')) {
            $this->ssl = true;
        }

        if (isset($useSSL)) {
            $this->ssl = $useSSL;
        } else {
            $useSSL = $this->ssl;
        }

        $this->objectPresenter = new ObjectPresenter();
        $this->cart_presenter = new CartPresenter();
        $this->templateFinder = new TemplateFinder($this->context->smarty->getTemplateDir(), '.tpl');
        $this->stylesheetManager = new StylesheetManager(
            [_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__],
            new ConfigurationAdapter()
        );
        $this->javascriptManager = new JavascriptManager(
            [_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__],
            new ConfigurationAdapter()
        );
        $this->cccReducer = new CccReducer(
            _PS_THEME_DIR_ . 'assets/cache/',
            new ConfigurationAdapter(),
            new Filesystem()
        );
        Tools::getcatforbred();
    }
}

 

Link to comment
Share on other sites

Ok, je penses que ce serait mieux de le réparer mais je vais te dire où ajouter tes catégories. Dans la plupart des cas, la fonction "getProducts()" située dans le fichier "src/Core/Product/Search/ProductSearchResult.php".

Tout d'abord, est-ce que si, tu ajoute directement dans cette fonction un "die('1');" au début de la fonction, as-tu une page blanche là où tu le souhaite sur le site ?

Ne pas oublier de vider le cache

Link to comment
Share on other sites

Le problème et que le breadcrumb marchait bien, jusqu'a que je décide de faire passer les marques à la place des catégories dans l'URL c'est sa qui à tout mis en l'air maintenant le breadcrumb de toutes les fiches produits affiches : ACCUEIL > PRODUIT et je voudrais remettre en place le Accueil>catégorie>sous-catégorie>produit sans rechanger les URLS ....

Je fais le test dessuite pour la fonction, et encore merci pour ton implication dans mon problème

Link to comment
Share on other sites

2 minutes ago, thibaut33 said:

Le problème et que le breadcrumb marchait bien, jusqu'a que je décide de faire passer les marques à la place des catégories dans l'URL c'est sa qui à tout mis en l'air maintenant le breadcrumb de toutes les fiches produits affiches : ACCUEIL > PRODUIT et je voudrais remettre en place le Accueil>catégorie>sous-catégorie>produit sans rechanger les URLS ....

Je fais le test dessuite pour la fonction, et encore merci pour ton implication dans mon problème

J'ai pas trop compris le problème des marques etc ? Quand tu es dans la fiche d'un produit ton url est : ACCUEIL / Categorie / Produit ?

Link to comment
Share on other sites

Pour le die il n'apparaît pas sur ma fiche produit.

Avant de changer le fonctionnement des URLS elles étaient constituées comme ceci : maboutique.com/catégorie/produit

et le breadcrumb était nickel,

J'ai ensuite fait en sorte qu'elle soit : maboutique.com/marque/produit

et depuis ça le  breadcrumb de mes fiches produits n'affiche plus les catégories/sous-catégories

 

Link to comment
Share on other sites

Je le sais, mais c'est une refonte d'un site déjà existant pour lequel on refait toute l'architecture des catégories, 

et pour garder les URLS déjà existantes sans devoir faire un livre de redirection et ne pas perdre tout le SEO j'ai mis les anciens chemins URLS grâce aux marques....

C'est pour cela que je voulais refaire tout le fonctionnement du breadcrumb

 

Edited by thibaut33 (see edit history)
Link to comment
Share on other sites

Je pense que le mieux serait quand même de mettre les catégorie.

Sinon le code que tu as mis devrait marcher si tu retourne sur la page d'accueil.

Cependant, dans mon cas je n'ai pas besoin de mes catégories sur ma fiche produit donc je n'ai pas trouvé où est-ce que le produit est récupéré, je ne peux que te donner des pistes.

 

Tout d'abord il faut trouver le controller / hook / ... qui assigne ton produit, il faut donc mettre des "die;" un peu partout (dans des controllers cohérents) et voir quand est-ce qu'ils sont pris en compte.

Après il faut faire le chemin des données jusqu'à ce que tu arrives à un "getProducts()" normalement.

Si dans ce "getProducts()" ton "die;" fonctionne alors, si ton fichier est surchargeable, on le surcharge sinon on modifie directement cette fonction ou une suivante en notant les modifications en cas de mise à jour.

Dans tout les cas tu y ajouteras un code de ce style


        foreach ($this->products as &$product){
            $categoriesList = \Product::getProductCategories($product['id_product']);
            $product['categories'] = ( \Category::getCategoryInformation($categoriesList));
        }
        return $this->products;

 

Pour les autres pages, comme dis précédemment, le fichier ProductSearchResult.php devrait marcher sur quelques-unes minnimum.

Ne pas oublier de faire un "$product->update();" au besoin

Edited by JulienPct (see edit history)
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...