Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Tout d'abord, bonjour à toutes et à tous.
Je suis nouveau sur le forum, et je commence à utiliser ZF pour développer.
Voilà, je commence à créer un formulaire. Pour input Text, cela fonctionne, et ma méthode pour insérer dans ma BDD fonctionne.
Maintenant, pour compléter mon insert, je dois rajouter un select, qui contient des noms issus d'une requête SQL, avec en 'value' leur ID respectif ca c'est cette valeur qui doit être postée.
Je rencontre 2 problèmes:
1/ Afficher le select
2/ Construire le select avec les valeurs récupérées par SQL
J'ai bcp cherché avant de poster, mais pour l'instant, que des échecs...
....... $patientbmi = new Zend_Form_Element_Text('patientbmi'); $patientbmi->setLabel('Patient BMI') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $patientname = new Zend_Form_Element_Select ('patientname'); $patientname->setLabel ('Patient name'); $result = $db->fetchAssoc('select * from patient'); foreach ($result as $patients) { $patientname->addMultiOption($id_patient->id_patient, $patient_name->patient_name); }
Et dans mon controlleur:
function insertpatientAction() { $this->view->title = "Insert patient"; $form = new FormulairePatient(); $form->submit->setLabel('Insert'); $this->view->form = $form; if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { $patient = new Patient(); $row = $patient->createRow(); $row->patient_name = $form->getValue('patientname'); $row->height_patient = $form->getValue('patientheight'); $row->weight_patient = $form->getValue('patientweight'); $row->bmi_patient = $form->getValue('patientbmi'); $row->patient_name = $form->getValue('patientname'); $row->save(); $this->_redirect('/index/insertpatient'); } else { $form->populate($formData); } } }
Notice: Undefined variable: db in C:\wamp\www\projectAbl\application\models\FormulairePatient.php on line 43
Fatal error: Call to a member function fetchAssoc() on a non-object in C:\wamp\www\projectAbl\application\models\FormulairePatient.php on line 43
Je pense que mon select n'est pas complet d'une part? Et que ma boucle n'est pas bonne?? Je continue à chercher.
Si quelqu'un sait m'aider, merci beaucoup
Hors ligne
Le problème, c'est qu'il ne connait pas la variable "db", ça tu l'avais compris je pense
Tu devrais faire ta requête SQL dans ton contrôleur (ce serait déja plus correct), et passer au constructeur du modèle de formulaire le résultat de ta requête comme paramètre, tu saisis ?
Hors ligne
Heu , pas vraiment...
Pour la requête dans le controleur, OK, mais je peut la mettre dans ma fonction insertpatientAction, comme ceci:
function insertpatientAction() { $this->view->title = "Insert patient"; $form = new FormulairePatient(); $form->submit->setLabel('Insert'); $this->view->form = $form; if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { $patient = new Patient(); $row = $patient->createRow(); $row->height_patient = $form->getValue('patientheight'); $row->weight_patient = $form->getValue('patientweight'); $row->bmi_patient = $form->getValue('patientbmi'); $result = $db->fetchAssoc('select * from patient'); foreach ($result as $patients) { $patientname->addMultiOption($id_patient->id_patient, $patient_name->patient_name); } $row->patient_name = $form->getValue('patientname'); $row->save(); $this->_redirect('/index/insertpatient'); } else { $form->populate($formData); } }
Ensuite, dans le constructeur du FormulairePatient, comment faire pour passer le résultat en paramètres? Je ne comprends pas pourquoi il ne connait pas $db->fetchAssoc? C'est bien comme cela qu'on contruit une requête??
Merci
Hors ligne
Bon, j'ai cherché mais pas assez apparemment: je ne vois pas comment créer mon select et le remplir avec une requête sql? Je suis débutant en POO et avec ZF.
Merci d'avance pour ceux qui me montrerons un exemple, je n'ai pas trouvé dans les tutos...
Merci
Hors ligne
Autant pour moi
J'avais mal cherche: donc j'ai réussi à créer mon Select, mais avec des valeurs en dur.
$select = new Zend_Form_Element_Select('selection de données'); $select->setMultiOptions(array('option 1'=>'valeur 1', 'option 2'=>'valeur 2')); // les options à afficher dans le select $select->setValue('option 2'); // selectionne la valeur 2 à l'affichage $this->addElements(array($idpatient, $patientname, $patientheight, $patientweight, $patientbmi, array('select','selection de données', array('label'=>'séléctionnez une donnée :', 'multioptions'=>array('option 1'=>'valeur 1','option 2'=>'valeur 2'), 'value'=>'option 2')), $submit));
Il me faut maintenant chercher comment le remplir via une requête SQL, si quelqu'un peut m'aider... Merci
Hors ligne
Bon, alors je te montre l'exemple :
Dans ton contrôleur, juste avant la création de ton formulaire, tu fais ta requête SQL, puis tu la passes à ton formulaire en paramètre :
$result = $db->fetchAssoc('select * from patient'); $form = new FormulairePatient($result);
Ensuite, dans ton modèle "FormulairePatient", tu instancies le contructeur avec la valeur passées en paramètre :
class FormulairePatient extends Zend_Form{ public function __construct($resultat_requete) { parent::__construct($resultat_requete); ....... ....... foreach ($result_requete as $patients) { $patientname->addMultiOption($patients->id_patient, $patients->patient_name); }
Dernière modification par Djules (27-05-2009 08:59:18)
Hors ligne
Personellement je remplis mon Zend_Form_Element_Select depuis mon controller qui appel le formulaire
//Ton fichier Model public function getForHtmlSelect() { $results = $this->fetchAll(); $data = array(); foreach($results as $result) { $data[$result->id] = $result->nom; } return $data; }
$monModel = new MonModel(); $tableauPourMonSelect = $monModel->getForHtmlSelect(); $monForm = new MonForm(); $monForm->getElement('nomDeMonElementSelect')->setMultiOptions($tableauPourMonSelect);
Hors ligne
Hello,
Il y a aussi fetchPairs() qui renvoie directement un tableau key/value.
A+
Hors ligne
Merci Djules, Yannux, MikaelKael
Alors je pense avoir compris les 2 méthodes, mais pour l'instant g testé celle de Djules. J'ai toujours cette erreur, il ne connait pas $db ???. Je ne voit pas pourquoi. J'ai refais mon code et mon form, en sachant que en fait, le select doit contenir des country, pas des patient, mais c'est pareil... En outre, c'est l'id_country qui doit être posté, donc en '->setValue'. Je vous montre comment j'ai fais car cela me semble OK, mais pourtant :
Dans mon Contrôleur:
function insertpatientAction() { $this->view->title = "Insert patient"; [color=#FF0000]$result_request = $db->fetchAssoc('SELECT * FROM country');[/color] $form = new FormulairePatient($result_request); $form->submit->setLabel('Insert'); $this->view->form = $form; if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { $patient = new Patients(); $row = $patient->createRow(); $row->patient_name = $form->getValue('patientname'); $row->height_patient = $form->getValue('patientheight'); $row->weight_patient = $form->getValue('patientweight'); $row->bmi_patient = $form->getValue('patientbmi'); [color=#FF0000]$row->id_country_birth = $form->getValue('patientcountrybirth');[/color] $row->save(); $this->_redirect('/index/insertpatient'); } else { $form->populate($formData); } } }
Mon modèle formulaire
$patientcountrybirth = new Zend_Form_Element_Select('patientcountrybirth'); foreach ($result_request as $countries) { $patientcountrybirth->addMultiOption($countries->id_country, $countries->name_country) ->setValue($countries->id_country); } $this->addElements(array($idpatient, $patientname, $patientheight, $patientweight, $patientbmi, [color=#FF0000]$patientcountrybirth[/color], $submit));
Je pense que c OK, si j'ai bien compris la méthode de Djules?
Mais j'ai toujours ce message:
Notice: Undefined variable: db in C:\wamp\www\projectAbl\application\controllers\IndexController.php on line 13
Fatal error: Call to a member function fetchAssoc() on a non-object in C:\wamp\www\projectAbl\application\controllers\IndexController.php on line 13
J'ai ces lignes dans mon index.php
// Mise en place de la BDD $db = Zend_Db::factory($config->db); Zend_Db_Table::setDefaultAdapter($db);
Merci de votre aide, et patience!!!
Dernière modification par daninou (27-05-2009 13:58:53)
Hors ligne
cette discussion montre bien la nécessité de bien séparer la couche métier du contrôleur.
A+JYT
Hors ligne
J'attends avec impatience ma commande:
Zend Framework - Bien programmer en PHP de Julien Pauli et Guillaume Ponçon chez Eyrolles.
Car j'ai bcp de lacunes encore...
J'ai regardé comment mettre dans le registry:
Zend_Registry::set('index', $value);
Mais j'ai du mal: je dois mettre $db? style:
Zend_Registry::set('db', $db);
Mais dans quel fichier, index.php, dans le controleur....
Bon, je pense que je vais attendre mon bouquin, car là je ne comprends pas désolé...
Merci à tous de votre aide
Hors ligne
Je ne l'ai pas fais celui là, j'ai réaliser celui la:
http://g-rossolini.developpez.com/tutor … k/debuter/
Il fonctionne bien et je l'ai adapter à mon projet.
Mais il n'y a pas d'exemple, ni dans le quick start avec des select, c'est sur cela que je coince
Hors ligne
oui fin oublie ton select
je t'ai montré un exemple beaucoup plus logique pour respecter ta structure MVC.
As tu fais des models ?
Le quickstart parle du registry...
Dernière modification par yannux (27-05-2009 18:19:42)
Hors ligne
non le formulaire est un usage
ce n'est pas un modèle
Hors ligne
daninou a écrit:
Code:
Zend_Registry::set('db', $db);
Pas besoin de le mettre dans le registre, tu peux récupérer l'adaptateur avec Zend_Db_Table_Abstract::getDefaultAdapter()
Hors ligne
Pages: 1