0

PHPタグとHTMLタグを可能な限り分離することが非常に賢明であると読んだことがあります。今私の質問は私がそれをどのようにすべきかということです。答えが見つからなかったので、聞いてみることにしました。POST機能を使うことを考えていました。

私のコードをチェックしてください:

<div class="aftelklok rondenSB">
    <a href="?page=agenda">
    <?php 
    // countdown function
    // parameters: (year, month, day, hour, minute, seconds)
    countdown(2013,2,24,18,0,0);
    function countdown($year, $month, $day, $hour, $minute, $seconds)
    {
        // make a unix timestamp for the given date
        $the_countdown_date = mktime($hour, $minute, $seconds, $month, $day, $year, -1);

        // get current unix timestamp
        $today = time();

        $difference = $the_countdown_date - $today;
        if ($difference < 0) $difference = 0;

        $days_left = floor($difference/60/60/24);
        $hours_left = floor(($difference - $days_left*60*60*24)/60/60);
        $minutes_left = floor(($difference - $days_left*60*60*24 - $hours_left*60*60)/60);
        $seconds_left = floor($difference - $days_left*60*60*24 - $hours_left*60*60 - $minutes_left*60);
        if($difference > 0){ echo "Nog ".$days_left." dagen ".$hours_left." uur               .$minutes_left." minuten  tot de dienst"; }
        else{ echo "De vorige dienst is afgelopen."; } 
    }
    ?> 
    </a>
</div>

だから私が欲しいのはエコーだけですが、それから私のdivではなくhtmlコードの上にすべてのphpコードがあります。お気に入り:

<?php ..... ?>
<html>
<body>
echo
</body>
</html>
4

7 に答える 7

1

pemeonが言ったように、Smartyはそのための非常に賢い(しゃれを意図した)アプローチです。

背景について詳しく知りたい場合は、「Model-View-Controllerinphp 」などをグーグルで検索することをお勧めします。基本的には、ビュー(HTMLなどのすべてのプレゼンテーションのもの)をコードロジック(コントローラー)およびデータオブジェクト/ソース(モデル)から分離することです。

Smartyは素晴らしいですが、テンプレートエンジンがどのように設計されているか、どのように使用するか、特定の課題にどのように適用するかを理解するには、少し学習する必要があります。

現時点でこのような大きなソリューションが必要なく、少し小さくて簡単に始めたい場合は、関数file_get_contents(...)との周りに独自の非常に単純なテンプレート「エンジン」を作成できますstr_ireplace。アイデアは次のようになります。HTMLをテンプレートファイル(たとえば、*。htmlまたは* .tplファイルの末尾)に配置します。このファイルには、phpコードは含まれていませんが、動的に作成されたコンテンツのホルダーが配置されています。

例:main-layout.tpl

<html>
<head><title>${Title}</title></head>
<body>
<img src="yourfancylogo.png" alt="Header logo"><br>
<a href="#">Here some navigation</a> | <a href="#">...</a> | ... <br>
${Content}
<hr>
<div id="footer">&copy; 2013 John Doe - <a href="index.php?requestedpage=contact">Contact us</a></div>
</body>
</html>

例:welcome.tpl

<h1>Hello, ${Username}! Nice to see you!</h1>
<p>So your username is ${Username}? Then you might want to read our terms of service before starting to use our app:</p>
<pre>${TOS}</pre>

例:tos-document.txt

1) An apple a day keeps the doctor away!
2) No Smoking!
3) ...

phpスクリプトでは、次のようにします。

<?php

  $template = file_get_contents('main-layout.tpl');

  if (isset($_GET['requestedpage'])) {
    // Parameter given!
    $requestedPage = $_GET['requestedpage'];
  } else {
    // No page parameter. Assume "home".
    $requestedPage = "home";
  }

  $username = "Monty";   // get from session data

  if ($requestedPage == 'home') {
    // -- begin handler code for page "home" --
    $title = "Start Page - Welcome";
    $content = file_get_contents('welcome.tpl');
    $tos = file_get_contents('tos-document.txt');
    $content = str_ireplace('${TOS}', $tos, $content);
    // -- end handler code for page "home" --
  } else if ($requestedPage == 'aboutus') {
    ...
  } else {
    $title = "Page Not Found - Error";
    $content = file_get_contents('error404.tpl');
    $content = str_ireplace('${PageThatWasNotFound}', htmlentities($requestedPage), $content);
  }

  $output = str_ireplace('${Content}', $content, $template);
  $output = str_ireplace('${Title}', htmlentities($title), $output);
  $output = str_ireplace('${Username}', htmlentities($username), $output);

  die($output);

