Jump to content

Blocksearch - faire une recherche dans les catégories


Recommended Posts

Bonjour à tous, voici mon premier post sur Prestashop et j'espere qu'il ne soit pas le dernier :D

 

Je ne suis pas programmeur  je suis juste un bidouilleur du dimanche et il y a un problème auquel je n'y arrive pas et c'est au dessus de mes connaissances. Et ça me rend fou !!

 

Je souhaiterais savoir si cela serait possible que le module BLOCKSEARCH fasse une recherche dans les catégories et non dans les produits?

 

J'ai essayer de chercher dans le fichier class/search.php d'apres un tuto que j'ai trouvé sur internet qui permettait à ce que le module de recherche puisse chercher dans les déclinaisons des fiches de produits, mais je n'ai pas réussit à modifier pour qu'il cherche dans les catégories, ça demande du code SQL et la je suis perdu.

 

Es que quelqu'un aurait une idée ?

 

Merci à vous pour vos réponses

 

 

Link to comment
Share on other sites

Bonjour,

Normalement il faudrait faire un override de SearchController pour ne pas modifier le core.

 

La modification porterait directement sur la classe search ?

 

C'est possible mais après le controller attend des liens vers des produits pas vers des catégories (d'ou préférence pour l'override).

 

Pour le sql :

 

$sql ="SELECT id_category, name, description,link_rewrite
FROM `"._DB_PREFIX_."category_lang`
WHERE id_shop=$id_shop, id_lang=$id_lang, name like '%$search%'"

 

Il faut obtenir l'id_shop et id_lang et faire attention à la recherche qui peut ouvrir une très grosse faille de sécurité (sql injection).

Limite la recherche a des lettres et chiffres et à aucun autre caractère.

 

Bon développement

Link to comment
Share on other sites

Salut Math_php !  Merci pour ta réponse ,c'est cool de ta part de prendre du temps et reflechir sur mon problème.

 

Tu as raison pour l'override afin de ne pas modifier le core. Ceci dit ton code SQL je ne sais pas où exactement l'inserer car sur le tuto il demande de modfier seulement ces 2 lignes pour affiner la recherche:

 

Dans ce nouveau fichier Search.php, à la ligne 344 vous verrez la fonction getAttributes qu’il faut modifier.

 

Remplacez la ligne 351 : SELECT al.name FROM '._DB_PREFIX_.'product_attribute pa
par : SELECT al.name, pa.ean13, pa.reference, pa.upc FROM '._DB_PREFIX_.'product_attribute pa

 

Puis remplacez la ligne 357 : $attributes .= $attribute['name'].' ‘;
par : $attributes .= $attribute['name'].' '.$attribute['ean13'].' '.$attribute['reference'].' '.$attribute['upc'].' ‘;

 

Es qu'il y a une possibilité d'inserer une partie de ton code dans ces deux lignes ?

 

 

Merci encore

Link to comment
Share on other sites

La solution que j'avais choisi c'était de laisser la recherche récupérer les réponses dans les produits et de rajouter mes résultats à ces réponses. On peut également supprimer les réponses 'produits'

 

Override de SearchController.php :

<?php
class SearchController extends SearchControllerCore
{
    public function initContent()
    {
               if ($this->ajax_search)
        {
                        $query = Tools::replaceAccentedChars(urldecode(Tools::getValue('q')));
            $searchResults = Search::find((int)(Tools::getValue('id_lang')), $query, 1, 10, 'position', 'desc', true);
            foreach ($searchResults as &$product)
                $product['product_link'] = $this->context->link->getProductLink($product['id_product'], $product['prewrite'], $product['crewrite']);
                        
                        // Ici je complète avec mes réponses
                  $sql ="SELECT id_category, name, description,link_rewrite
                                    FROM `"._DB_PREFIX_."category_lang`
                                   WHERE id_shop=$id_shop, id_lang=$id_lang, name like '%$query%'"
 
                    $categories = Db::getInstance()->executeS($sql);
                        foreach ($categories as $category){
                            $searchResults[] = array('id_product' => '' , 'pname' =>$category['description'], 'cname' => $category['name'] , 'crewrite'=>'' ,'prewrite' =>'',
                            'product_link'=>  $lien_vers_category);
                        }
            die(Tools::jsonEncode($searchResults));
        }
                parent::initContent();
        }
}

Attention $query n'est pas du tout sécurisé.

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

Je sais pas si c'est moi qui est fait une mauvaise manipe, mais du coup je reçois une page blanche.

J'ai remplacer  le code ci-dessous du fichier SearchController.php par ton code est ça passe pas, encore une fois je m'excuse mais je suis qu'un bidouilleur du dimanche  :blush:

<?php
class SearchControllerCore extends FrontController
{
	public $php_self = 'search';
	public $instant_search;
	public $ajax_search;

