自分で解決策を見つけるにはいくつかの問題があるため、コミュニティに質問します。Zend Framework でアプリを開発しています。
いくつかの SELECT 要素を含むフォームがあります。それらのいくつかにはDBからのデータが取り込まれ、他のいくつかにはフォーム内のデータが取り込まれます( ->addMultiOption(0, 'Option 1')...)。
挿入はうまくいきますが、更新機能にいくつか問題があります。フォーム内のオプションで埋められた SELECT 要素は正常に読み込まれますが、DB データで埋められた SELECT 要素は正しく設定されていません。DB のテーブルの最初のオプションが常に選択されます。
だから、私のコードに何か問題があると思います。見やすくするために一部の要素を削除しました。
私のフォーム:
<?php
class Application_Form_Pda extends Zend_Form
{
public function init()
{
$this->setName('ajouter');
$addFabForm = new Zend_Form;
$addFabForm->setAction('#'); // A compléter
$addFabForm->setMethod('post');
$addFabForm->setAttrib('id', ''); // A compléter
//Id
$id = new Zend_Form_Element_Hidden('PDA_ID');
$id->addFilter('Int');
//Select du Fabriquant
$nomFabriquant = new Zend_Form_Element_Select('FAB_NOM');
$nomFabriquant ->setLabel('Fabriquant')
->setRequired(true)
->addErrorMessage('Vous devez sélectionner un fabriquant');
$TableFab = new Application_Model_DbTable_Fabriquant();
//$nomFabriquant->addMultiOption(0, "");
foreach ($TableFab->fetchAll() as $ind) {
$nomFabriquant->addMultiOption($ind['FAB_ID'], $ind['FAB_NOM']);
}
// Select du Modèle
$nomModele = new Zend_Form_Element_Select('MOD_NOM');
$nomModele ->setLabel('Modèle')
->setRequired(true)
->addErrorMessage('Vous devez sélectionner un modèle');
$TableMod = new Application_Model_DbTable_Modele();
//$nomModele->addMultiOption(0, "");
foreach ($TableMod->fetchAll() as $ind) {
$nomModele ->addMultiOption($ind->MOD_ID, $ind->MOD_NOM);
}
// Champs texte, numéro IMEI
$imei = new Zend_Form_Element_Text('PDA_IMEI');
$imei ->setRequired(true)
->setLabel('IMEI')
->addFilter('StripTags')
/*->addValidator('Default_Validator_Imei')*/
->addValidator('NotEmpty');
// Select du Site
$nomSite = new Zend_Form_Element_Select('PDA_SITE');
$nomSite ->setLabel('Site')
->setRequired(true)
->addMultiOption(0, "Nantes")
->addMultiOption(1, "Paris")
->addErrorMessage('Vous devez sélectionner un site');
// Achat DSIV
$dsiv = new Zend_Form_Element_Checkbox('PDA_ACHATDSIV');
$dsiv ->setChecked(true)
->setLabel('Achat SVSI');
// Checkbox boite
$boite = new Zend_Form_Element_Checkbox('PDA_OPT_BOITE');
$boite ->setChecked(true)
->setLabel('Boite');
// Checkbox USB
$usb = new Zend_Form_Element_Checkbox('PDA_OPT_USB');
$usb ->setChecked(true)
->setLabel('Cable USB');
// Checkbox chargeur
$chargeur = new Zend_Form_Element_Checkbox('PDA_OPT_CHARGEUR');
$chargeur ->setChecked(true)
->setLabel('Chargeur');
// Checkbox casque
$casque = new Zend_Form_Element_Checkbox('PDA_OPT_CASQUE');
$casque ->setChecked(true)
->setLabel('Casque');
// Checkbox batterie
$bat = new Zend_Form_Element_Checkbox('PDA_OPT_BATTERIE');
$bat ->setChecked(true)
->setLabel('Batterie');
// Checkbox filaire
$fil = new Zend_Form_Element_Checkbox('PDA_OPT_FILAIRE');
$fil ->setChecked(true)
->setLabel('Filaire');
// Select de l'état
$etat = new Zend_Form_Element_Select('PDA_ETAT');
$etat ->setLabel('Etat')
->setRequired(true)
->addMultiOption(0, "Stock")
->addMultiOption(1, "En prêt")
->addMultiOption(2, "SAV")
->addMultiOption(3, "Sorti du parc")
->setValue('Stock')
->setLabel('Etat')
->addErrorMessage('Vous devez sélectionner un état');
$validPda = new Zend_Form_Element_Submit('envoyer');
$validPda ->setAttrib('id', 'boutonenvoyer');
$this->addElements(array($id, $nomFabriquant, $nomModele, $imei, $nomSite, $dsiv, $boite, $usb, $chargeur, $casque, $bat, $fil, $etat, $validPda));
}
}
私のコントローラー:
<?php
$form = new Application_Form_Pda(); //Création du formulaire
$form->envoyer->setLabel('Modifier'); // Ajout d'un libellé au bouton d'envoi
$this->view->form = $form; // Envoi du formulaire à la vue
if ($this->getRequest()->isPost()) { // si la méthode isPost de l'objet Request renvoi True, le formulaire à été envoyé
$formData = $this->getRequest()->getPost(); // Récupération des données avec la méthode getPost()
if ($form->isValid($formData)) { // Vérification de ces données avec la méthode isValid()
$id = (int)$form->getValue('PDA_ID'); // Récupération de l'ID du fabriquant
$idModele = $form->getValue('MOD_NOM');
$imei = $form->getValue('PDA_IMEI');
$nomSite = $form->getValue('PDA_SITE');
$dsiv = $form->getValue('PDA_ACHATDSIV');
$boite = $form->getValue('PDA_OPT_BOITE');
$usb = $form->getValue('PDA_OPT_USB');
$chargeur = $form->getValue('PDA_OPT_CHARGEUR');
$casque = $form->getValue('PDA_OPT_CASQUE');
$bat = $form->getValue('PDA_OPT_BATTERIE');
$fil = $form->getValue('PDA_OPT_FILAIRE');
$etat = $form->getValue('PDA_ETAT');
$pda = new Application_Model_DbTable_Pda(); // On créé un nouvel enregistrement
$pda->modifierPda($id, $idModele, $imei, $dsiv, $boite, $usb, $chargeur, $casque, $bat, $fil, $nomSite, $etat); // On affecte à cet enregistrement le nom du fabriquant, et on persiste en BDD
$this->_helper->redirector('index'); // pour finir, on redirige vers index de Fabriquant
} else {
$form->populate($formData); // Si la validation n'est pas passée, on réaffiche les données dans le formulaire
}
}
else {
$id = $this->_getParam('id', 0);
//var_dump($id);
if ($id > 0) {
$pda = new Application_Model_DbTable_Pda();
$formData2 = $pda->getPda($id);
//echo "L'ID est : " . $id; // Vérification
$form->populate($formData2);
} else {
echo "Information : nous sommes dans le else de modifierAction de PdaController.php";
echo "L'ID est : " . $id;
}
}
モデル:
<?php
class Application_Model_DbTable_Pda extends Zend_Db_Table_Abstract
{
protected $_name = 'pda';
protected $_primary = 'PDA_ID'; // La primary key
public function getPda($id){
$id = (int)$id;
$row = $this->fetchRow('PDA_ID = ' . $id);
if (!$row) {
throw new Exception("Impossible de trouver la ligne $id");
}
return $row->toArray();
}
public function ajouterPda($idModele, $imei, $dsiv, $boite, $usb, $chargeur, $casque, $bat, $fil, $nomSite, $etat) {
$idModele = (int)$idModele;
$data = array(
'MOD_ID' => $idModele,
'PDA_IMEI' => $imei,
'PDA_ACHATDSIV' => $dsiv,
'PDA_OPT_BOITE' => $boite,
'PDA_OPT_USB' => $usb,
'PDA_OPT_CHARGEUR' => $chargeur,
'PDA_OPT_CASQUE' => $casque,
'PDA_OPT_BATTERIE' => $bat,
'PDA_OPT_FILAIRE' => $fil,
'PDA_SITE' => $nomSite,
'PDA_ETAT' => $etat
);
$this->insert($data);
}
public function modifierPda($id, $idModele, $imei, $dsiv, $boite, $usb, $chargeur, $casque, $bat, $fil, $nomSite, $etat) {
$id = (int)$id;
$idModele = (int)$idModele;
$data = array(
'MOD_ID' => $idModele,
'PDA_IMEI' => $imei,
'PDA_ACHATDSIV' => $dsiv,
'PDA_OPT_BOITE' => $boite,
'PDA_OPT_USB' => $usb,
'PDA_OPT_CHARGEUR' => $chargeur,
'PDA_OPT_CASQUE' => $casque,
'PDA_OPT_BATTERIE' => $bat,
'PDA_OPT_FILAIRE' => $fil,
'PDA_SITE' => $nomSite,
'PDA_ETAT' => $etat
);
$this->update($data, 'PDA_ID = ' . $id);
}
public function supprimerFabriquant($id) {
$this->delete('PDA_ID = ' . (int)$id);
}
}
'Modèle' の ID は DB で適切ですが、要素が DB 値で満たされません...
助けてくれてどうもありがとう!:)