2012-02-20 4 views
0

私はバックエンドクラッシュ操作用のzend dbテーブルモデルを使用しています。しかし、このようなモデルは、フロントエンドのデータ表示では、カテゴリ別のニュース、さまざまなテーブルからのニュースやブログウィジェットなど、さまざまなテーブルに参加するのに意味がないと思います。ウェブサイトのフロントエンド用のzendモデル

クラスのバグを取得Zend_Db_Table_Abstract {

protected $_name = 'bugs'; } 

モデルを拡張し、この方法は、どのように私は、フロントエンド操作するためのモデルを作成し、任意の例は非常にappreceatedされるだろう、私のバックエンドの管理パネルのCRUD操作に最適です。ありがとう

答えて

1

ZFでお聞きしていることはView Helperであると思います。ビューヘルパーはモデルからデータを取り出し、コントローラで処理することなくビューにダンプできます。ここで簡単な例である:

<?php 

class Zend_View_Helper_Track extends Zend_View_Helper_Abstract 
{ 
    /** 
    * 
    * @param type $trackId 
    * @return type object 
    */ 
    public function Track($trackId) { 
     //this model just aggregates data from several DbTable models 
     $track = new Application_Model_TrackInfo(); 
     $data = $track->getByTrackId($trackId); 

     return $data; 
    } 

} 

ビューヘルパーは、いくつかのデータ(オブジェクト、文字列、アレイ、ブール値)を返すことによって特徴付けられるとビューとパーシャルにデータを供給するために使用することができます。
次は、いくつかのビューヘルパーを使用してデータを表示する、partialの例です。限りDBTABLEモデルはフロントエンドのために無用であるとして、あなたは驚くかもしれません

<?php echo $this->partial('_dates.phtml', $this->memberData) ?> 

<fieldset><legend>Dates and Qualifications</legend> 
    <table> 
     <tr> 
      <td>Birth Date: </td><td><?php echo $this->escape($this->FormatDate($this->bdate)) ?></td> 
     </tr> 
     <tr> 
      <td>Seniority Date: </td><td><?php echo $this->escape($this->FormatDate($this->sendate)) ?></td> 
     </tr> 
    </table> 
    <table> 
     <tr> 
      <td>I'm a Lead:</td><td><?php echo $this->escape(ucfirst($this->ToBool($this->lead))) ?></td> 
     </tr> 
     <tr> 
      <td>Lead Date:</td><td><?php echo $this->escape($this->FormatDate($this->ldate)) ?></td> 
     </tr> 
     <tr> 
      <td>I'm an Inspector:</td><td><?php echo $this->escape(ucfirst($this->toBool($this->inspector))) ?></td> 
     </tr> 
     <tr> 
      <td>Admin Login:</td><td><?php echo $this->escape(ucfirst($this->toBool($this->admin))) ?></td> 
     </tr> 
    </table> 
</fieldset> 

とは最終的に私はビューでこの部分を呼び出します。 DbTableクラスにテーブル間にrelationshipsが正しく設定されると、できることの機能がうまく機能します。しかし、ほとんどの人に似ている場合は、DbTableクラスとアプリケーションの間に少なくとも1つのドメインモデル(mappersservicerepository)が存在する可能性があります。

これはリレーションシップを持つモデルです。ナビゲーションを構築するためにデータを供給することが唯一の目的です。

<?php 

class Application_Model_DbTable_Menu extends Zend_Db_Table_Abstract { 

    protected $_name   = 'menus'; 
    protected $_dependentTables = array('Application_Model_DbTable_MenuItem'); 
    protected $_referenceMap = array(
     'Menu' => array(
      'columns'  => array('parent_id'), 
      'refTableClass' => 'Application_Model_DbTable_Menu', 
      'refColumns' => array('id'), 
      'onDelete'  => self::CASCADE, 
      'onUpdate'  => self::RESTRICT 
     ) 
    ); 

    public function createMenu($name) { 

     $row = $this->createRow(); 
     $row->name = $name; 

     return $row->save(); 
    } 