	/**
	 * Initialize search controller
	 * @see FrontController::init()
	 */
	public function init()
	{
		parent::init();

		$this->instant_search = Tools::getValue('instantSearch');

		$this->ajax_search = Tools::getValue('ajaxSearch');

		if ($this->instant_search || $this->ajax_search)
		{
			$this->display_header = false;
			$this->display_footer = false;
		}
	}
Link to comment
Share on other sites

Bah c'est ce que j'ai fais au début  mais c 'est comme si que le override n'est pas pris en compte ou peut être que ça le prend en compte mais ça n'affiche pas les catégories :(

 

Es que ça marche chez toi ? si tu veux je peux te passer l'url du site pour que tu puisses jeter un coup d'oeil on sait jamais

 

En tout cas merci encore, ça fait plaisir de voir que la solidarité existe toujours :D

Link to comment
Share on other sites

Bonjour,
Je me permet de participer à votre sujet car je me pose le même genre de question, est il possible d'inclure les pages de CMS dans les résultats de recherche, en plus des produits ?

Est ce également une requête SQL à modifier ?

 

Si quelqu'un à une astuce ce serait vraiment avec plaisir.

Bonne journée

 

Rom

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

Merci pour ta réponse,

Idéalement je souhaite rechercher dans les titres et dans les contenus de mes pages CMS.

J'aimerai que les résultats s'affichent en plus des résultats de produits par défaut.

 

J'utilise la version 1.4.9.0

Link to comment
Share on other sites

Salut Presta,

Oui j'ai repéré quelques modules qui pourraient faire l'affaire, mais ils sont trop sophistiqués pour mes besoins, je voulais simplement retourner une liste de page CMS en plus des produits... Mais je trouve ça super frustrant de ne pas pouvoir le faire moi même.

 

Comme tu le dis si bien, mes compétences semblent limitées, je pensais que quelqu'un sur ce forum, aurait une astuce ou une piste pour m'aider à modifier ce module. J'ai du mal à croire qu'il faille obligatoirement en passer par un module.

 

Sinon j'ai bien repéré cette astuce : http://www.prestashop.com/forums/topic/123487-recherche-rapide-et-page-cms/

Mais elle ne permet d'afficher qu'un champ de recherche spécifique aux pages CMS.

J'en passerai par là si besoin mais c'est un gros frein pour ma boutique et l'importance des pages CMS de mon site.

 

Tu as réussi à modifier ta recherche pour catégories ?

Link to comment
Share on other sites

Bon alors ça marche ou quoi :)

 

@Presta260 : le code indiqué c'est pour un override, c'est pas pour remplacer le code du SearchController.

Si tu as un doute sur le fait que l'override est exécuté, mets des

 

var_dump('youpi');

Ca pertube l'affichage et/ou les requetes ajax et ça permet de savoir si effectivement ton code est exécuté.

Idem que pour pecheur suivant les versions de prestashop, le  code présente des variations, donc c'est difficile de livrer pour un code inconnu surtout si tu veux pas faire d'override ;)

 

@Pecheur : c'est pas que je veuille pas t'aider mais il faudrait que j'installe un 1.4.9 pour travailler, puis créer des cms... juste pour avoir un environnement ou tester.

 

Au total il faudrait fournir votre fichier SearchController.php pour que je puisse vous faire l'override.

  • Like 1
Link to comment
Share on other sites

Salut Math_php !! ça fait plaisir de te revoir parmis nous ..

 

Même avec des var_dump('youpi'); ça ne perturbe rien dutout, le override n'est donc pas pris en compte, es que c'est normale ?

 

 

@Pecheur

Comme tu peux le voir je n'ai toujours pas de solution parcontre il peux avoir une alternative, c'est de dupliquer tous mes produits et inserer le nom des catégories dans la référence produits (un peu barbare mais ça marche).

Et oui c'est frustrant de pas pour y remédier soit même :(

 

 

Sinon je sais pas si cela peut t'aider, mais dans le lien que tu m'a envoyé, la personne explique clairement qu'elle souhaite séparer le champ de recherche des CMS des pages CMS en modifiant CMSController.php . Es que tu as essayer de refaire ça manipe sans modifier ce fichier ?

Link to comment
Share on other sites

@pecheur : J'ai pas de 1.4 qui tourne donc j'ai pas pu tester mais tu peux essayer ça dans ton SearchController

 

Le code ci dessous entre ajaxSearch et Die

 

if ($this->ajaxSearch)
        {
            self::$link = new Link();
            $searchResults = Search::find((int)Tools::getValue('id_lang'), $query, 1, 10, 'position', 'desc', true);
            foreach ($searchResults as &$product)
                $product['product_link'] = self::$link->getProductLink($product['id_product'], $product['prewrite'], $product['crewrite']);
            die(Tools::jsonEncode($searchResults));

 

Doit ressembler après modif à ça :

 

if ($this->ajaxSearch)
        {
            self::$link = new Link();
            $searchResults = Search::find((int)Tools::getValue('id_lang'), $query, 1, 10, 'position', 'desc', true);
            foreach ($searchResults as &$product)
                $product['product_link'] = self::$link->getProductLink($product['id_product'], $product['prewrite'], $product['crewrite']);
            //--------------------------------------
            // Ajout recherche dans les cms à vos risques et périls.
            if (ValidateCore::isName($query)){
                $more_search = Db::getInstance()->executeS("SELECT * FROM `"._DB_PREFIX_."cms_lang`
                where id_lang=".(int)(Tools::getValue('id_lang'))."
                and (content like '%$query%' or meta_title like'%$query%')");
                            
                    foreach ($more_search as $cms){
                        $searchResults[] = array('id_product' => '' , 'pname' =>$cms['meta_title'], 'cname' => $cms['meta_description'] , 'crewrite'=>'' ,'prewrite' =>'',
                    'product_link'=> $base.__PS_BASE_URI__.'cms.php?id_cms='.$cms['id_cms'] );
                    }
                    
                }
            
            //--------------------------------------
            die(Tools::jsonEncode($searchResults));

Sauvegarde ton fichier avant modif. C'est pas un override mais ça pourrait en être un.

En espérant que la structure Json est la même.

 

@Presta260 : pas de bol, mais la programmation c'est ça, le premier bout de code que je t'avais transmis était pour du 1.5 et pas pour ton 1.4, ça ne pouvait pas marcher. ;)

  • Like 1
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...