6

これは PHP としてマークされていますが、これは PHP コードを使用して問題を表示するためです。

したがって、コントローラーには次のようなコードがあります。

switch ($page)
{
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}

明らかにもっと多くのページがありますが、これは私の問題を説明するはずです。これらの両方のページ (およびサイト上のすべてのページ) に共通のヘッダー、ナビゲーション、およびフッターがあります。複数のrequireステートメントを使用する必要がありますか? 私の最初の推測は次のとおりです。

switch ($page)
{
    case "home":
        require "templates/header.php";
        require "templates/navigation.php";
        require "views/home.php";
        require "templates/footer.php";
        break;
    case "search":
        require "templates/header.php";
        require "templates/navigation.php";
        require "views/search.php";
        require "templates/footer.php";
        break;
}

どういうわけか、私の腸はこれが正しくないと教えてくれます。

4

7 に答える 7

5

コントローラーは、ビューのデータをセットアップし、表示するビューを選択するだけです。ビューは、共有ページを含め、ページのレイアウトを担当する必要があります。私はあなたの最初のサンプルが 2 番目のサンプルよりも好きです。

于 2008-12-01T01:13:25.757 に答える
1

はい、ヘッダー、フッターなどを分割する必要があります。

あなたが示した特定の例では、これはうまくいきませんか?

    require "templates/header.php";
    require "templates/navigation.php";
    require "views/$page.php";
    require "templates/footer.php";

($page は「ホーム」、「検索」などです)

于 2008-12-01T02:14:56.647 に答える
0

現在のプロジェクトでテンプレートを使用する方法の簡略版を次に示します。

class Template {
    var $pagename = 'index';

    function __construct() {
        $this->pagename = basename($_SERVER['SCRIPT_NAME'], '.php');
        register_shutdown_function(array($this, 'do_output'));
    }

    function do_output() {
        $this->header();
        $this->display($this->pagename);
        $this->footer();
    }

    function __call($template, array $params) {
        call_user_func(array($this, 'display'), $template, params);
    }

    function display($template, array $params = null) {
        include "templates/$template.php";
    }
}

その背後にある考え方は、「include 'Template.inc'; new Template;」と書けるということです。そして、do_output() がスクリプトの最後で自動的に実行されるように調整します。テンプレートに変数を渡すために使用されるメソッドなど、省略されていることがいくつかあります。

PHP を使用していないと述べましたが、そこにはいくつかの PHP イズムがあります。 /footer() は、display('header') と display('footer') を実行する魔法の関数呼び出しであり、オーバーライドされることを意図しています。

もちろん、投稿した例のようなスイッチを使用しても問題はありませんが、すべての case ステートメント内にヘッダー/フッターは必要ありません。このようなものは同じことをします:

require "templates/header.php";
require "templates/navigation.php";
switch ($page)
{
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}
require "templates/footer.php";

...または、ページの設定方法で機能する場合は、上記で使用したようなファイル名に基づいたものに switch() を置き換えることができます。ただし、URL パラメーターを使用して切り替える場合は、切り替えが最も安全な方法です。

于 2008-12-01T20:49:18.673 に答える
0

コードを繰り返しています。これは決して良い考えではありません。最初の例に近づくには、次のようなものが確実に望ましいでしょう。

require "templates/header.php";
require "templates/navigation.php";

switch ($page) {
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}

require "templates/footer.php";

アーキテクチャのアプローチについて詳しく知らなければ、これ以上のアドバイスをすることは困難です。たとえば、単に出力を準備するコントローラーのこの部分を非常に中心的な場所に配置し、ビュー テンプレートを含める前に出力のバッファリングを開始することをお勧めします。そうすれば、出力を変数に格納して、HTTP 応答でその内容を返す前にさらに処理することができます。

于 2008-12-03T15:24:39.170 に答える
0

私は tvanfosson に同意し、それが MVC とどのように関係しているかを説明したいと思います。

2番目の例の問題は、コントローラーがビューの構築方法に公開されていることです。厳密には、コントローラーはビューの入力をマーシャリングしてビューに渡します。

これを考える実際的な方法は、アプリケーションの要件または入力自体に応じてビューが変化する場合です。たとえば、生成されるビューが JavaScript ポップアップ用である場合、別のヘッダー、フッター、CSS、メタなどのセットを使用する可能性があります (おそらくそうするでしょう)。2 番目の例では、すべてがコントローラーに公開されます。 . 最初は、ビューを生成する方法を知っているのはビューです。これがまさにポイントです。

私の例をさらに詳しく説明すると、JavaScript ポップアップが再設計されてフル ページ ビューになるか、AJAX 用にリファクタリングされます (または、ポップアップ/ページ/AJAX の質問が、分野)。ビューが変更されたため、コントローラーをバラバラにしています。MVC に違反したというほどではありませんが、そもそも気にするべきではありませんでした。

于 2008-12-09T02:18:04.997 に答える
0

例に示すように、すべてのファイル名がビュー/ページ要求と一致する場合は、1 行だけでswitchステートメントは必要ありません。

require "templates/header.php";
require "templates/navigation.php";
require 'views/' . $page . '.php'; // <-- one-liner
require "templates/footer.php";
于 2013-06-06T02:36:12.823 に答える
-2

テンプレートとしてストレートな PHP ページを使用している場合は、必要なページを保持するようにグローバル/セッション変数を設定できます。ヘッダー要素とフッター要素を含む「メイン テンプレート」php ページがあり、$page のインクルードを呼び出します。コントローラーで次のようなもの:

$_SESSION['page'] = sanitize_input($_GET['page']);
require "templates/main.php";

次に、main.php テンプレート ファイルで次のように記述します。

require "templates/header.php";
require "templates/navigation.php";
require "views/{$_SESSION['page']}.php";
require "templates/footer.php";
于 2008-12-01T16:39:31.020 に答える