THELIA Forum

Welcome to the THELIA support and discusssion forum

Offline

#1 Problème requête SQL

(06-01-2022 16:11:12)


Bonjour,
J'ai détourné un module pour faire apparaître dans le back-office le quartier rattaché à l'adresse de livraison.
J'ai une table avec id/rue/quartier dans ma base de données. Une boucle avec un filtre Rue me permet de récupérer le quartier.
Cela fonctionne bien, mis à part un détail. Par exemple si l'adresse renseignée est "rue amiral courbet" alors qu'elle est enregistrée "rue de l'amiral courbet" dans la base de données, le quartier n'est pas trouvé. Du coup, je souhaiterai mettre des REPLACE(RUE," de "," ") au niveau de la requête SQL, pour éviter ce problème. Mais il n'y a pas de SELECT dans le module. Je n'arrive pas à trouver l'endroit où je pourrais ajouter ce type de fonction...
Quelqu'un aurait-il une idée ?

Offline

#2 Re: Problème requête SQL

(07-01-2022 01:15:29)


Une boucle avec un filtre ? Tu parles d'un argument de la boucle comme ci-dessous :

{loop type="nom_de_boucle" rue=""}
...
{/loop}

Ne peux-tu pas effectuer tes replace avant de les passer en amont ?

Autre piste à explorer : manipuler les arguments passés à la boucle.
Dans cette section de la documentation tu trouveras les infos nécessaires.

Offline

#3 Re: Problème requête SQL

(07-01-2022 08:44:52)


Oui bien ça, c'est un argument de la boucle.
J'ai déjà fait des ajustements en amont, dans la valeur de l'argument RUE. Par exemple, le numéro de l'adresse est supprimé, idem pour "bis" ou "ter". J'ai ajusté également pour que si le client renseigne son adresse avec des abréviations tels que " bd " ce soit remplacé par " boulevard ", etc... pour que l'adresse soit bien trouvée.
Cependant un problème se pose pour des saisies où les articles ne seraient volontairement omis, comme "rue amiral courbet" au lieu de "rue DE L'amiral courbet". Et là sauf méconnaissance de ma part, je ne peux agir qu'au moment de requête SQL pour retirer les articles de, du, l', etc... de la valeur enregistrée dans la base de donnée.

Offline

#4 Re: Problème requête SQL

(07-01-2022 10:06:24)


Merci pour les précisions.

La définition de la boucle dans ton module étend-elle l'interface ArraySearchLoopInterface ou PropelSearchLoopInterface ?
Si elle étend ArraySearchLoopInterface tu pouras écrire ta propre requête SQL et formater les résultats renvoyées par la boucle.

Offline

#5 Re: Problème requête SQL

(07-01-2022 10:17:17)


J'ai les deux...
D'une part :

class OrderQuartierLoop extends BaseLoop implements PropelSearchLoopInterface
{
   protected function getArgDefinitions()
    {
        return new ArgumentCollection(
            Argument::createAnyTypeArgument('rue', null, true)
        );
    }

    public function buildModelCriteria()
    {
        $orderQuartierQuery = OrderQuartierQuery::create()->filterByRue($this->getRue());
        return $orderQuartierQuery;
    }
   
    public function parseResults(LoopResult $loopResult)
    {
        foreach ($loopResult->getResultDataCollection() as $orderQuartier) {
            $loopResultRow = new LoopResultRow($orderQuartier);

            $loopResultRow->set("ORDER_QUARTIER", $orderQuartier->getQuartier());
            $loopResult->addRow($loopResultRow);
        }

        return $loopResult;
    }
}

Et d'autre part :

class SessionOrderQuartierLoop extends BaseLoop implements ArraySearchLoopInterface
{
    public function buildArray()
    {
        $item = ['quartier' => $this->request->getSession()->get('order-quartier')];
        return $item;
    }

    public function parseResults(LoopResult $loopResult)
    {
        $item = $loopResult->getResultDataCollection();

        $loopResultRow = new LoopResultRow();
        $loopResultRow->set('ORDER_QUARTIER', $item['quartier']);

        $loopResult->addRow($loopResultRow);

        return $loopResult;
    }

    public function getArgDefinitions()
    {
        return new ArgumentCollection();
    }
}

Offline

#6 Re: Problème requête SQL

(07-01-2022 12:30:59)


Tu ne pourras jamais traiter tous les cas saisis par tes clients (ils sont créatifs...).

Google propose un très bon service d'autocompletion d'adresse, que tu pourrais mettre en place dans tes formulaires de saisie d'adresse : https://developers.google.com/maps/docu … tocomplete

Tu pourrais alors avoir des adresses normalisées, ce qui réduirait sans doute beaucoup les problèmes de matching.

Autre possibilité, transformer en latitude/longitude les adresses de tes clients, avec le service google de geocodage d'adresse https://developers.google.com/maps/docu … g/overview

Tu définis ensuite en base des polygones qui représentent les quartiers. Il ne te reste plus qu'à déterminer dans quelm polygone se trouve le point qui correspond à l'adresse du client pour trouver le quartier, soit en le calculmant toi même, soit avec les fonctions de recherche spatiales de MySql de https://dev.mysql.com/doc/refman/8.0/en … types.html


OpenStudio Toulouse

Offline

#7 Re: Problème requête SQL

(25-01-2022 09:24:38)


Bonjour Roadster,
Je te remercie pour tes conseils.
J'ai suivi le premier, c'est-à-dire que j'ai tenté d'installer l'autocompletion d'adresse, qui pourrait parfaitement répondre à mon besoin.
Mais lorsque j'ajoute le script dans le header, il est mal interprété par le smarty.
Aurais-tu une idée pour solutionner ce problème ?

Voici le message d'erreur :
Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "/home/vjoyybz/xxxxxx/templates/frontOffice/default/layout.tpl" on line 173 "address1 = `${component.long_name} ${address1}`;" - Unexpected ".", expected one of: "}" <-- thrown in /home/vjoyybz/xxxxxx/core/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 173

Et la fonction en question proposait par Google, qui génère le bug :
function fillInAddress() {
  const place = autocomplete.getPlace();
  let address1 = "";
  let postcode = "";

  for (const component of place.address_components) {
    const componentType = component.types[0];

    switch (componentType) {
      case "street_number": {
        address1 = `${component.long_name} ${address1}`;
        break;
      }

      case "route": {
        address1 += component.short_name;
        break;
      }

      case "postal_code": {
        postcode = `${component.long_name}${postcode}`;
        break;
      }

      case "postal_code_suffix": {
        postcode = `${postcode}-${component.long_name}`;
        break;
      }
      case "locality":
        document.querySelector("#city").value = component.long_name;
        break;
    }
  }

  address1Field.value = address1;
  postalField.value = postcode;
  address2Field.focus();
}

Offline

#8 Re: Problème requête SQL

(26-01-2022 09:22:01)


C'est ce genre de construction qui pose problème :

postcode = `${component.long_name}${postcode}`;

Solution:
https://www.smarty.net/docsv2/fr/langua … iteral.tpl


OpenStudio Toulouse

Offline

#9 Re: Problème requête SQL

(27-01-2022 09:39:23)


ça fonctionne !
Un grand merci à Roadster31 et à Nog pour votre aide !