Yii CListView 并与 MVC 原则相冲突



Yii masters!

我们有一个博客。博客有一个包含作者列表的页面。作者存储在作者表中。我使用基本的 Yii-widget CListView 来显示它:

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

作者/视图.php:

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

但除了有关作者的信息外,此列表还必须包含每个作者的五篇随机相关文章的 URL。文章标题存储在文章表中。现在我使用一个丑陋的解决方案(视图/作者/_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 方式做到这一点吗?我怀疑这可以通过模型关系和范围来完成......但不幸的是,我不知道如何。

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)在你的观点(观点/作者/_view.php)中,你可以做这样的事情。

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

这样可以节省大量 sql 查询。

相关内容

  • 没有找到相关文章

最新更新