THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

J'essai d'utiliser Text search arguments dans la boucle category
j'ai besoin d'un search_mode='any_word'

        {loop type="category" name="search_categoy" search_in="title" search_mode="any_word" search_term=$search}
              {$ID}
        {/loop}

mais j'obtiens cette erreur

PDOException in StatementWrapper.php line 196: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Array' ORDER BY category.POSITION ASC LIMIT 2147483647' at line 1
    in StatementWrapper.php line 196
    at PDOStatement->execute(null) in StatementWrapper.php line 196
    at StatementWrapper->execute() in Criteria.php line 2436
    at Criteria->doSelect(object(ConnectionWrapper)) in ModelCriteria.php line 1821
    at ModelCriteria->doSelect(object(ConnectionWrapper)) in ModelCriteria.php line 975
    at ModelCriteria->find() in BaseLoop.php line 435
    at BaseLoop->searchWithOffset(object(CategoryQuery)) in BaseLoop.php line 358
    at BaseLoop->search(object(CategoryQuery), null) in BaseLoop.php line 519
    at BaseLoop->exec(null) in TheliaLoop.php line 156
    at TheliaLoop->theliaLoop(array('type' => 'category', 'name' => 'search_categoy', 'search_in' => 'title', 'search_mode' => 'any_word', 'search_term' => 'produit test'), null, object(Smarty_Internal_Template), true) in smarty_internal_templatebase.php(171) : eval()'d code line 298
    at content_5888c143b24b98_17487321(object(Smarty_Internal_Template)) in smarty_internal_templatebase.php line 188
    at Smarty_Internal_TemplateBase->fetch('file:search.html') in SmartyParser.php line 371
    at SmartyParser->internalRenderer('file', 'search.html', array(), true) in SmartyParser.php line 395
    at SmartyParser->render('search.html') in ViewListener.php line 69
    at ViewListener->onKernelView(object(GetResponseForControllerResultEvent), 'kernel.view', object(ContainerAwareEventDispatcher))
    at call_user_func(array(object(ViewListener), 'onKernelView'), object(GetResponseForControllerResultEvent), 'kernel.view', object(ContainerAwareEventDispatcher)) in EventDispatcher.php line 181
    at EventDispatcher->doDispatch(array(array(object(ViewListener), 'beforeKernelView'), array(object(ViewListener), 'onKernelView')), 'kernel.view', object(GetResponseForControllerResultEvent)) in EventDispatcher.php line 46
    at EventDispatcher->dispatch('kernel.view', object(GetResponseForControllerResultEvent)) in HttpKernel.php line 144
    at HttpKernel->handleRaw(object(Request), '1') in HttpKernel.php line 62
    at HttpKernel->handle(object(Request), '1', true) in TheliaHttpKernel.php line 76
    at TheliaHttpKernel->handle(object(Request), '1', true) in ParamInitMiddleware.php line 87
    at ParamInitMiddleware->handle(object(Request), '1', true) in SessionMiddleware.php line 80
    at SessionMiddleware->handle(object(Request), '1', true) in StackedHttpKernel.php line 23
    at StackedHttpKernel->handle(object(Request), '1', true) in Kernel.php line 185
    at Kernel->handle(object(Request)) in index_dev.php line 40

un idee ?

Merci

Offline

Offline


Ok Merci Roadster31

Offline


Bonjour,

j'essaie de corriger l'erreur
je pense que l'on ne peut pas utiliser dans la requete  'IN'
car cela va rechercher, pour un titre par exemple, si tout le titre correspond a une des valeurs

du coup j'utilise REGEXP mais qui ne correspond pas tout a fait au mode 'any_word'

je propose pour la boucle product

    public function doSearch(&$search, $searchTerm, $searchIn, $searchCriteria)
    {
        $search->_and();
        foreach ($searchIn as $index => $searchInElement) {
            if ($index > 0) {
                $search->_or();
            }
            switch ($searchInElement) {
                case "ref":
                    $search->filterByRef($searchTerm, $searchCriteria);
                    break;
                case "title":

                    if($searchCriteria == Criteria::IN) {
                        $search->where(
                          "CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) 
                          THEN `requested_locale_i18n`.`TITLE` 
                          ELSE `default_locale_i18n`.`TITLE` 
                          END REGEXP '". implode('|', $searchTerm)."'", 
                          '', 
                          \PDO::PARAM_STR
                        );
                    }
                    else {
                        $search->where(
                          "CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) 
                          THEN `requested_locale_i18n`.`TITLE` 
                          ELSE `default_locale_i18n`.`TITLE` 
                          END " . $searchCriteria . ' ?', 
                          $searchTerm, 
                          \PDO::PARAM_STR
                        );
                    }
                    break;
            }
        }
    }

si le code n'est pas trop catastrophique je ferai une PR

Offline


Si tu utilises regexp, il faut echapper les caractères significatifs, comme (, ), *, ?, [ et ], etc.


OpenStudio Toulouse

Offline


En fait j'ai utilise RLIKE
mais je ne sais pas s'il est compatible autre que MySql

Offline


modifié comme suite

    public function doSearch(&$search, $searchTerm, $searchIn, $searchCriteria)
    {
        $search->_and();
        foreach ($searchIn as $index => $searchInElement) {
            if ($index > 0) {
                $search->_or();
            }
            switch ($searchInElement) {
                case "ref":
                    $search->filterByRef($searchTerm, $searchCriteria);
                    break;
                case "title":

                    if($searchCriteria == Criteria::IN) {
                        $search->where(
                          "CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) 
                          THEN `requested_locale_i18n`.`TITLE` 
                          ELSE `default_locale_i18n`.`TITLE` 
                          END REGEXP" . ' ?', 
                          implode('|', $searchTerm), 
                          \PDO::PARAM_STR
                        );
                    }
                    else {
                        $search->where(
                          "CASE WHEN NOT ISNULL(`requested_locale_i18n`.ID) 
                          THEN `requested_locale_i18n`.`TITLE` 
                          ELSE `default_locale_i18n`.`TITLE` 
                          END " . $searchCriteria . ' ?', 
                          $searchTerm, 
                          \PDO::PARAM_STR
                        );
                    }
                    break;
            }
        }
    }

Last edited by zzuutt (08-02-2017 13:45:33)