2012-10-04 55 views
0

Yii高手!Yii CListView與MVC原理衝突

我們有一個博客。博客有一個包含作者列表的頁面。作者存儲在AUTHOR表中。我使用基本的Yii的小部件CListView中表現出來:

public function actionIndex() { 
    $dataProvider = new CActiveDataProvider('Author'); 
    $this->render('index', array(
     'dataProvider' => $dataProvider, 
    )); 
} 

而不是意見/作者/ view.php:

$this->widget('zii.widgets.CListView', array(
    'dataProvider' => $dataProvider, 
    'itemView' => '_view', 
)); 

但除了關於作者的信息,這個名單必須包含的網址爲每位作者提供五篇隨機相關文章。文章標題存儲在ARTICLE表中。現在我用一個醜陋的解決方案(意見/作家/ _view.php):

<ul class="experts-node-articles-list"> 
    <?php $authorArticles = Article::model()->findAllByAttributes(
     array('author_id' => $data->id), 
     array('limit' => '5' 
    )); ?> 
    <?php foreach ($authorArticles as $item) : ?> 
    <li><a href="#"><?php echo CHtml::encode($item->title); ?></a></li> 
    <?php endforeach; ?> 
</ul> 

這是醜陋的,因爲在一個視圖中調用模型。這是與MVC原則恕我直言的衝突。我能以真正的MVC方式做到這一點嗎?我懷疑它可以通過模型關係和範圍來完成......但不幸的是,我不知道如何。

回答

2

1)創建關係作者模型。 (你可以添加/更新relations()方法是這樣)

public function relations() 
{ 
    return array(
     ..... 
     'randomArticles' => array(
      self::HAS_MANY, 
      'Article', 
      'author_id', 
      'limit' => 5, 
      'order' => 'RAND()', 
     ), 
     ..... 
    ); 
} 

2)您的數據提供程序必須是這樣的。

$dataProvider = new CActiveDataProvider('Author', array(
    'criteria'=>array(
     'with'=>array('randomArticles'), 
    ), 
)); 

3)在你的視圖(views/authors/_view.php)中,你可以做這樣的事情。

foreach($data->randomArticles as $article) { 
    // display $article info, something like below 
    $this->renderPartial('_artical_info', array('article' => $article)); 
} 

這節省了大量的sql查詢。