2

ビューで条件付きブロックを使用すると、MVC アーキテクチャの目的が無効になりますか?

ビューをロードするコントローラー メソッドがあり、そのメソッドにパラメーターとして渡されたページ ID に基づいて、別のボタン グループが必要です。

すべて正常に動作しますが、私の見解ではいくつかあります:

<?php if($pageID == n) : ?>
    html content...
<?php endif; ?>

これは悪い習慣ですか? もしそうなら、より良い解決策は何ですか? 私の見解からライブラリメソッドを呼び出すことも間違っているようです。

4

2 に答える 2

2

この解決策を回避する方法はいくつかありますが、問題の規模によって異なります。

より良い解決策は、次のようなものかもしれません。

意見

<?php echo $conditional_html; ?>

コントローラ

switch($pageID)
{
  case 1:
        $data['conditional_html'] = $this->load->view('the_first_id_html', TRUE);
        break;
  case 4:
  case 7:
  case 8:
        $data['conditional_html'] = $this->load->view('some_special_html', TRUE);
        break;
  case 13:
  case 18:
        $data['conditional_html'] = $this->load->view('the_secret_menu_html', TRUE);
        break;
  default:
    $data['conditional_html'] = $this->load->view('the_default_html', TRUE);
}
$this->load->vars($data);

ビュー内にビューをロードすることを気にしない場合は、別の簡単な方法で次のようにすることができます。

意見

<?php $this->load->view($conditional_html); ?>

コントローラ

switch($pageID)
{
  case 1:
        $data['conditional_html'] = 'the_first_id_html';
        break;
  case 4:
  case 7:
  case 8:
        $data['conditional_html'] = 'some_special_html';
        break;
  case 13:
  case 18:
        $data['conditional_html'] = 'the_secret_menu_html';
        break;
  default:
    $data['conditional_html'] = 'the_default_html':
}
$this->load->vars($data);

最終的には、さまざまな方法でこれを行うことができますが、これが別の方法に光を当てられることを願っています.

于 2012-09-13T20:23:54.077 に答える
1

いいえ、そうではありません。ビューには、MVCデザインパターンのプレゼンテーションロジックが含まれているはずです。

問題は、CodeIgniterには実際のビューだけのテンプレートがないことです。これは、CodeIgniterの本来の目的が、MVCを実装するのではなく、RubyOnRailsを模倣することであったという事実に関連しています。

誰かが私にCodeIgniterの使用を強制した場合、私は「ビュー」で次のようなものを使用します。

<?php

$pagelist = array(
   1 => 'foo/b',
   2 => 'foo/a',
   3 => 'foo/r',
   4 => 'lorem/ipsum'
);

$pageID = isset( $pagelist[ $pageId ]) ? $pageID : 1;

?>

<!DOCTYPE html>
<html>

    <!-- some stuff here -->
    <?php include '/path/to/views/' . $pagelist[ $pageId ]; ?>
    <!-- a bit more HTML -->

</html>

in ($this->load->view()CIが呼び出すもの)コントローラーは、基本的には単なる栄光のinclude/requireです。その方法には魔法のようなものは何もありません。

また、これは興味深いと思うかもしれません:http: //codeigniter.com/forums/viewthread/62366/

于 2012-09-13T21:25:14.337 に答える