Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Problème avec formulaire, dao et base de données

Posted by aurélie on 06/24/2010 09:12

Bonjour.
Je débute sur Jelix et j'ai quelques soucis en ce qui concerne les formulaires, les daos et la base de données. Je vous explique.

J'ai 2 tables : PERSON et ADDRESS.

J'ai fait un seul dao pour les 2 tables, voici le code :

<?xml version="1.0" encoding="iso-8859-1"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
<code>
  <datasources>
    <primarytable name="PERSON" realname="PERSON" primarykey="ID_PERSON"/>
    <foreigntable name="ADDRESS" realname="ADDRESS" primarykey="ID_ADDRESS" onforeignkey="ID_ADDRESS" />
    <!--<optionalforeigntable name="PERSON" realname="PERSON" primarykey="ID_PERSON" onforeignkey="ID_ADDRESS" />-->
  </datasources>
  <record>
    <property name="ID_PERSON" fieldname="ID_PERSON" datatype="autoincrement"/>
    <property name="FIRST_NAME" fieldname="FIRST_NAME" datatype="string"/>
    <property name="LAST_NAME" fieldname="LAST_NAME" datatype="string"/>
    <property name="BIRTHDAY" fieldname="BIRTHDAY" datatype="date"/>
    <property name="SEX" fieldname="SEX" datatype="string"/>
    <property name="CIVILITY" fieldname="CIVILITY" datatype="string"/>
    <property name="FAMILY_SITUATION" fieldname="FAMILY_SITUATION" datatype="string"/>
    <property name="ID_CONJOINT" fieldname="ID_CONJOINT" datatype="integer"/>
    <property name="PHONE_NUMBER" fieldname="PHONE_NUMBER" datatype="integer"/>
    <property name="PORT_NUMBER" fieldname="PORT_NUMBER" datatype="integer"/>
    <property name="EMAIL_ADDRESS" fieldname="EMAIL_ADDRESS" datatype="string"/>
    <property name="ID_ADDRESS" fieldname="ID_ADDRESS" datatype="integer"/>
  </record>
  <record>
    <property name="ID_ADDRESS" fieldname="ID_ADDRESS" datatype="autoincrement"/>
    <property name="ADDRESS1" fieldname="ADDRESS1" datatype="string"/>
    <property name="ADDRESS2" fieldname="ADDRESS2" datatype="string"/>
    <property name="ADDRESS3" fieldname="ADDRESS3" datatype="string"/>
    <property name="ADDRESS4" fieldname="ADDRESS4" datatype="string"/>
    <property name="ZIP_CODE" fieldname="ZIP_CODE" datatype="string"/>
    <property name="TOWN" fieldname="TOWN" datatype="string"/>
    <property name="ID_COUNTRY" fieldname="ID_COUNTRY" datatype="string"/>
  </record>
</dao> </code>



J'ai un formulaire sur lequel je fais intervenir le dao. Je voudrais pouvoir ajouter et consulter des personnes grâce à ma base de données. C'est là mon souci, je n'arrive ni à insérer ni à sélectionner dans les 2 tables à la fois. Pour sélectionner, j'ai choisi de mettre le nom saisi dans une variable et de faire select avec, mais je n'y arrive pas.

