0

私は開発と Zend Framework の初心者です。そして、私はこの問題に夢中になっています。なぜうまくいかないのかわかりません。

私のアプリは携帯電話の管理です。「Fabriquant」と「Modele」の 2 つのクラスがあります。たとえば、Fabricant が Apple、Modele が iPhone 4S のモバイル デバイスがあります。

DB に記録されているすべてのモバイル デバイスのリストを表示したいと考えています。ビュー内の「Modele」ごとに「Fabriquant」データを見つける必要があります。

これが私のコードです:

    index.phtml
    <table>
    <tr>
    <th>Fabriquant</th>
    <th>Modèle</th>
    <th>&nbsp;</th>
    </tr>
    <?php 
    foreach($this->modele as $modele) : ?>
    <tr>
    <td><?php echo $this->escape($modele->getFabriquant()->FAB_NOM); // $modele->FAB_ID affiche bien l'ID du fabriquant></td>
    <td><?php echo $this->escape($modele->MOD_NOM);?></td>
    <td>
    <a href="<?php echo $this->url(array('controller'=>'modele',
    'action'=>'modifier', 'id'=>$modele->MOD_ID));?>">Modifier</a>
    <a href="<?php echo $this->url(array('controller'=>'modele',
    'action'=>'supprimer', 'id'=>$modele->MOD_ID));?>">Supprimer</a>
    </td>
    </tr>
<?php endforeach; ?>
</table>

したがって、この行には問題があります。

escape($modele->getFabriquant()->FAB_NOM);

