0

我是开发和 Zend 框架的新手。我对这个问题发疯了,我不知道为什么它不起作用。

我的应用程序是一个手机管理。我有 2 个课程:“Fabriquant”和“Modele”。因此,例如,我有一个带有 Fabriquant:Apple 和 Modele:iPhone 4S 的移动设备。

我想显示我的数据库中记录的所有移动设备的列表。我必须在我的视图中找到每个“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>

所以这条线有问题:

转义($modele->getFabriquant()->FAB_NOM);

我的 Fabriquant.php:类 Application_Model_DbTable_Fabriquant 扩展 Zend_Db_Table_Abstract {

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

这是我的 Modele.php: 类 Application_Model_DbTable_Modele 扩展 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: 类 ModeleRow 扩展 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 (对不起,这是我所有的个人评论......)

类 ModeleController 扩展 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');

在模型类中,我认为参考图是错误的:

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

和列应该是一个数组。

ps:我建议您以复数形式命名您的 RDBMS 中的表,但以单数形式命名您的模型。当您有时间时,您可以检查 Zend/Doctrine 集成。

编辑

我很确定这条线是错误的:

受保护的 $_rowClass = 'ModeleRow';

你必须写出类的全名,而不仅仅是文件名。

于 2012-05-18T09:53:29.083 回答