J'ai créé une fonction dans le contrôleur que voici :

   function rechercher () {
<code>
	$rep = $this->getResponse('html');
	$rep->title = 'Resultat de la recherche';
	// On récupère le LAST_NAME saisie dans le formulaire de recherche
	$nomcherche = $this->param('LAST_NAME');
	// Ci-dessous la création d'une condition, en fait une requête paramétrée.
	$maDao = jDao::get("person"); // on doit pouvoir mettre une DAO multi-table pour remplir tout le formulaire, avec adresse notament.
	$conditions = jDao::createConditions();
	$conditions->addCondition('LAST_NAME','=', $nomcherche);   
	// Dans la liste on a l'ensemble des réponses avec la valeur passé à LAST_NAME (tous les homonymes)
	$liste = $maDao->findBy($conditions);  
	
	/*// RETOUR 1 : Classique, on prépare le resultat de la requête à être exploité dans un template .tpl
	$tpl = new jTpl();
	$tpl->assign('liste', $liste);

     	// assignation du resultat du template resultatrecherche à la variable $MAIN
        // mais on doit pouvoir remplir directement un formulaire depuis le résultat 
	// de la $condition qui n'est rien d'autre qu'un requpete SELECT avec une 
	// clause WHERE sur le champ LAST_NAME.
     	$rep->body->assign('MAIN', $tpl->fetch('resultatrecherche')); */

	// RETOUR 2 : Remplissage du formulaire searchpersform avec les valeur trouvé lors de la condition
	// c'est à dire la requête paramétrée sur le LAST_NAME.
	$form = jForms::create("aclca~consultadhform");

        $tpl = new jTpl();
        $tpl->assign('formulaire', $form);
	foreach ($liste as $row) {
      	   $form->setData('CIVILITY', $row->CIVILITY);
	   $form->setData('LAST_NAME', $row->LAST_NAME);
	   $form->setData('FIRST_NAME', $row->FIRST_NAME);
	   $form->setData('BIRTHDAY', $row->BIRTHDAY);
	   $form->setData('SEX', $row->SEX);
	   $form->setData('FAMILY_SITUATION', $row->FAMILY_SITUATION);
	   $form->setData('ADDRESS1', $row->ADDRESS1);
	   $form->setData('ADDRESS2', $row->ADDRESS2);
	   $form->setData('ADDRESS3', $row->ADDRESS3);
	   $form->setData('ADDRESS4', $row->ADDRESS4);
	   $form->setData('ZIP_CODE', $row->ZIP_CODE);
	   $form->setData('TOWN', $row->TOWN);
	   $form->setData('PHONE_NUMBER', $row->PHONE_NUMBER);
	   $form->setData('PORT_NUMBER', $row->PORT_NUMBER);
	   $form->setData('EMAIL_ADDRESS', $row->EMAIL_ADDRESS);
   	}
        $rep->body->assign('MAIN', $tpl->fetch('person'));
        return $rep;
   }
</code>



Je vous envoie aussi le code de mon formulaire au cas où :

<?xml version="1.0" encoding="utf-8"?>
<code>
 
<form xmlns="http://jelix.org/ns/forms/1.1" action="{formurl 'aclca~default:consulterpersonne'}" method="POST">

{formurlparam 'aclca~default:createsave'}

  <radiobuttons ref="CIVILITY">
      <label>Civilité</label>
      <hint>Civilité de la personne</hint>
      <item value="M">M</item>
      <item value="Mme">Mme</item>
      <item value="Melle">Melle</item>
  </radiobuttons>
  <input ref="LAST_NAME" type="string">
     <label>Nom</label>
     <hint>Nom de la personne</hint>
  </input> 
  <input ref="FIRST_NAME" type="string">
     <label>Prénom</label>
     <hint>Prénom de la personne</hint>
  </input>
  <input ref="BIRTHDAY" type="date">
     <label>Date de Naissance</label>
     <hint>Date de naissance de la personne</hint>
  </input>
  <radiobuttons ref="SEX">
      <label>Sexe</label>
      <hint>Sexe de la personne</hint>
      <item value="M">M</item>
      <item value="F">F</item>
  </radiobuttons>
  <menulist ref="FAMILY_SITUATION" >
      <label>Situation de Famille</label>
      <hint>Sitution de Famille de la personne</hint>
      <item value="Célibataire">Célibataire</item>
      <item value="Marié(e)">Marié(e)</item>
      <item value="Divorcé(e)">Divorcé(e)</item>
      <item value="Veuf/Veuve">Veuf/Veuve</item>
      <item value="Vie maritalement">Vie maritalement</item>
  </menulist>
  <input ref="ID_CONJOINT" type="integer">
     <label>Identifiant du conjoint</label>
     <hint>Identifiant du conjoint de la personne</hint>
  </input>

  <input ref="ADDRESS1" type="string">
     <label>Adresse1</label>
     <hint>Adresse1 de la personne</hint>
  </input>
  <input ref="ADDRESS2" type="string">
     <label>Adresse2</label>
     <hint>Adresse2 de la personne</hint>
  </input>
  <input ref="ADDRESS3" type="string" >
     <label>Adresse3</label>
     <hint>Adresse3 de la personne</hint>
  </input>
  <input ref="ADDRESS4" type="string">
     <label>Adresse4</label>
     <hint>Adresse4 de la personne</hint>
  </input>
  <input ref="ZIP_CODE" type="integer" >
     <label>Code Postal</label>
     <hint>Code Postal de la personne</hint>
  </input>
  <menulist ref="TOWN">
      <label>Ville</label>
      <hint>Ville de la personne</hint>
      <datasource dao="aclca~county" method="findAll" labelproperty="NAME" valueproperty="NAME"/>
  </menulist>
  <input ref="PHONE_NUMBER" type="integer">
     <label>Numéro de Téléphone</label>
     <hint>Numéro de Téléphone de la personne</hint>
  </input>
  <input ref="PORT_NUMBER" type="integer">
     <label>Numéro de Portable</label>
     <hint>Numéro de portable de la personne</hint>
  </input>
  <input ref="EMAIL_ADDRESS" type="integer" >
     <label>Adresse email</label>
     <hint>Adresse Email de la personne</hint>
  </input>
  <submit ref="submit">
    <label>Enregistrer</label>
  </submit>
