Zend — неизвестный метод current ()

Я сделаю это как можно проще …

У меня есть две сущности: Pds и Specialite

Вот два класса DbTable:

class Application_Model_DbTable_Specialite extends Zend_Db_Table_Abstract
{
/**
* @var $_name : Nom de la table dans la BDD
* @var $_primary : Nom de la clé primaire de la table
* @var $_schema : Nom de la BDD
* @var $_adapter : Allias de la BDD dans le registre de Zend (défini dans le Bootstrap)
*/
protected $_name = 'ps_specialite';
protected $_primary = 'ps_spe_id';
protected $_schema = 'basename';
protected $_adapter = 'db_1';

protected $_referenceMap = array(
'Pds' => array(
'columns'           => 'numprat_id',
'refTableClass'     => 'Pds',
'refColumns'        => 'id'
)
);
}

class Application_Model_DbTable_Pds extends Zend_Db_Table_Abstract
{
/**
* @var $_name : Nom de la table dans la BDD
* @var $_primary : Nom de la clé primaire de la table
* @var $_schema : Nom de la BDD
* @var $_adapter : Allias de la BDD dans le registre de Zend (défini dans le Bootstrap)
*/
protected $_name = 'ps_praticiens';
protected $_primary = 'numprat_id';
protected $_schema = 'basename';
protected $_adapter = 'db_1';
protected $_dependentTables = array('Specialite');
}

Вот две модели:

class Application_Model_Specialite extends Zend_Db_Table_Row_Abstract {
protected $_id;
protected $_id_pds;
protected $_principal;

public function __construct(array $options = null){}

public function __set($name, $value){}

public function __get($name){}

public function setOptions(array $options){}

public function setId($id){}
public function getId(){}

public function setIdPds($id_pds){}
public function getIdPds(){}

public function setPrincipal($principal){}
public function getPrincipal(){}    }

class Application_Model_Pds extends Zend_Db_Table_Row_Abstract {
protected $_id;
protected $_nom;
protected $_nom_pro;
protected $_prenom;

[ ... same contruction as Specialite ... ]
}

И мой PdsMapper.php:

class Application_Model_PdsMapper { protected $_dbTable;

public function setDbTable($dbTable)
{
if (is_string($dbTable)) {
$dbTable = new $dbTable();
}
if (!$dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table data gateway provided');
}
$this->_dbTable = $dbTable;
return $this;
}

public function getDbTable()
{
if (null === $this->_dbTable) {
$this->setDbTable('Application_Model_DbTable_Pds');
}
return $this->_dbTable;
}

public function save(Application_Model_Pds $pds){}

public function find($id, Application_Model_Pds $pds)
{
$result = $this->getDbTable()->find($id);
if (0 == count($result)) {
return;
}
$row = $result->current();
$pds->setId($row->id)
->setNom($row->nom)
->setPrenom($row->prenom);

return $pds;
}

public function fetchAll(){} }

Связь между Pds и Specialite:

  • Pds имеют одну или несколько специальностей
  • Особые касается одного или нескольких Pds

Я хочу получить Specialite of PDS. Вот действие индекса в моем контроллере:

public function indexAction(){
$o_mapper = new Application_Model_PdsMapper();
$pds = $o_mapper->find('69000001', new Application_Model_Pds());
$pds_69000001 = $pds->current();
$specialiteByPds = $pds_69000001->findDependentRowset('Specialite');
$this->view->pds = $pds;
$this->view->specialite = $specialiteByPds;
}

Но приложение говорит мне, что метод current () не распознается … Я пытаюсь заставить его работать со вчерашнего дня, но не вижу, в чем проблема …

заранее спасибо

0

Решение

Сначала взгляните на http://akrabat.com/zend-framework/on-models-in-a-zend-framework-application/

Таким образом, вы делаете несколько вещей неправильно.

Первый Application_Model_Pds продолжается Zend_Db_Table_Row_Abstract который не имеет current метод. (Только Zend_Db_Table_Rowset_Abstract есть это)

Скажи Application_Model_DbTable_Pds который $_rowClass использовать:

class Application_Model_DbTable_Pds extends Zend_Db_Table_Abstract
{
...

protected $_rowClass = 'Application_Model_Pds';
}

Таким образом, вам не нужно передавать его мапперу:

public function find($id)
{
$result = $this->getDbTable()->find($id);
if (0 == count($result)) {
// better return null or throw exception?
return;
}
return $result->current();
}

Также вам не нужны свойства для полей БД. Они должны быть созданы автоматически с именами из базы данных.

class Application_Model_Pds extends Zend_Db_Table_Row_Abstract
{
public function setId($id)
{
$this->id = (int)$id;
}

public function getId()
{
return $this->id;
}

...
}

В контроллере:

public function indexAction()
{
$pds = $o_mapper->find('69000001');
$specialiteByPds = $pds->findDependentRowset('Application_Model_DbTable_Specialite');
$this->view->pds = $pds;
$this->view->specialite = $specialiteByPds;
}

Примечание: не проверено! И я не уверен, что отношения работают. Посмотри Вот для получения дополнительной информации.

Лично мне больше нравится иметь независимый модельный класс, как описано Вот. Кажется, вы пытались смешать эту концепцию с Zend_Db_Table_Row_Abstract как модель концепции.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector