2012-05-21 1 views
0

솔루션을 직접 찾을 수있는 몇 가지 문제점이 있습니다. 그래서 커뮤니티에 요청하는 것입니다. 젠드 프레임 워크로 앱을 개발 중입니다.젠드 : DB에서 요소를 선택하여 업데이트 할 수 없습니다.

일부 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 값으로 채우지 않습니다 ... 어떤 생각?

도움을 주셔서 감사합니다. :)

답변

1

FAB_NOM은 DB 테이블의 값을 전달하지 않는 것 같아 올바르게 표시되지 않습니다.

또한 'MOD_NOM likes like it will work if you rename it to MOD_ID`입니다. populate() 위해서는

//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 
     ); 

은 양식 요소에 속하는 것으로 인식하고 일부 데이터가 필요 제대로 작동합니다. 일반적으로 우리는 우리의 데이터베이스에 채울 컬럼과 양식 요소의 이름을 동일하게 지정하여이를 수행합니다.

현재 문제가있는 선택 요소에는 과 같은 이름의 열이있는 것 같지 않습니다.

+0

알았습니다! 그것이 문제였습니다. 초보자 실수. 도와 주셔서 감사합니다. – JuJ