</form></code>



Voila, en espérant que vous ayez une solution. Merci d'avance.

  [Opened] Problème avec formulaire, dao et base de données

Reply #1 Posted by Vincentv on 06/24/2010 10:51

Juste pour que ce soit un peu plus lisible sur le forum, tu pourrais refaire l'indentation de ton code, voir utiliser la balise code si tu ne l'a pas fait. Merci ^^

  [Opened] Problème avec formulaire, dao et base de données

Reply #2 Posted by aurélie on 06/24/2010 15:28

Désolé ^^' C'est mieux comme ça??

J'ai fait un seul dao pour les 2 tables, voici le code :

<?xml version="1.0" encoding="iso-8859-1"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
<datasources> <primarytable name="PERSON" realname="PERSON" primarykey="ID_PERSON"/> <foreigntable name="ADDRESS" realname="ADDRESS" primarykey="ID_ADDRESS" onforeignkey="ID_ADDRESS" /> <!--<optionalforeigntable name="PERSON" realname="PERSON" primarykey="ID_PERSON" onforeignkey="ID_ADDRESS" />--> </datasources>
<record> <property name="ID_PERSON" fieldname="ID_PERSON" datatype="autoincrement"/> <property name="FIRST_NAME" fieldname="FIRST_NAME" datatype="string"/> <property name="LAST_NAME" fieldname="LAST_NAME" datatype="string"/> <property name="BIRTHDAY" fieldname="BIRTHDAY" datatype="date"/> <property name="SEX" fieldname="SEX" datatype="string"/> <property name="CIVILITY" fieldname="CIVILITY" datatype="string"/> <property name="FAMILY_SITUATION" fieldname="FAMILY_SITUATION" datatype="string"/> <property name="ID_CONJOINT" fieldname="ID_CONJOINT" datatype="integer"/> <property name="PHONE_NUMBER" fieldname="PHONE_NUMBER" datatype="integer"/> <property name="PORT_NUMBER" fieldname="PORT_NUMBER" datatype="integer"/> <property name="EMAIL_ADDRESS" fieldname="EMAIL_ADDRESS" datatype="string"/> <property name="ID_ADDRESS" fieldname="ID_ADDRESS" datatype="integer"/> </record>
<record> <property name="ID_ADDRESS" fieldname="ID_ADDRESS" datatype="autoincrement"/> <property name="ADDRESS1" fieldname="ADDRESS1" datatype="string"/> <property name="ADDRESS2" fieldname="ADDRESS2" datatype="string"/> <property name="ADDRESS3" fieldname="ADDRESS3" datatype="string"/> <property name="ADDRESS4" fieldname="ADDRESS4" datatype="string"/> <property name="ZIP_CODE" fieldname="ZIP_CODE" datatype="string"/> <property name="TOWN" fieldname="TOWN" datatype="string"/> <property name="ID_COUNTRY" fieldname="ID_COUNTRY" datatype="string"/> </record>
</dao>

J'ai un formulaire sur lequel je fais intervenir le dao. Je voudrais pouvoir ajouter et consulter des personnes grâce à ma base de données. C'est là mon souci, je n'arrive ni à insérer ni à sélectionner dans les 2 tables à la fois. Pour sélectionner, j'ai choisi de mettre le nom saisi dans une variable et de faire select avec, mais je n'y arrive pas.

