0

我正在 Yii 中创建一个新的 Portlet。此小部件显示问题的最新评论。我只想在 Issue 有评论时显示这个,如果 Issue 没有任何评论,则不显示它(事件标题)。

所以我在视图文件中的伪代码如下:

检查评论数量的过程:

<?php
$countIssue = count($model->issues);
$i = 0; $j = 0;
while($i < $countIssue)
{
    $j += $model->issues[$i]->commentCount;
    $i ++;
}
?>

if ($countIssue >0 ) {
  if ($j >0)
  Display the widget
}

Else

Don't display the widget

我只是想知道我的代码是否适合 MVC 模型。你能给我一个方向吗?我应该将评论过程的检查编号带到 Model 或 Controller ,还是上面的 MVC 模式可以?

谢谢!

4

2 回答 2

0

首先,我会将这个逻辑移到您的 portlet 类(扩展 CPorlet 的那个)的 run() 方法中。

接下来,我将在 Issue 类中定义一个STAT 关系。此关系仅用于计算评论,并允许您使用如下语句:

$issue = Issue::model()->findByPk($issue_id);
// $comments_count below is exactly what you would expect... .
$comments_count = $issue->commentsCount;

最后,结合所有这些,我建议在 portlet 的 run() 方法中使用以下方法,如下所示:

If ($someIssue->commentsCount > 0) {
  // do something and in the end, when you want to render the portlet, you do...
  $this->render("view_file_name");
}
于 2012-08-09T13:39:31.997 回答
0

我认为有很多 MVC 友好的方法可以做到这一点,主要想法是将数据逻辑放在模型中,然后通过控制器处理请求,而理想情况下,视图应该仅用于显示目的。

我个人将使用 Yii命名范围(最初来自 Rails)来实现最新的过滤器,如下所示:

模型:

class Comment extends CActiveRecord
{
  ......
  public function scopes()
  {
    return array(
        'recently'=>array(
            'order'=>'create_time DESC',
            'limit'=>5,
        ),
    );
  }
}

如果只有问题有一些问题,要获得列表评论,您可以在Controller中执行以下操作:

if($issue->comments)
  $isseComments = Comment::model()->recently()->findAll(); //using the named scope to the recent ones only

$this->render('your_action',array(
      .....
      'issue' => $issue,
      'issueComments'=>$isseComments,
));

您的视图将保持整洁:

if($issueComments > 0)
  //Display the widget
else
  // Don't
于 2012-08-09T14:19:00.050 回答