?>

テンプレートと挿入するデータのこのような分離を使用すると、後でphpスクリプトに触れることなくレイアウト/テンプレートを変更できます。たとえば、すべてのページに表示されるヘッダーまたはフッターを変更する場合は、複数のテンプレートブリックからサイトをモジュール式に組み立てることができるため、単一の変更点があります。

上記のphpソースを読みやすくするために、ソースが大きくなっている間、すべてのハンドラーコードを別々のphpファイルに入れることができます。includeそれらをメインソースファイルによって、またはメインソースファイルに含めrequireます。

ただし、注意してください。データベースから取得するか、$_GETまたは$_POST(-> XSSの脆弱性)から直接取得するかに関係なく、ユーザー入力から取得される可能性のあるすべてのプレースホルダー値をエスケープする必要があります。すべての入力は悪です!

于 2013-02-10T00:25:23.060 に答える
0

PHPを別のファイルに入れてから、includeまたはを使用できrequireます。

do_stuff.php:

<?php
  // some calculations
  echo "stuff";
?>

次に、HTMLで...

index.php:

<html>
<body>
<?php include 'do_stuff.php'; ?>
</body>
</html>

インクルードについて

于 2013-02-09T23:47:41.407 に答える
0

最良の方法は、 smartytwigなどのテンプレートエンジンを使用することです。学ぶ時間がない場合は、今のところ、上部にコードを記述し、計算を使用する場合は、を使用できます。

<?php
    // calculations
    $foo = 'foo';
?>
<html>
<body>
<div><?=$foo?></div>
</body>
</html>

そして、この種の「分離」(ファイルの上部にあるphpコード)と下部にあるhtmlを使い始め、このショートカットバージョンのecho関数を使用すると、テンプレートシステムを使用するように簡単に変換できます。

于 2013-02-09T23:52:56.120 に答える
0

PHPブロックの外部でphp関数または変数を使用することはできません。ただし、値をphpに格納してvariableから、小さなPHPブロックで使用することは可能です。

例えば:

<?php
// ...
$foo = 42;
// ...
?>

それで

<html><body>
    <p>Answer is <?php echo $foo; ?></p>
</body></html>

また

<html><body>
    <p>Answer is <?= $foo; ?></p>
</body></html>
于 2013-02-09T23:53:12.233 に答える
0

目標はコードphpから遠ざけることではなく、ビジネスロジックプレゼンテーションロジックから遠ざけることです。これを行う方法の1つは、Model-View-Controllerレイアウトを利用することです。または、他の多くのパラダイムの1つを使用することもできます。このアプローチの主なポイントは、ある部分を他の部分から独立させて変更することです。まったく同じロジックを実行するが、出力がまったく異なる別のモバイルエンドまたはフロントエンドを作成することを想像してください。ビジネスロジックとプレゼンテーションロジックが完全に絡み合っていると、コードの複製または露骨なコピーの両方が必要になるだけでなく、同期を維持する必要のある2つの異なるブランチを作成して、悪夢を維持する必要があります。htmljson

于 2013-02-10T00:34:37.350 に答える
0

私は今、この種のフレームを使用しています。これは、MrSnurbが作成したフレームのようなものですが、phpではなくHTMLで使用しています。このフレームワークの人たちについてどう思いますか?

<?php
if(isset($_GET['page'])) {
    $page = $_GET['page'];
}else{
    $page = "home";
}   
?>
<!DOCTYPE html>
<html>
<head>
<title> Younited - <?php echo $page; ?></title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="js/slides.min.jquery.js"></script>
</head>
 <body>
<div class="container ronden">  
    <?php 
        include "partials/header.php";
        include "partials/menu.php"; 
    ?>
<div class="content">   
    <?php
        if (file_exists("partials/pages/".$page.".php")) {
            include "partials/pages/".$page.".php";
        }   
        else{ echo "<p>De pagina <b>".$page."</b> bestaat niet.</p>"; 
        } 
        include "partials/sidebar.php"; 
    ?>  
</div>
</div>
    <?php
        include "partials/footer.php";  
    ?>
</body>
</html>
于 2013-02-10T13:14:05.620 に答える
-1

smartyのようなテンプレートエンジンを使用します。HTMLコードのテンプレートを作成し、そこに変数をプッシュします。

于 2013-02-09T23:42:41.413 に答える