J'ai créé une fonction dans le contrôleur que voici :

<code>
   function rechercher () {
	$rep = $this->getResponse('html');
	$rep->title = 'Resultat de la recherche';
	// On récupère le LAST_NAME saisie dans le formulaire de recherche
	$nomcherche = $this->param('LAST_NAME');
	// Ci-dessous la création d'une condition, en fait une requête paramétrée.
	$maDao = jDao::get("person"); // on doit pouvoir mettre une DAO multi-table pour remplir tout le formulaire, avec adresse notament.
	$conditions = jDao::createConditions();
	$conditions->addCondition('LAST_NAME','=', $nomcherche);
	// Dans la liste on a l'ensemble des réponses avec la valeur passé à LAST_NAME (tous les homonymes)
        $liste = $maDao->findBy($conditions);
	
	/*// RETOUR 1 : Classique, on prépare le resultat de la requête à être exploité dans un template .tpl
	$tpl = new jTpl();
	$tpl->assign('liste', $liste);

     	// assignation du resultat du template resultatrecherche à la variable $MAIN
        // mais on doit pouvoir remplir directement un formulaire depuis le résultat 
	// de la $condition qui n'est rien d'autre qu'un requpete SELECT avec une 
	// clause WHERE sur le champ LAST_NAME.
     	$rep->body->assign('MAIN', $tpl->fetch('resultatrecherche')); */

	// RETOUR 2 : Remplissage du formulaire searchpersform avec les valeur trouvé lors de la condition
	// c'est à dire la requête paramétrée sur le LAST_NAME.
	$form = jForms::create("aclca~consulterpersform");

        $tpl = new jTpl();
        $tpl->assign('formulaire', $form);
         foreach ($liste as $row) {
      	// $row contient un enregistrement
      	   $form->setData('CIVILITY', $row->CIVILITY);
	   $form->setData('LAST_NAME', $row->LAST_NAME);
	   $form->setData('FIRST_NAME', $row->FIRST_NAME);
	   $form->setData('BIRTHDAY', $row->BIRTHDAY);
	   $form->setData('SEX', $row->SEX);
	   $form->setData('FAMILY_SITUATION', $row->FAMILY_SITUATION);
	   $form->setData('ADDRESS1', $row->ADDRESS1);
	   $form->setData('ADDRESS2', $row->ADDRESS2);
	   $form->setData('ADDRESS3', $row->ADDRESS3);
	   $form->setData('ADDRESS4', $row->ADDRESS4);
	   $form->setData('ZIP_CODE', $row->ZIP_CODE);
	   $form->setData('TOWN', $row->TOWN);
	   $form->setData('PHONE_NUMBER', $row->PHONE_NUMBER);
	   $form->setData('PORT_NUMBER', $row->PORT_NUMBER);
	   $form->setData('EMAIL_ADDRESS', $row->EMAIL_ADDRESS);}
   	

        $rep->body->assign('MAIN', $tpl->fetch('search_pers'));

       return $rep;}
</code>

Je vous envoie aussi le code de mon formulaire au cas où :

<?xml version="1.0" encoding="utf-8"?>
<code>
 
<form xmlns="http://jelix.org/ns/forms/1.1" action="{formurl 'aclca~default:consulterpersonne'}" method="POST">{formurlparam 'aclca~default:createsave'} <radiobuttons ref="CIVILITY"><label>Civilité</label><hint>Civilité de la personne</hint> <item value="M">M</item><item value="Mme">Mme</item><item value="Melle">Melle</item> </radiobuttons> <input ref="LAST_NAME" type="string"><label>Nom</label><hint>Nom de la personne</hint> </input> <input ref="FIRST_NAME" type="string"><label>Prénom</label><hint>Prénom de la personne</hint></input> <input ref="BIRTHDAY" type="date"><label>Date de Naissance</label><hint>Date de naissance de la personne</hint></input> <radiobuttons ref="SEX"><label>Sexe</label><hint>Sexe de la personne</hint><item value="M">M</item><item value="F">F</item></radiobuttons> <menulist ref="FAMILY_SITUATION" > <label>Situation de Famille</label> <hint>Sitution de Famille de la personne</hint> <item value="Célibataire">Célibataire</item> <item value="Marié(e)">Marié(e)</item> <item value="Divorcé(e)">Divorcé(e)</item> <item value="Veuf/Veuve">Veuf/Veuve</item> <item value="Vie maritalement">Vie maritalement</item> </menulist> <input ref="ID_CONJOINT" type="integer"><label>Identifiant du conjoint</label> <hint>Identifiant du conjoint de la personne</hint></input> <input ref="ADDRESS1" type="string"><label>Adresse1</label><hint>Adresse1 de la personne</hint></input> <input ref="ADDRESS2" type="string"><label>Adresse2</label><hint>Adresse2 de la personne</hint></input>
 <input ref="ADDRESS3" type="string" ><label>Adresse3</label><hint>Adresse3 de la personne</hint></input>
