2

私は OOP と MVC が初めてで、現在 CodeIgniter を使用して Web サイトを構築しています。

ループがビューにあるべきか、モデルにあるべきかについて、多くの対照的な情報があるようです。

一方で、すべての 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>';
    }
}
4

3 に答える 3

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()。これははるかに理にかなっていて、テンプレートでコメントする必要はありません。

于 2013-07-09T22:30:49.997 に答える
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);
}

どのループがどこで何を処理しているかに関して、フレームワークの選択を検討してください。ただし、モデル、ビュー、またはコントローラーで必要な場合はループを使用する必要があります。

于 2013-07-09T22:29:54.090 に答える