Jump to content

Lister des produits en "simulant" une recherche dans un module


HeineFR

Recommended Posts

Bonjour tout le monde,

J'ai actuellement sur un prestashop 1.7.5.1 un module de glossaire qui marche parfaitement en créant des infobulles des définitions sur les termes de mes fiches produits avec un lien vers la page du terme du glossaire.

Je souhaite modifier ce module pour que les pages des terme du glossaires ne soient pas aussi vides en listant en dessous les produits de mon catalogue qui contiennent le mot clé du glossaire.

Ma question est donc :

Pour pouvoir utiliser mon template de listing de produit avec la boucle {foreach from=$listing.products item="product"} comme pour une catégorie, comment initialiser une recherche et charger ma variable $listing.products ?

Je suis preneur de toute piste me permettant d'avancer.

Merci.

 

Link to comment
Share on other sites

Résolu par moi même, je poste quand même ce que j'ai fait si cela peut aider quelqu'un ultérieurement.

En me basant sur le module des produits également achetés j'ai :

Rajouté l'appel de la fonction que j'ai crée dans la fonction Init du module :

$products = $this->getProductsWithItem($item->name);
$this->context->smarty->assign(array('products' => $products));

Rajouté la fonction qui effectue la recherche dans la description du produit pour récupérer les ID des produits et construire les variables du produit

    protected function getProductsWithItem($itemword)
    {
        $item_products = 'SELECT pl.id_product
        FROM ' . _DB_PREFIX_ . 'product_lang pl
        LEFT JOIN ' . _DB_PREFIX_ . 'product p ON (pl.id_product = p.id_product)
        WHERE p.active = 1
        AND pl.description LIKE \'%'.$itemword.' %\' LIMIT 0, 15';

        $products_found = Db::getInstance((bool) _PS_USE_SQL_SLAVE_)->executeS($item_products);

        if (0 < count($products_found)) {
            $showPrice = true;

            $assembler = new ProductAssembler($this->context);

            $presenterFactory = new ProductPresenterFactory($this->context);
            $presentationSettings = $presenterFactory->getPresentationSettings();
            $presenter = new ProductListingPresenter(
                new ImageRetriever(
                    $this->context->link
                ),
                $this->context->link,
                new PriceFormatter(),
                new ProductColorsRetriever(),
                $this->context->getTranslator()
            );

            $productsForTemplate = [];

            $presentationSettings->showPrices = $showPrice;

            if (is_array($products_found)) {
                foreach ($products_found as $productId) {
                    $productsForTemplate[] = $presenter->present(
                        $presentationSettings,
                        $assembler->assembleProduct(['id_product' => $productId['id_product']]),
                        $this->context->language
                    );
                }
            }
            return $productsForTemplate;
        }
        

        return false;
    }

Rajouté dans mon template :

   {if isset($products) }
        <div id="products">   
            <div class="products row"> 
                {foreach from=$products item="product"}
                    {include file="catalog/_partials/miniatures/product.tpl" product=$product}
                {/foreach}
            </div>
        </div>
   {/if}


 

  • Like 1
Link to comment
Share on other sites

Salut,

j'ai pas testé mais si c'est en 1.7, un truc du style ne te retourne pas les produits ?

use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery;
    public function getProductSearchQuery($searchString)
    {
        $query = new ProductSearchQuery();
        $query
            ->setSortOrder(new SortOrder('product', 'position', 'desc'))
            ->setSearchString($searchString)

        return $query;
    }

 

Edited by Mediacom87 (see edit history)
  • Like 1
Link to comment
Share on other sites

J'ai testé vite fait avant de quitter le bureau :

Il a fallut que je fasse appel à setSortOrder et que je rajoute un petit ; de fin de ligne mais je n'ai aucun résultat de retourné 😕

il faut que je farfouille la classe ProductSearchQuery

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...