    public function getMenus() { 

     $select = $this->select(); 
     $select->order('name'); 

     $menus = $this->fetchAll($select); 
     if ($menus->count() > 0) { 
      return $menus; 
     } else { 
      return NULL; 
     } 
    } 

    public function updateMenu($id, $name) { 

     $currentMenu = $this->find($id)->current(); 

     if ($currentMenu) { 
      //clear the cache entry for this menu 
      $cache = Zend_Registry::get('cache'); 
      $id = 'menu_' . $id; 
      $cache->remove($id); 
      $currentMenu->name = $name; 
      return $currentMenu->save(); 
     } else { 
      return FALSE; 
     } 
    } 

    public function deleteMenu($menuId) { 

     $row = $this->find($menuId)->current(); 

     if ($row) { 
      return $row->delete(); 
     } else { 
      throw new Zend_Exception("Error loading menu..."); 
     } 
    } 

} 

Zend_Db_Table_Abstractはそのいくつかのデータ・アクセス・パターンのためのインタフェースを提供し、あなただけのビジネスロジックを提供する必要があり、あなたが欲しい抽象化のレベルを何でも。

+0

私はフロントエンドのデータ操作と表示に同じDBTableクラス(バックエンドで使用)を使用していますか? – ktm

+0

@Rajendra私たちは私たちが循環的な議論に参加していると思います。コントローラとビューにデータを提供するdbTableを使って編集を投稿しました。 – RockyFord

2

Zend_Db_Table由来のモデルでも、他のテーブルに参加することができます。完全性チェックを必ずオフにしてください。

コード(テストしていません)このようなものになります:あなたのコントローラに続いて

class My_Model_News extends Zend_Db_Table 
{ 
    // Hate the 'tbl_' prefix. Just being explicit that this is a 
    // table name. 
    protected $_name = 'tbl_news'; 

    public function fetchNewsByAuthor($authorId) 
    { 
     $select = $this->select(); 
     $select->setIntegrityCheck(false) 
       ->from(array('n' => 'tbl_news'), array('*')) 
       ->join(array('a' => 'tbl_author'), array('n.author_id = a.id'), array('author_name' => 'a.name')) 
       ->order('n.date_posted DESC'); 
     return $this->fetchAll($select); 
    } 
} 

を:

$authorId = $this->_getParam('authorId'); 
$newsModel = new My_Model_News(); 
$this->view->articles = $newsModel->fetchNewsByAuthor($authorId); 

真実が語られ、それが最もTableGatewayについてフラット私の葉ものの一つですアプローチは、Zend_Db_Tableのようになります。 TableGatewayは単一テーブルのクエリに最適ですが、実際の状況ではほとんどの場合、マルチテーブルが必要です。結果として、私は単一のテーブルに結び付けられていないモデルを作成することになりますが、Zend_Db_Adapterインスタンスを受け入れ、必要なテーブルにクエリ/結合します。あるいは、私はDoctrineのようなもっと複雑なORMに行きます。

+0

定義された関係では、Db_Tableは、たくさんの結合がない合理的な仕事をしています。また、Zend_Dbは決してDoctrineではありませんでした。目的と範囲が異なる2つの全く異なる動物。 – RockyFord

+0

@RockyFord:そうです。 'Zend_Db'は、完全なORMであるとは言いません。 TableGatewayの機能は大丈夫です。 ;-)私は関係の機能性について完全に調査したことがないと告白します。関係を介して依存する行セットを取得すると、別のクエリが生成されるという印象を受けました。ですから、10の記事(たとえば著者名)を取り出してレンダリングすれば、その記事の1つのクエリと、関連する著者情報のための10のクエリを探しています。そのため、私はしばしば参加を選択します。しかし、もし私がそれをすべて馬鹿にしてしまえば - 可能性よりも! ;-) - それから私はZDTをもう一度見せます。 –

+0

私は正直なところ、電話をかけていないので、わかりません。それは少し重く感じるので、あなたはそれが何をするかについておそらく正しいでしょう。 – RockyFord

関連する問題