0

自分で解決策を見つけるにはいくつかの問題があるため、コミュニティに質問します。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 値で満たされません...

助けてくれてどうもありがとう!:)

4

1 に答える 1

1

FAB_NOMDBテーブルから値を渡していないように見えるため、正しく入力されないように見えます。

また、「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 に答える