Bonjour,
Ayant besoin d'une recherche spécifique pour une boutique (en fonction d'une durée, d'une thématique et d'une date), j'ai voulu créer un module de recherche custom basé sur le module ps_searchbar (PrestaShop 1.7.6), que j'ai nommé "search"
Voici donc le code de ce module, on commence par search.php :
if (!defined('_PS_VERSION_')) { exit; } class Search extends Module{ public function __construct(){ $this->author = 'kernix'; $this->name = 'search'; $this->version = '0.1.0'; $this->need_instance = 0; parent::__construct(); $this->context = Context::getContext(); $this->displayName = 'Barre de recherche'; $this->description = 'Gestion de la barre de recherche en haut de page'; $this->confirmUninstall = 'Êtes-vous sûr de vouloir désinstalelr ce module ?'; } public function install(){ return parent::install() && $this->registerHook('displayHeader') && $this->registerHook('displayTop') && $this->registerHook('displayHome'); } public function uninstall(){ return parent::uninstall() && $this->unregisterHook('displayHeader') && $this->unregisterHook('displayTop') && $this- >unregisterHook('displayHome'); } public function hookHeader(){ $this->page_name = Dispatcher::getInstance()->getController(); if ($this->page_name == 'index') { $this->_assignMedia(); } } protected function _assignMedia(){ $this->context->controller->addCss(($this->_path) . 'views/css/search-filter.css'); } public function hookDisplayHome(){ $type = Feature::getFeature($this->context->language->id, 1); $duration = Feature::getFeature($this->context->language->id, 3); $typeList = FeatureValue::getFeatureValuesWithLang($this->context->language->id, 1); $durationList = FeatureValue::getFeatureValuesWithLang($this->context->language->id, 3); $typeSelected = Tools::getValue('type'); $durationSelected = Tools::getValue('duration'); $arrival = Tools::getValue('arrival'); $this->context->smarty->assign([ 'type_selected' => $typeSelected, 'type_list' => $typeList, 'duration_selected' => $durationSelected, 'duration_list' => $durationList, 'arrival' => $arrival, ]); return $this->display(__FILE__, 'search-filter.tpl'); } }
Et enfin mon template :
<!-- Block search filter --> <div id="search-filter"> <div class="container"> <section class="search-toolbar"> <form method="get" action="{$link->getPageLink('search', true)|escape:'html'}" id="advancedsearchform"> <input type="hidden" name="controller" value="search"> <div class="flex"> <div class="fields"> <div class="form-group"> <label for="type">Envie</label> <div class="form-select"> <select class="form-control selectpicker" name="type" id="type"> <option value=""> ------ </option> {foreach from=$type_list key=id_feature_value item=attribute} <option value="{$attribute.id_feature_value|intval}" {if ($type_selected === $attribute.id_feature_value)} selected="selected"{/if}> {$attribute.value}</option> {/foreach} </select> </div> </div> <div class="form-group"> <label for="duration">Durée</label> <div class="form-select"> <select class="form-control selectpicker" name="duration" id="duration"> <option value=""> ------ </option> {foreach from=$duration_list key=id_feature_value item=duration} <option value="{$duration.id_feature_value|intval}" {if ($duration_selected === $duration.id_feature_value)} selected="selected"{/if}> {$duration.value}</option> {/foreach} </select> </div> </div> <div class="form-group"> <div class="form-date"> <label for="start_date">Arrivée</label> <input class="form-control" type="date" value="{$arrival}" placeholder="2019-08-19" name="arrival" id="arrival"> </div> </div> </div> <div class="actions"> <input type="hidden" name="s" value="*"> <button class="btn-search form-control" type="submit"> <i class="icon-loupe"></i> <span>Rechercher</span> </button> </div> </div> </form> </section> </div> </div> <!-- /Block search filter -->
De ce que j'ai compris on a besoin que de ces deux fichiers, le reste étant gérer par le controller Search. Maintenant, lorsque je fais ma recherche mes paramètres sont biens envoyés et je tombe sur la bonne url, telle que :
http://localhost/fr/recherche?controller=search&type=6&duration=&arrival=&s=*
Mais je tombe sur l'erreur citée dans le titre. J'ai suivi tout le chemin de ma requête dans le code, tout a l'air bon. L'erreur provient de l'appel de la fonction find de Search dans le fichier src/Adapter/Search/SearchProductSearchProvider.php. J'ai essayé pas mal de choses mais rien n'y fait... Si quelqu'un aurait une idée ou déjà tenté ce genre de chose.
J'ai également remarquer un comportement étrange : Si j'active le module de base ps_searchbar ainsi que mon module search, je me tape cette erreur a chaque fois dès que je tente d'accèder a l'URL recherche, cependant si je désactive mon module, je peux utiliser ps_searchbar pour faire mes recherches tout à fait normalement. Mon module seul ne marche pas, le problème vient donc de lui.
Merci d'avance.