Form DAO et Schema

11 views
Skip to first unread message

Arnaud Vandecasteele

unread,
Jun 9, 2020, 2:10:22 AM6/9/20
to jelix-fr
Bonjour,

Je souhaite initialiser une liste déroulante avec des données provenant de ma base qui est différente de celle utilisée par l'application principale (Lizmap).
Pour cela, comme écrit dans la documentation, j'ai tout d'abord :

1- Créer le formulaire correspondant (communes.form.xml)

<?xml version="1.0" encoding="utf-8"?>
<form xmlns="http://jelix.org/ns/forms/1.1" allowAnyOrigin="true">
   
<menulist ref="commune">
       
<label locale="monModule~monModuleLocales.input.label"/>
       
<emptyitem locale="monModule~Locales.input.label"/>
       
<datasource
           
dao="monModule~geo_communes"
           
method="findAllBySQL" labelproperty="nom"
           
valueproperty="code_insee"
       
/>
   
</menulist>
   
<button ref="search">
       
<label locale="monModule~monModuleLocales.input.search"/>
   
</button>
</form>


2- Créer le fichier de DAO de correspondance (geo_communes.dao.xml)

<?xml version="1.0" encoding="UTF-8"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
    <datasources>
        <primarytable name="communes" realname="communes" primarykey="id" />
    </datasources>
    <record>
        <property name="id" fieldname="id" datatype="integer" />
        <property name="code_insee" fieldname="code_insee" datatype="text"/>
        <property name="nom" fieldname="nom" datatype="text" required="true" />
    </record>
    <factory>
        <method name="findAllCommunes" type="select">
            <order>
                <orderitem property="nom" way="asc" />
            </order>
        </method>
        <method name="findAllBySQL" type="php">
            <body><![CDATA[
                $sql = ' SELECT code_insee, nom';
                $sql.= ' FROM administratif.communes ORDER BY nom asc';
                $this->_conn->exec($sql);
            ]]></body>
        </method>
    </factory>
</dao>

Dans ce fichier de DAO j'ai tout d'abord testé une première méthode (findAllCommunes) qui ne trouvait pas la table communes spécifiée en datasource.
Cette table est dans un schéma spécifique. J'ai alors pensé que le problème provenait de là.
J'ai alors testé une seconde méthode (findAllBySQL) qui iontègre directement le code SQL et de ce fait le nom du schéma.
Mais là encore il ne trouve pas la table communes.
N'ayant null part défini quelle section jdb (profiles.ini.php) utiliser, j'en déduis qu'il va chercher directement dans la base de l'application principale (Lizmap) et non dans ma propre base secondaire.

Mes questions sont donc les suivantes :
  1. Est-il possible dans mon fichier de DAO de spécifier quel profil jdb utiliser ?
  2. Si ce n'est pas possible, ma seule alternattive est-elle d'utiliser ma propre instance de classe [1] dérivée de jIFormsDatasource ou de jFormsDynamicDatasource ?
    • Dans ce cas, quelle est la différence entre jIFormsDatasource ou de jFormsDynamicDatasource ?
Merci d'avance,

Arnaud

Laurent

unread,
Jun 9, 2020, 11:55:47 AM6/9/20
to jeli...@googlegroups.com
Bonjour,

Pour que la table soit trouvée alors qu'elle est dans un autre schéma, il faut indiquer au connecteur de base de donnée le "search path" postgresql (j'imagine que c'est du Postgresql si c'est lizmap ?)

Donc dans profiles.ini.php, il faut ajouter search_path=votreschema,public dans le profile adéquate. (jdb:jauth à priori dans lizmap ?)

Sinon créer un autre profile de connexion et dans le fichier jforms, indiquer son nom (ici "donnees" en exemple) dans un attribut profile au niveau dans la balise datasource

<datasource
           
dao="monModule~geo_communes"
           
method="findAllBySQL" labelproperty="nom"
           
valueproperty="code_insee"
          profile="donnees"
  />

Cela va alors fonctionner.

Par contre vous allez peut être avoir un souci de performance (ça fait beaucoup 36000 communes :-). Peut-être voudriez-vous afficher un simple champs de saisie et qui propose une liste de possibilités au fur et à mesure que vous taper le nom de la commune à rechercher.

Il y a ce qu'il faut dans Jelix mais il y a peu de doc sur le widget autocompleteajax_html. J'essaierai de vous expliquer ça plus tard si vous le souhaitez

Enfin, normalement, dans le fichier jforms, vous devriez utiliser <submit> au lieu de <button>.

Laurent
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "jelix-fr".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse jelix-fr+u...@googlegroups.com.
Cette discussion peut être lue sur le Web à l'adresse https://groups.google.com/d/msgid/jelix-fr/0a4e6046-991a-4212-a0da-f1c34effed50o%40googlegroups.com.


Arnaud Vandecasteele

unread,
Jun 9, 2020, 12:37:33 PM6/9/20
to jeli...@googlegroups.com
Bonjour Laurent,

Merci pour le retour. Je testerai avec le profile dans le datasource.Entre temps j'ai implémenté la requête via un jIFormsDatasource. Cela fonctionne bien mais ça serait tout de même plus propre directement dans le datasource.

Question performance, je garde l'idée. Néanmoins, l'application n'utilisera que les 24 communes de la réunion. Côté performance cela devrait donc le faire. :)

Merci encore,

Amicalement,

Arnaud





--
--------------------------------------------------------------------
Arnaud Vandecasteele


Arnaud Vandecasteele

unread,
Jun 26, 2020, 6:54:40 AM6/26/20
to jeli...@googlegroups.com
Je me permets de revenir sur ce sujet.
D'un point de vue de logique du code, ne serait-il pas préférable que la clé "profile" soit précisée dans le document de dao plutôt que dans le form ?

Amicalement,

Arnaud

On Tue, Jun 9, 2020 at 7:55 PM Laurent <lau...@jelix.org> wrote:


--
--------------------------------------------------------------------
Arnaud Vandecasteele


Laurent Jouanneau

unread,
Jun 28, 2020, 4:16:02 PM6/28/20
to jeli...@googlegroups.com

Bonjour

Le 26/06/2020 à 12:54, Arnaud Vandecasteele a écrit :
Je me permets de revenir sur ce sujet.
D'un point de vue de logique du code, ne serait-il pas préférable que la clé "profile" soit précisée dans le document de dao plutôt que dans le form ?

Non, car un DAO est censé être une couche d'abstraction, donc non lié à un profile en particulier. C'est lors de son utilisation que l'on indique un profile de connexion. Donc ici un formulaire.

Si il fallait indiquer un profile dans les daos, cela obligerait alors à définir X profiles (ou alias de profiles) dans profiles.ini.php (X étant le nombre de DAO, ou de modules...). Ce serait fastidieux pour les modules réutilisables.

Et de toutes façon, ça ne résolverait en rien ton problème initial (dont la solution est d'indiquer à postgresql la liste des schéma à prendre en compte)



Arnaud Vandecasteele

unread,
Jun 29, 2020, 5:32:51 AM6/29/20
to jeli...@googlegroups.com
Oui effectivement, présenté de cette manière cela fait sens.

Merci.

Amicalement,

Arnaud



--
--------------------------------------------------------------------
Arnaud Vandecasteele


Reply all
Reply to author
Forward
0 new messages