<input ref="ADDRESS4" type="string"><label>Adresse4</label><hint>Adresse4 de la personne</hint></input> <input ref="ZIP_CODE" type="integer" ><label>Code Postal</label><hint>Code Postal de la personne</hint></input> <menulist ref="TOWN"><label>Ville</label><hint>Ville de la personne</hint><datasource dao="aclca~county" method="findAll" labelproperty="NAME" valueproperty="NAME"/> </menulist> <input ref="PHONE_NUMBER" type="integer"><label>Numéro de Téléphone</label><hint>Numéro de Téléphone de la personne</hint></input> <input ref="PORT_NUMBER" type="integer"><label>Numéro de Portable</label><hint>Numéro de portable de la personne</hint></input> <input ref="EMAIL_ADDRESS" type="integer"><label>Adresse email</label><hint>Adresse Email de la personne</hint></input> <submit ref="submit"><label>Enregistrer</label></submit> </form> </code>

  [Opened] Problème avec formulaire, dao et base de données

Reply #3 Posted by Vincentv on 06/24/2010 16:14

C'est un peu mieux mais tjrs difficilement lisible. ^^

J'aurais quelques question :

  • Pourquoi tu fais $tpl->assign('formulaire', $form); avant tes setData?
  • Pourquoi tu fais setData du meme jForms dans une boucle foreach?
  • Tu a vérifier que tu devais bien avoir des résultat a ta recherche? si tu remplace findBy par countBy, ca compte combien d'enregistrement?
  • Dans ton jForms, tu es sur que c'est correcte cette partie?
<form xmlns="http://jelix.org/ns/forms/1.1" action="{formurl 'aclca~default:consulterpersonne'}" method="POST">
{formurlparam 'aclca~default:createsave'}

Pour les jForms, tu peux trouver des exemple dans testapp :)

Merci Foxmask pour l'edition du Premier post

  [Opened] Problème avec formulaire, dao et base de données

Reply #4 Posted by foxmask on 06/24/2010 20:24

j'ai édité le premier message.


@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !

  [Opened] Problème avec formulaire, dao et base de données

Reply #5 Posted by laurentj on 06/25/2010 09:42

@aurélie : lit les instructions de formatage qui se trouvent juste en dessous de la zone de saisie, et utilise la balise < code> pour afficher du code source. Merci d'avance. Ce que tu as fait, c'est illisible. j'ai reformaté pour que ça le devienne.

$conditions = jDao::createConditions();
<code>
	$conditions->addCondition('LAST_NAME','=', $nomcherche);   
	// Dans la liste on a l'ensemble des réponses avec la valeur passé à LAST_NAME (tous les homonymes)
	$liste = $maDao->findBy($conditions);
</code>

Fait une méthode XML pour ça, plutôt que d'utiliser les conditions dynamiques. ça sera plus simple à utiliser et plus rapide.

Tu fais deux fois ça :

$rep->body->assign('MAIN', ..)

Forcément, le deuxième assignement écrase le contenu du premier...

$form->setData('CIVILITY', $row->CIVILITY);

Utilise la méthode initFromDao plutôt que de faire à la main pour chaque champs.

Mais bon, ici je ne comprend pas ce que tu veux faire. Actuellement, tu récupères une liste d'enregistrement avec ton findBy, tu boucles dessus, pour afficher dans un formulaire. mais là, tu n'as qu'un formulaire, donc il n'affichera qu'un enregistrement.

En fait, je n'arrive pas à comprendre quel est ton objectif. décrit nous la/les pages que tu veux mettre en place.

 
Page
  1. Créer un cookie >
  2. Problème avec formulaire, dao et base de données