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";

但最近我认识了我的一个朋友,将 HTML 保存在 PHP 变量中是一种不好的做法。并且还说我需要将逻辑与演示分开。

如果是真的,谁能告诉我我该怎么做?

任何意见将不胜感激。谢谢你。

4

2 回答 2

11

我强烈推荐像TwigMustache这样的模板库。但是,基础是使用外部 PHP 文件作为 HTML,并使用 require。这是一个 hacky 的例子:

<?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 回答