我如何将逻辑与演示分开?

时间:2013-09-05 16:43:08

标签: php html

通常我正在开发网站并编码PHPHTML这样的内容 -

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

但是最近我遇到了我的一位朋友,这是一个在PHP变量中保存HTML的不良做法。并且还说我需要将逻辑与表示分开。

如果确实如此,有人可以告诉我该怎么办?

任何评论都将不胜感激。 谢谢。

2 个答案:

答案 0 :(得分: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进行表示(也就是通过数组循环并回显变量)。

您所需的文件可以访问它内联时可以访问的所有变量。

答案 1 :(得分:8)

  

我如何将逻辑与演示分开?

分开。

虽然它从演示逻辑分离称为业务逻辑。两层都有逻辑。这个名字说明了一切:

  • 首先执行“逻辑”
  • 然后转向“演示文稿。”

举个例子,它必须是这样的

$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 ?>

然后将此文件包含在业务逻辑文件中。或者 - 更好 - 在某些更高级别的模板中。

您可以在this topic

中看到该方法的真实例子

使用这种分离,您可以:

  1. 使用可以进行语法高亮和提示的优秀编辑器的功能(虽然我怀疑你使用的是)。
  2. 将您的设计外包给专业设计师。
  3. 轻松将演示技术从HTML更改为AJAX。
  4. 对具有不同外观的不同站点使用相同的引擎。
  5. 实施任意数量的“主题”或“皮肤”。
  6. 从HTML,CSS或JS添加一些丰富的装饰时保持活力。
  7. 虽然从目前的方法或其他答案的方法来看,这一切都是不可能的。这个想法是分离的事情。