带有逻辑和html输出的循环应该放在模型还是视图中?

时间:2013-07-09 22:11:26

标签: php codeigniter templates loops

我是OOP和MVC的新手,目前正在使用CodeIgniter建立一个网站。

似乎有很多关于循环应该在视图还是模型中的对比信息。

一方面,我试图将所有的html标记保留在视图中,但另一方面,我希望将混乱的PHP逻辑保留在视图之外。另外,我还需要使用模型中的函数来格式化循环内的数据。

组织此活动的最佳方式是什么?

以下是我当前实现的简化版本:

查看

<section>
    <ul>
        <?php echo $albumTracklistHtml ?>
    </ul>
</section>

控制器

$data = [
    '$albumTracklistHtml' => $this->MyModel->getAlbumTracklistHtml()
];

$this->load->view('myPage', $data);

模型

public function getAlbumTracklistHtml()
{
    //$this->tracklisting returned from db call in other function
    foreach($this->tracklisting as $song) {
        $mp3 = $this->convertToAmazonUrl($song['mp3']);
        $art = $this->formatArtUrl($song['art']);
        $name = $this->formatTrackName($song['name']);
        $class = 'mp3';
        $btn ='';
        if(substr($name, 0, 1) == '*') {
            $class = 'load mp3';
            $btn = '<span class="playBtn"></span>';
        }
        <li class="'.$class.'" '.$mp3.'>'.$btn.$name.'</li>';
    }
}

3 个答案:

答案 0 :(得分:3)

非常一般地说,请记住,这不是一个硬性规则,如果你问十个不同的人,你会得到十个不同的答案,但模型视图和控制器的工作基本上是: / p>

  1. 该模型为控制器提供了一种方法。查看从另一个源(例如,数据库)访问数据。它基本上是对存储数据的抽象。
  2. 视图只显示给出的数据。
  3. 控制器将模型的数据与视图连接起来,因此它可以显示数据。
  4. 我认为你发布的示例代码很好,并且符合这些定义。您的模型检索数据(或处理它),控制器将结果数据传递给视图,视图只显示它。

    但是,我也认为它很好(并且通常我更喜欢这个)模型只返回一个项目列表,然后让视图循环遍历它们并显示每个项目。当然,视图“不应该”进行大量处理,但是为每个项目输出HTML似乎正是它应该做的事情。我更喜欢这个的原因纯粹是为了分离问题 - 你的模型应该是与HTML无关的。如果您曾编写过非基于Web的应用程序来与相同数据进行交互,可以使用相同的模型。因此,我会在我的视图中放置任何HTML呈现代码。即使它需要一些循环逻辑。

    但是,在一天结束时,我认为 在你的情况下很重要。如果你更喜欢把循环放在模型中,那就去吧。 最重要的事情只是制定自己的约定,然后坚持

答案 1 :(得分:1)

以下是我的观点:

<section>
    <ul>
        <?php foreach($album->getTracks() as $track): ?>
            <li
                class="<?php echo $track->isPlayable() ? 'load mp3' : '' ?>"
            >
                <span class="playBtn">
                    <?php echo $track->getName() ?>
                </span>
            </li>
        <?php endforeach ?>
    </ul>
</section>

这假定您传递了一个名为$album的变量,并且其中提供的方法返回类型为Track的数组。

如果您愿意,也可以返回数组,但我更喜欢对象,因为您可以将复杂条件转换为简单有意义的名称。因此,程序员调用$track->isPlayable()而不是你的'*'测试,这更有意义,并且不需要在模板中进行评论。

答案 2 :(得分:0)

根据我的经验,这取决于循环的作用。可以具有视图特定循环。您可以循环显示动态显示元素的html标记,并且应该放在视图中。

for($controller_sent_array as $element) 
{
    echo "<h4>$element</h4>";
}

然而,循环文件输入之类的东西应该放在控制器/模型端。我在这里提出一个模糊的观点,因为模型与控制器的选择取决于框架优化。但重要的是模型和控制器不发送要呈现的html。相反,他们应该从数据库或用户输入或网络连接处理数据,并打包该数据以供视图找出。为此,您还需要循环。

// This is not a safe way to do this in real life...
for($_POST as $post_input)
{
    $this->your_database_library->save_input($post_input);
}

考虑你的框架选择,关于哪些循环正在处理什么,但是在模型,视图或控制器中需要时应该使用循环。