私の Fabriquant.php: class Application_Model_DbTable_Fabriquant extends Zend_Db_Table_Abstract {

protected $_name    = 'fabriquant';
protected $_primary = 'FAB_ID';     // La primary key
protected $_fabNom  = 'FAB_NOM';

これが私の Modele.php です: class Application_Model_DbTable_Modele extends Zend_Db_Table_Abstract {

protected $_name        = 'modele';     // Le nom de la table dans la BDD
protected $_primary     = 'MOD_ID';     // La clef primaire dans la table de la BDD
protected $_fabId       = 'FAB_ID';
protected $_modNom      = 'MOD_NOM';
protected $_rowClass    = 'ModeleRow';  //Le nom de la classe Zend_Db_Table_Row_Abstract

protected $_referenceMap = array(   // La table fabriquant dépendante
    'fabriquant' => array(
                    'columns'       =>  'FAB_ID',       // Colonne de la clé primaire
                    'refTableClass' =>  'Fabriquant',   // Nom de la CLASSE correspondante
                    'refColumns'    =>  'FAB_ID'
    )
);

...

これは私の ModeleRow.php です: class ModeleRow extends Zend_Db_Table_Row_Abstract {

public function getFabriquant(){
    $fabriquant = $this->findParentRow('fabriquant');
}

}

このエラー メッセージと次のスタックがあります。

Message: Unrecognized method 'getFabriquant()' 

Stack trace:

#0 D:\PHP Workspace\mona\application\views\scripts\modele\index.phtml(21): Zend_Db_Table_Row_Abstract->__call('getFabriquant', Array)
#1 D:\PHP Workspace\mona\application\views\scripts\modele\index.phtml(21): Zend_Db_Table_Row->getFabriquant()
#2 C:\wamp\www\ZendFramework-1.11.11\library\Zend\View.php(108): include('D:\PHP Workspac...')
#3 C:\wamp\www\ZendFramework-1.11.11\library\Zend\View\Abstract.php(888): Zend_View->_run('D:/PHP Workspac...')
#4 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\Helper\ViewRenderer.php(900): Zend_View_Abstract->render('modele/index.ph...')
#5 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\Helper\ViewRenderer.php(921): Zend_Controller_Action_Helper_ViewRenderer->renderScript('modele/index.ph...', NULL)
#6 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\Helper\ViewRenderer.php(960): Zend_Controller_Action_Helper_ViewRenderer->render()
#7 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\HelperBroker.php(277): Zend_Controller_Action_Helper_ViewRenderer->postDispatch()
#8 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action.php(527): Zend_Controller_Action_HelperBroker->notifyPostDispatch()
#9 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#10 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#11 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#12 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#13 D:\PHP Workspace\mona\public\index.php(98): Zend_Application->run()
#14 {main}  

これは初心者の質問だと思いますが、2日間使用していますが、問題が見つかりません...助けてくれてありがとう!

編集: ここに私の ModeleController.php があります (申し訳ありませんが、すべて私の個人的なコメントがあります...)

class ModeleController extends Zend_Controller_Action {

public function init()
{
    /* Initialize action controller here */
}

public function indexAction()
{
    Zend_Loader::loadClass("Modele", APPLICATION_PATH . "/models"); // indique l'emplacement du modèle
    //require_once 'FabriquantController.php';
    $this->view->title = "Liste des modèles"; // le titre affiché
    // Traitement du controleur
    $modele = new Modele();
    //.....traitement...

    // Transmet à la vue
    $this->view->modele = $modele->fetchAll();
        }

public function ajouterAction()
{
    $this->view->title = "Ajouter un nouveau modèle";
    $form = new Application_Form_Modele();                  // Création du formulaire
    //var_dump($form);
    $form->envoyer->setLabel('Ajouter');                        // Ajout d'un libellé au bouton d'envoi
    $this->view->form = $form;      

    if ($this->getRequest()->isPost()) {
        $formData = $this->getRequest()->getPost();
        if ($form->isValid($formData)) {
            $fabAccessData  = new Application_Model_DbTable_Fabriquant();
            $idFab          = $form->getValue('FAB_NOM');
            $nomModele      = $form->getValue('MOD_NOM');
            $accessData     = new Application_Model_DbTable_Modele();

            $accessData->ajouterModele($idFab, $nomModele);

            $this->_helper->redirector('index');
        } else {
            $form->populate($formData);
        }
    }
}

public function lireAction()
{
    // action body
}

public function supprimerAction()
{
if ($this->getRequest()->isPost()) {
        $del = $this->getRequest()->getPost('del');
        if ($del == 'Oui') {
            $id = $this->getRequest()->getPost('id');
            $modele = new Application_Model_DbTable_Modele();
            $modele->supprimerModele($id);
        }
        $this->_helper->redirector('index');
    } else {
        $id = $this->_getParam('id', 0);
        $modele = new Application_Model_DbTable_Modele();
        $this->view->modele = $modele->getModele($id);
    }
}

public function modifierAction()
{
$this->view->title = "Modifier un modèle";
    $form = new Application_Form_Modele();                  // Création du formulaire
    $form->setAction($this->view->url(array('controller' => 'modele', 'action' => 'modifier'), 'default', true));
    $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('MOD_ID');               // Récupération de l'ID du fabriquant
            $nomFabriquant = $form->getValue('FAB_NOM');
            $fabriquant = new Application_Model_DbTable_Fabriquant();
            $idFabriquant = $fabriquant->getIdFabricant($nomFabriquant);
            $nomModele = $form->getValue('MOD_NOM');            // On récupère le nom du fabriquant
            $modele = new Application_Model_DbTable_Modele();   // On créé un nouvel enregistrement
            $modele->modifierModele($id, $idFabriquant, $nomModele);    // 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) {

                $modele = new Application_Model_DbTable_Modele();
                $fabriquant = new Application_Model_DbTable_Fabriquant();
                $Fabriquant = $fabriquant->getFabriquant($id);
                $nomFabriquant = $Fabriquant['FAB_NOM'];
                //var_dump($nomFabriquant);
                $nomModele = $modele->getModele($id);
                echo "L'ID du modèle est : " . $id;     // Vérification
                //echo "L'ID du fabriquant est : " . $nomFabriquant['FAB_NOM'];     // Vérification
                $form->populate($nomModele, $nomFabriquant);
                //$form->populate($nomFabriquant);
            } else {
                echo "Information : nous sommes dans le else de modifierAction de FabriquantController.php";
                echo "L'ID est : " . $id;
            }
        }
}

}

4

1 に答える 1

0

敬礼 ,

Frabicant クラスでは、私が考える依存テーブルは何かを言う必要があるかもしれません。

 protected $_dependentTables = array('Application_Model_DbTable_Modele');

モデルクラスでは、refマップが間違っていると思います:

protected $_referenceMap = array(   // La table fabriquant dépendante
    'fabriquant' => array(
                    'columns'       =>  array('FAB_ID'),    
                    'refTableClass' =>  'Application_Model_DbTable_Fabriquant',  
    )
);

列は配列でなければなりません。

ps : RDBMS 内のテーブルには複数形で名前を付け、モデルには単数形で名前を付けることをお勧めします。時間があれば、Zend/Doctrine の統合を確認できます。

編集

私はこの行が間違っていると確信しています:

protected $_rowClass = 'ModeleRow';

ファイルの名前だけでなく、クラスの名前全体を記述する必要があります。

于 2012-05-18T09:53:29.083 に答える