Kod
class News extends Zend_Db_Table_Abstract {
protected $_name = 'News';
function getNewsByTitle($title) {
$where = array('title = ?' => $title);
return $this->fetchRow($where);
}
}
protected $_name = 'News';
function getNewsByTitle($title) {
$where = array('title = ?' => $title);
return $this->fetchRow($where);
}
}
Kontroler
Kod
class News_Controller_Action extends Zend_Controller_Action {
function indexAction() {
$this->view->news->$this->_dbNews->getNewsByTitle('Alamakota');
}
}
function indexAction() {
$this->view->news->$this->_dbNews->getNewsByTitle('Alamakota');
}
}
Kod oczywiście jest mocno uproszczony.
Jak dotąd wszystko proste i przyjemne. Założmy jednak że chcę rozszerzyć zwrócony mi przez model obiekt. Załóżmy, że w widoku
chcę mieć galerię, ale jej elementy wyświelić dopiero jeśli do newsa są dodane jakiekolwiek zdjęcia. Chciałbym to sprawdzić w
widoku za pomocą metody $this->news->hasGallery().
I tu zaczynają się problemy. Nie moge dodąc po prostu metody do zwróconego obiektu. Najczęstszą radą jest zrobienie modelu w
dwóch klasach: jedna obłsuguje praktycznie tylko CRUD, i druga, która obsługuje obiekt pierwszej, tam tworzymy sobie dodatkowe
metody i ten właśnie obiekt zwracamy do kotrolera i do widoku. Otrzymujemy coś na kształt:
Kod
class NewsGateway extends Zend_Db_Table_Abstract {
protected $_name = 'News';
function getNewsByTitle($title) {
$where = array('title = ?' => $title);
return $this->fetchRow($where);
}
}
protected $_name = 'News';
function getNewsByTitle($title) {
$where = array('title = ?' => $title);
return $this->fetchRow($where);
}
}
Kod
class News {
protected $_name = 'News';
function __construct(NewsGateway $news) {
$this->galleryGateway = new GalleryGateway();
$this->title = $news->title
$this->preface = $news->preface // etc. kolumny z tabeli news
}
function isGallery() {
$this->galleryGateway->isGallery(NewsGateway);
}
}
protected $_name = 'News';
function __construct(NewsGateway $news) {
$this->galleryGateway = new GalleryGateway();
$this->title = $news->title
$this->preface = $news->preface // etc. kolumny z tabeli news
}
function isGallery() {
$this->galleryGateway->isGallery(NewsGateway);
}
}
Kontroler
Kod
class News_Controller_Action extends Zend_Controller_Action {
function indexAction() {
$news->$this->_dbNews->getNewsByTitle('Alamakota');
$this->view->news = $this->News($news);
}
}
function indexAction() {
$news->$this->_dbNews->getNewsByTitle('Alamakota');
$this->view->news = $this->News($news);
}
}
Oczywiście po raz kolejny kod mocno uproszczony. Chodzi tylko o pewne zobrazowanie.
Głowne zarzuty przeciw takiemu rozwiązanie:
- nie powinno dopuszczać widoku do manipulownia na danych, a np. utworzenie metody getChild() dla pobrania jakiegoś potomka już jest taką manipulacją
- zbyt mocne powiązanie modelu z bazą w tabeli - teoretycznie powinien byc gotowy do przyjecia danych także z innych źródeł np. XML
Bardzo proszę o radę w tej sprawie. Jak wy radzicie sobie z takim problemem?
Z góry dziękuję za pomoc.