4

通常、私はウェブサイトとコーディングPHPなどを開発してHTMLいます-

while (mysqli_stmt_fetch($stmt)) {      
    // Create Table Body
    $html .= "<tr>\n";
    $html .= "  <td>$title</td>\n";
    $html .= "  <td>$date</td>";                            
    $html .= "  <td align='center'>\n";
    $html .= "      <a href='#'>\n";
    $html .= "          <span class='view' title='View This Comment'></span>\n";
    $html .= "      </a>\n";
    $html .= "  </td>\n";                           
    $html .= "  <td class='td_catchall' align='center'>\n";
    $html .= "      <a href='#'>\n";
    $html .= "          <span class='edit' title='Edit This Comment'></span>\n";
    $html .= "      </a>\n";
    $html .= "  </td>\n";                       
    $html .= "  <td align='center'>\n";
    $html .= "      <a href='#'>\n";
    $html .= "          <span class='delete' title='Delete This Comment'></span>\n";
    $html .= "      </a>\n";
    $html .= "  </td>\n";
    $html .= "</tr>\n"; 
}

//Create View Blog Dialog Box 
$viewBlog  = "<div id='dialog-view'>\n";
$viewBlog .= "      <h2>$title</h2>\n";
$viewBlog .= "  <p>$date</p>\n";
$viewBlog .= "  <p>";
$viewBlog .= "          <img src='".UPLOAD_DIR.$userName."/".$image."' />";
$viewBlog .= "      $comment</p>";
$viewBlog .= "</div>\n";

しかし最近、友人の 1 人を知りました。これは、HTML を PHP 変数に保存することの悪い習慣です。また、ロジックをプレゼンテーションから分離する必要があるとも言いました。

それが本当なら、どうすればそれができるか誰か教えてもらえますか?

どんなコメントでも大歓迎です。ありがとうございました。

4

2 に答える 2

11

TwigMustacheなどのテンプレート ライブラリを強くお勧めします。ただし、基本は外部 PHP ファイルを HTML として使用し、require を使用することです。ちょっとハックな例を次に示します。

<?php
$comments = array();

while (mysqli_stmt_fetch($stmt)) {     
  $comments[] = $stmt;
}

require 'comments.php';

次にcomments.php

<?php foreach ($comments as $comment) : ?>
<tr>
  <td><?php echo $comment['title'] ?></td>
  <td><?php echo $comment['date'] ?></td>                          
  <td align='center'>
      <a href='#'>
          <span class='view' title='View This Comment'></span>
      </a>
  </td>                           
  <td class='td_catchall' align='center'>
      <a href='#'>
          <span class='edit' title='Edit This Comment'></span>
      </a>
  </td>                       
  <td align='center'>
      <a href='#'>
          <span class='delete' title='Delete This Comment'></span>
      </a>
  </td>
</tr> 
<?php endforeach ?>

ここでは、各コメント (またはそれが何であれ) を配列に追加しています。次に、というファイルを含めますcomments.php。メイン ファイルはほとんどが PHP で、任意のロジックを処理するcomments.php必要がありますが、ほとんどが HTML で、プレゼンテーションには PHP のみを使用する必要があります (別名、配列をループして変数をエコーアウトする)。

必要なファイルは、インラインの場合にアクセスできるすべての変数にアクセスできます。

于 2013-09-05T16:49:32.950 に答える
9

プレゼンテーションからロジックを分離するにはどうすればよいですか?

それを分離します。

プレゼンテーション ロジック分離からビジネス ロジックと呼ばれますが。両方のレイヤーにロジックがあります。名前はそれをすべて言います:

  • 最初に「ロジック」を実行します
  • 次に、「プレゼンテーション」に進みます。

あなたの例を挙げると、このようなものでなければなりません

$res  = $stmt->get_result();
$data = array();
while ($row = mysqli_fetch_assoc($res)) {      
    $data[] = $row;
}

ただし、データベースからデータを取得するには、次のようなよりインテリジェントなアプローチを使用します。

$data = $db->getArr("SELECT ...");

次に、すべてのデータベースまたはその他のサービスとのやり取りについて、すべての手順を繰り返します。目標は、ビジネス ロジックが提供する必要があるすべてのデータを準備することです。その後、ビジネス ロジックが終了し、プレゼンテーションに進むことができます。

テンプレートエンジンを簡単に交換できれば、悪いものとの良い分離を判断できます(他の回答からのアプローチではできません)-したがって、特定のエンジンは問題ではありません。最も単純なものを見てみましょう - PHP

というファイルを作成し、tpl.phpこのコードをそこに置きます

<table>
<?php foreach ($data as $row): extract($row); ?>
  <tr>
    <td><?=$title</td>
    and so on
  </tr>
<?php endforeach ?>

次に、このファイルをビジネス ロジック ファイルに含めます。または - より良い - より高いレベルのテンプレートで。

このトピックでは、アプローチの実際の良い例を見ることができます

このような分離を使用すると、次のことができます。

  1. 構文の強調表示とヒントを表示できる優れたエディターの力を使用してください (ただし、使用しているとは思えません)。
  2. プロのデザイナーにデザインを外注します。
  3. プレゼンテーション テクノロジーを HTML から AJAX に簡単に変更できます。
  4. 外観の異なるさまざまなサイトに同じエンジンを使用します。
  5. 任意の数の「テーマ」または「スキン」を実装します。
  6. HTML、CSS、または JS のいずれかからリッチな装飾を追加しても、生き続けることができます。

これはすべて、現在のアプローチまたは他の回答からのアプローチでは不可能です。アイデアは物事の分離です。

于 2013-09-05T17:11:50.743 に答える