Php Zend findParentRow:无法识别的方法
我是开发和Zend框架的新手。这个问题让我发疯了,我不知道为什么它不起作用 我的应用程序是一个手机管理软件。 我有两门课:“Fabriquant”和“Modele”。举个例子,我有一台移动设备,Fabriquant:Apple和Modele:iPhone4S 我想显示数据库中记录的所有移动设备的列表。我必须在视图中找到每个“模型”的“Fabriquant”数据 这是我的密码:Php Zend findParentRow:无法识别的方法,php,zend-framework,Php,Zend Framework,我是开发和Zend框架的新手。这个问题让我发疯了,我不知道为什么它不起作用 我的应用程序是一个手机管理软件。 我有两门课:“Fabriquant”和“Modele”。举个例子,我有一台移动设备,Fabriquant:Apple和Modele:iPhone4S 我想显示数据库中记录的所有移动设备的列表。我必须在视图中找到每个“模型”的“Fabriquant”数据 这是我的密码: index.phtml <table> <tr> <th&
index.phtml
<table>
<tr>
<th>Fabriquant</th>
<th>Modèle</th>
<th> </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.php:
类应用程序\u Model\u DbTable\u Modele扩展了Zend\u Db\u Table\u抽象
{
这是我的ModeleRow.php:
类ModeleRow扩展了Zend\u Db\u Table\u Row\u 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}
我想这将是一个新手问题,但我已经讨论了两天,我没有发现问题…非常感谢你的帮助
编辑:
这是我的ModeleController.php(对不起,这里有我所有的个人评论…)
类ModeleController扩展Zend\u控制器\u操作
{
}敬礼
在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集成
编辑
我敢肯定这句话是错的:
受保护的$_rowClass='ModeleRow'
您必须写入类的完整名称,而不仅仅是文件名。请将代码发布到获取模型的位置好吗?例如,
$table=new MyTable();$row=$table->fetchRow($table->where('id=?',1));
这些更改没有解决问题,getFabriquant()方法仍然不被认可…对于表的复数形式,我的MERISE老师告诉我们用单数形式写它们…这就是为什么…但我想它可以起作用,对吗?我知道MERISE,但当你必须找到一个工作时,你会使用实体/关系或UML来建模你的数据库。谢谢你的评论,Camus。我写道这是因为我从本教程中改编了它:。在本教程中,我们有:
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;
}
}
}
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',
)
);