4

私は最初の PHP Web サイトの 1 つを構築していて、それをいじっています。私は PHP インクルードを使用するつもりなので、メタデータを一度だけ変更する必要があります。現在、doctype から</head>.

友人は</head>、header.php に を含めるべきではなく、代わりに各ページに含めるべきだと言っているので、ページ固有のものを追加できます。それはそれを行う良い方法ですか?

現在、タイトルのようなものについては、

<title><?php echo $page_title; ?>

そして、各ページの上部で、私はやっていました

<?php $page_title = 'Blah'; ?> 

これが私がこれを行っている方法である場合、ページ固有の Javascript ファイルを追加するにはどうすればよいですか?

4

4 に答える 4

6

ここで起こっていることは、テンプレートにロジックを挿入しようとしていることです。これは必ずしも間違っているわけではありませんが、より混乱し、保守が難しいコードを生成します。この問題は<title>タグだけでなく、ページがますます動的で複雑になるにつれて発生し続けます(動的ナビゲーション、ページ固有のレイアウトなど)。

MVCアプローチは、この問題を完全に解決します。MVCは、データソース(MySQL、Redisなど)と通信してロジックを処理するモデルで構成されています。HTMLをレンダリングするビュー。モデルとビューの間の接着剤のようなものであるコントローラー。ユーザーが行う各リクエストは、最終的にコントローラーにルーティングされ、次にコントローラーのアクションメソッドにルーティングされます(たとえば、コントローラーとアクション/users/loginにマップされる場合があります)。Userlogin

コントローラのactionメソッドでページタイトル(またはその他のメタ情報)を設定します。これは、リクエストが何であるかを認識していますが、ビューがレンダリングされる前に呼び出されます。

$request->setTitle('Home page');

そして、あなたのビューで、単にそれをレンダリングします:

<title><?php echo $request->getTitle(); ?></title>

PHPを始めたばかりの場合は、MVCを学ぶ絶好の機会です。これにより、PHP開発だけでなく、他の開発にも影響を与えるいくつかの良い習慣を身に付けることができます。

シンプルで優れたドキュメントについては、CodeIgniterをチェックすることをお勧めします。私はしばらくの間CodeIgniterを使用していましたが、自分のニーズに合った独自のフレームワークを作成することになりました。

于 2012-07-04T20:20:55.347 に答える
2

どのようにページを構築しているのかわかりません。しかし、単純なサイトでは、次のような連想配列を使用できます。

$pages = array(
    'home' => array(
        'title' => 'Home',
        'metaDescription' => 'This is the home of my website',
        'metaKeywords' => 'A,B,C',
        'scripts' => '<script src="src/js/com.jquery/1.7/jquery-1.7.min.js"></script>',
        'content' => 'home.phtml'
    ),
    'page_1' => …
);

そして、次のように思い出すことができます。

<head>
    […]
    <title><?php print $pages['home']['title']; ?></title>
    […]
    <?php print $pages['home']['scripts']; ?>
    […]
</head>
<body>
    <?php require '/pathToIncludes/' . $pages['home']['content]; ?> 
</body>

ただし、これはページ数が多いサイトにのみお勧めします。

于 2012-07-04T19:57:58.060 に答える
2

最初にいくつかのロジックを実行してからレンダリングする必要があると思います。このようなもの:

<?php

$page = array(
    'title' => 'Title',
    'js' => array(
        'jquery.min.js',
    ),
    'copyright' => 'Copyright 2012',
);

if ( $needed ) {
    $page[ 'js' ][] = 'some-other.js';
}

include( 'header.php' );
include( 'content.php' );
include( 'footer.php' );


// header.php
<html>
    <head>
        <title><?= $page[ 'title' ]; ?></title>

        <? foreach ( $page[ 'js' ] as $js ) { ?>
            <script src="<?= $js"></script>
        <? } ?>

    </head>
于 2012-07-04T20:30:24.743 に答える
1

この問題を解決する方法は次のとおりです。

  • start.phpデータベースに接続し、クラスを含め、すべてのデフォルトのメタ値を$pageオブジェクトに設定して開始します$_SESSION
  • header.php<head>の値に基づいて、すべての HTML トップ マター (doctypeなど) を吐き出します。$page
  • top.php含まれstart.phpており、header.php

ほとんどのファイルでは、デフォルト値で問題ありません。を含めるだけtop.phpです。特別な値が必要な特別なケースでは、私のページは次のようになります。

<?php 
    include("start.php");
    $page->title = "My special title";
    include("header.php");
    // The rest of my content
?>

これには、ページが $_SESSION およびその他のカスタム クラスにアクセスできるという利点があり、その情報を使用して、"header already sent" エラーを取得することなくヘッダーを変更できます。たとえば、一部のユーザー入力を検証location('header: foo.php');し、ログイン ステータスに応じてタイトルを使用してリダイレクトしたり、タイトルを変更したりできます。

ページ固有の JavaScript インクルードについては、インクルードする URL の配列を作成し、次の$page->javascriptように配置します。$page->javascript[] = "http://example.com/js/myScript.js";start.phpheader.php

于 2012-07-04T20:09:01.827 に答える