THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,
après quelques essais sur ce module de recherche avancée et installation nickel
je ne trouve pas le moyen de le faire fonctionner, aucun chargement en ajax
une idée du problème

Cela affiche et liste les features (caractéristiques) ainsi que la boucle feature-availability qui retourne bien les résultats
donc tout va bien, mais quand on coche une case
rien ne se passe

toute l'explication est ici http://thelia-school.com/?view=content& … ntent_id=5
le code à placer dans la page category.html

{* Si la boucle features retourne des résultats *}
{ifloop rel="features"}
    <h2>{intl l="Moteur de recherche"}</h2>
    <div class="well clearfix" id="advanced-search-engine">
       {* On liste les features (caractéristiques) *}
       {loop name="features" type="feature"}
           {* Si la boucle feature-availability retourne des résultats *}
           {ifloop rel="feature-availability"}
               <div class="feature-group col-lg-2">
                   <h3 class="feature-title" data-feature-id="{$ID}">{$TITLE}</h3>
                       <ul class="list-unstyled">
                           {* Pour chaque features, on liste les feature-availability (valeurs de caractéristique) associées *}
                           {loop name="feature-availability" type="feature-availability" feature="$ID"}
                           <li>
                               <label for="feature-{$ID}">
                                   <input id="feature-{$ID}" type="checkbox" name="feature-availability[]" value="{$ID}" class="feature-values"/> {$TITLE}
                               </label>
                           </li>
                           {/loop}
                       </ul>
               </div>
           {/ifloop}
       {/loop}
    </div>
{/ifloop} 

le code script toujours dans la page category.html en fin de ligne

