Zend:无法填充()从数据库中选择元素进行更新


Zend: Can't populate() select element from DB for update

我有一些问题需要自己找到解决方案,这就是我问社区的原因。我正在开发一个带有Zend Framework的应用程序。

我有一个表格,有一些选择元素。其中一些填充了来自数据库的数据,而另一些则填充了表单中的数据(->addMultiOption(0,'Option 1'(...(。

插入效果很好,但我在更新功能方面遇到了一些麻烦。用表单内的选项填充的 SELECT 元素填充成功,但填充了数据库数据的 SELECT 元素未正确设置。数据库表的第一个选项始终处于选中状态。

所以我想我的代码有问题。我删除了一些元素以提高可见性。

我的表格:

<?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 值......知道吗?

非常感谢您的帮助! :)

在我看来

FAB_NOM不会正确填充,因为您似乎没有从数据库表中传递值.

也"MOD_NOM likes like it will work if you rename it to MOD_ID"。

//no data present to reference to FAB_NOM and MOD_ID is present but MOD_NOM is not    
$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
        );

为了使populate()正常工作,您需要有一些表单识别为属于元素的数据。通常,我们通过命名表单元素与要在数据库中填充的列相同的列来实现这一点.

目前,您遇到问题的选择元素似乎没有关联同名的列。