0

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

我有一个表格,里面有一些 SELECT 元素。其中一些填充了来自数据库的数据,而另一些则填充了表单内的数据 (->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 值……知道吗?

非常感谢你的帮助!:)

4

1 回答 1

1

在我看来,它FAB_NOM不会正确填充,因为您似乎没有从数据库表中传递值。

还有“MOD_NOM likes like it will work if you rename it toMOD_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()正常工作,您需要有一些表单识别为属于元素的数据。通常我们通过将表单元素命名为与我们要在数据库中填充的列相同的名称来实现这一点。

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

于 2012-05-22T06:53:57.203 回答