{block name="javascript-initialization"}
{*hook name="category.javascript-initialization"*}
    <script>
        jQuery(function($){

            // Quand une case à cocher change d'état, on lance la recherche
            $('.feature-values').on('change', function(){
                reloadSearch();
            });

            // Fonction de recherche
            function reloadSearch(){

                var searchArgs = [], // Tableau qui va stocker la recherche
                featureAvailabilityList = ''; // Liste des valeurs de caractéristique qui seront demandées

                // Pour chaque caractéristique
                $('.feature-group').each(function(){

                // On stock l'id de la caractéristique
                var category = $('.feature-title', $(this)).data('feature-id');

                // On stock les valeurs de caractéristique cochées
                var $checkedValues = $('.feature-values:checked', $(this));

                // On remplit un tableau avec les valeurs de caractéristiques
                var values = [];
                $checkedValues.each(function(){
                    values.push($(this).val());
                });

                // On remplit un tableau associatif contenant l'id de la caractéristique et les valeurs associées
                var featureCouple = [];
                featureCouple['feature-category'] = category;
                featureCouple['feature-values'] = values;

                // On remplit le tableau de recherche
                searchArgs.push(featureCouple);

            });

            // Pour chaque couple (caractéristique + valeurs) présents dans la recherche
            $.each(searchArgs, function(k, v){

                var category = v['feature-category'];

                /*
                * On join toutes les valeurs de caractéristque avec un pipe
                * pour que le format correspondent au format attendu par la boucle
                */
                var valuesList = v['feature-values'].join("|");

                /*
                * Si la liste n'est pas vide on lui ajoute une virgule de fin pour qu'elle puisse être concaténée
                * avec une autre liste (<carac1:valeur1,valeur2>,<carac2:valeur1,valeur2>,)
                */
                if(category != '' && valuesList != ''){
                    featureAvailabilityList += category + ":" + valuesList + ",";
                }

            });

            // On supprime la virgule de fin qui ne sert à rien dans notre liste finale
            featureAvailabilityList = featureAvailabilityList.substring(0,featureAvailabilityList.length-1);

            /*
            * On charge la vue ajax de notre liste de produit en lui passant la liste des caractéristiques
            * correspondant à la recherche de l'utilisateur
            */
            //$('#category-products').load(
            /*    '/product/ajaxList',
            *   {literal}
            *    {
            *        featureAvailabilityList: featureAvailabilityList
            *    }
            *   {/literal}
            *);  */

		// On assigne à nos variable les valeurs correspondantes

		// On assigne à nos variable les valeurs correspondantes
var limit = "{$limit}",
page = "{$product_page}",
order = "{$product_order}",
categoryId = "{category attr="id"}";

// On passe ces nouvelles variables à notre requete ajax
$('#category-products').load(
    '/product/ajaxList',
    {literal}
    {
        limit: limit,
        page: page,
        order: order,
        categoryId : categoryId,
        featureAvailabilityList: featureAvailabilityList
    }
    {/literal}
); 
			

// Récupération des nouvelles variables pour le bon fonctionnement de la boucle
$limit = $this->getRequest()->get('limit');
$order = $this->getRequest()->get('order');
$page = $this->getRequest()->get('page');
$categoryId = $this->getRequest()->get('categoryId');

// On remplit notre tableau d'arguments
$args = array(
    'limit' => $limit,
    'product_order' => $order,
    'product_page' => $page,
    'categoryId' => $categoryId,
    'featureAvailabilityList' => $featureAvailabilityList
);


        });
    </script>
{/block}

Last edited by stephst84 (26-06-2019 09:39:54)

Offline


quand on coche une case rien ne se passe

Des erreurs javascript dans la console du navigateur ?


OpenStudio Toulouse

Offline


Oui
une ou plusieurs cases cochées pas de recherche

Les erreurs console du navigateur

SyntaxError: expected expression, got 
L’attribut « content » des objets Window est obsolète. Veuillez utiliser « window.top » à la place.
onmozfullscreenchange est obsolète.
onmozfullscreenerror est obsolète.

Offline


SyntaxError: expected expression, got

Tu as ta réponse.

Une erreur de syntaxe dans le javascript de la page (pas forcément celui du module !) empêche le rafraîchissement de la page. Normalement le navigateur te donne un numéro de ligne, tu va pouvoir savoir où est le problème exactement.


OpenStudio Toulouse

Offline


Pas de numéro de ligne
je vais le réimplanter

Offline


Si si, il y en a un. La console d'un navigateur décent (chrome, firefox) te donne la ligne ou se trouve l'erreur.


OpenStudio Toulouse

Offline


la ligne ou est détectée l'erreur

// Récupération des nouvelles variables pour le bon fonctionnement de la boucle
$limit = $this->getRequest()->get('limit');

le code du script complet

    <script>
        jQuery(function($){

            // Quand une case à cocher change d'état, on lance la recherche
            $('.feature-values').on('change', function(){
                reloadSearch();
            });

            // Fonction de recherche
            function reloadSearch(){

                var searchArgs = [], // Tableau qui va stocker la recherche
                featureAvailabilityList = ''; // Liste des valeurs de caractéristique qui seront demandées

                // Pour chaque caractéristique
                $('.feature-group').each(function(){

                // On stock l'id de la caractéristique
                var category = $('.feature-title', $(this)).data('feature-id');

                // On stock les valeurs de caractéristique cochées
                var $checkedValues = $('.feature-values:checked', $(this));

                // On remplit un tableau avec les valeurs de caractéristiques
                var values = [];
                $checkedValues.each(function(){
                    values.push($(this).val());
                });

                // On remplit un tableau associatif contenant l'id de la caractéristique et les valeurs associées
                var featureCouple = [];
                featureCouple['feature-category'] = category;
                featureCouple['feature-values'] = values;

                // On remplit le tableau de recherche
                searchArgs.push(featureCouple);

            });

            // Pour chaque couple (caractéristique + valeurs) présents dans la recherche
            $.each(searchArgs, function(k, v){

                var category = v['feature-category'];

                /*
                * On join toutes les valeurs de caractéristque avec un pipe
                * pour que le format correspondent au format attendu par la boucle
                */
                var valuesList = v['feature-values'].join("|");

                /*
                * Si la liste n'est pas vide on lui ajoute une virgule de fin pour qu'elle puisse être concaténée
                * avec une autre liste (<carac1:valeur1,valeur2>,<carac2:valeur1,valeur2>,)
                */
                if(category != '' && valuesList != ''){
                    featureAvailabilityList += category + ":" + valuesList + ",";
                }

            });

            // On supprime la virgule de fin qui ne sert à rien dans notre liste finale
            featureAvailabilityList = featureAvailabilityList.substring(0,featureAvailabilityList.length-1);

            /*
            * On charge la vue ajax de notre liste de produit en lui passant la liste des caractéristiques
            * correspondant à la recherche de l'utilisateur
            */
            //$('#category-products').load(
            /*    '/product/ajaxList',
            *   {literal}
            *    {
            *        featureAvailabilityList: featureAvailabilityList
            *    }
            *   {/literal}
            *);  */

		// On assigne à nos variable les valeurs correspondantes
var limit = "{$limit}",
page = "{$product_page}",
order = "{$product_order}",
categoryId = "{category attr="id"}";

// On passe ces nouvelles variables à notre requete ajax
$('#category-products').load(
    '/product/ajaxList',
    {literal}
    {
        limit: limit,
        page: page,
        order: order,
        categoryId : categoryId,
        featureAvailabilityList: featureAvailabilityList
    }
    {/literal}
); 
			

// Récupération des nouvelles variables pour le bon fonctionnement de la boucle
$limit = $this->getRequest()->get('limit');
$order = $this->getRequest()->get('order');
$page = $this->getRequest()->get('page');
$categoryId = $this->getRequest()->get('categoryId');

// On remplit notre tableau d'arguments
$args = array(
    'limit' => $limit,
    'product_order' => $order,
    'product_page' => $page,
    'categoryId' => $categoryId,
    'featureAvailabilityList' => $featureAvailabilityList
);


        });
    </script>

et pour info le script original tiré de la doc ne fonctionne pas pour ma situation http://thelia-school.com/?view=content& … ntent_id=5
j'ai ajouté une balise supplémentaire pour le faire recharger mais avec un fonctionnement bizarre dans la recherche des produits

  }});
    </script>

Last edited by stephst84 (22-06-2019 09:52:26)

Offline


Ce code est du code PHP. Il ne doit pas être placé dans un template HTML, car il ne n'est pas interprété. Il cause donc une erreur de syntaxe Javascript.

// Récupération des nouvelles variables pour le bon fonctionnement de la boucle
$limit = $this->getRequest()->get('limit');
$order = $this->getRequest()->get('order');
$page = $this->getRequest()->get('page');
$categoryId = $this->getRequest()->get('categoryId');

// On remplit notre tableau d'arguments
$args = array(
    'limit' => $limit,
    'product_order' => $order,
    'product_page' => $page,
    'categoryId' => $categoryId,
    'featureAvailabilityList' => $featureAvailabilityList
);

Dans un template, tu peux mettre du code Smarty, du HTML, CSS, JavaScript, ..., mais pas de code PHP.

Tu espérais que ça fasse quoi, en fait ?


OpenStudio Toulouse

Offline


merci pour ta réponse mais je m'en suis aperçu qu'il provoquait des erreurs, donc je l'avais enlevé avant ou après ce post ; d'après ce que j'ai lu il sert à faire remonter des infos concernant  les produits que l'on recherche fonction de certaines caractéristiques que le client coche => variables dans la vue grâce à notre controller.

Offline


Pour résumer, j'ai essayé d'implanter la recherche multi-select soit en insérant la recherche advanced search avec le tuto en ligne moteur-de-recherche-multicriteres-thelia/creation-du-module.html ou avec le module complet via git, je n'arrive pas à le faire fonctionner correctement

1) le tuto en ligne c'est le problème décrit avant ce post, il me plaisait bien pour le mettre en place par sa légèreté de code et son principe de fonctionnement pour le client final
Quand j'arrive à le faire fonctionner, il me trouve systématiquement 12 produits et quand on clique *show* pour afficher les produits par quantité de 12 par page, il me trouve 5 produits systématiquement quelque soit les caractéristiques cochées sachant que j'ai placé des caractéristiques unique et équivalente pour certains produits

2) le module complet advancedsearch
par exemple la toolbar ne se surchage pas en lieu et place de la toolbar présente dans la page category.html

Peut-être auriez-vous un début pour aboutir à un fonctionnement cohérent de ce moteur avancé ?
Je vous remercie par avance

Last edited by stephst84 (26-06-2019 09:34:51)

Offline


Finalité j'ai installé criteria search qui avait quelques soucis de fonctionnement et de recherche au démarrage,
l'autre module n'a jamais voulu fonctionner
même que dans la console du navigateur ne remontait aucune erreur
vraiment bizarre
après vidage des caches de thelia et réinstallation du module criteria cela fonctionne avec une recherche adaptée

Last edited by stephst84 (26-06-2019 09:37:04)