11

我正在创建一个站点,根据某些条件(即是否登录,是否填写表格等),不同的页面看起来会非常不同。这使得有必要在不同的时间输出不同的 html 块。

然而,这样做会使我的 php 代码看起来很可怕......它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?在我的脚本底部包含自定义“html 转储”功能?同样的事情,但包含?Heredocs(看起来不太好)?

谢谢!

4

14 回答 14

26

不要惊慌,每个新的 Web 程序员都会面临这个问题。

您必须将程序逻辑与显示分开。首先,尝试为每个网页使用两个文件来制作自己的解决方案:

  • 一个只有 PHP 代码(没有 HTML)来填充变量
  • 另一个使用 HTML 和很少的 PHP:这是您的页面设计

然后包括您需要的地点/时间。例如:

myPageLogic.php

<?php

// pure PHP code, no HTML

$name = htmlspecialchars($_GET['name']);
$age = date('Y') - htmlspecialchars($_GET['age']);

?>

myPageView.php

// very few php code
// just enought to print variables
// and some if / else, or foreach to manage the data stream

<h1>Hello, <?php $name ?> !</h1>

<p>So your are <?php $age?>, hu ?</p>

(您可能想为此使用替代的 PHP 语法。但不要试图使其第一次完美,真的。)

我的页面.php

<?php

require('myPageLogic.php');
require('myPageView.php');
?>

暂时不要担心性能问题。这不是你作为新手的首要任务。这个解决方案并不完美,但会帮助你解决你的编程水平的问题,并会教你基础知识。

然后,一旦你对这个概念感到满意,就买一本关于 MVC 模式的书(或者寻找关于它的堆栈溢出条目)。那就是你下一次想要做的事情。然后你会尝试一些模板系统和框架,但稍后。现在,只需编码并从头开始学习。你可以完美地编写这样的项目,作为一个菜鸟,这很好。

于 2008-09-22T08:47:42.907 回答
8

使用 mvc 方法。

http://www.phpmvc.net/

这不是你会在几个小时内得到的。你真的需要练习它。主要的是控制器将访问您的模型(数据库层),对您的数据进行处理,然后将其发送到视图进行渲染。这过于简单了,但您只需要阅读和练习即可理解它。

这是我用来帮助我学习的东西。 http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

于 2008-09-22T03:49:50.703 回答
4

尽量将您的内容和布局与您的代码分开。每当您在 .php 文件中编写任何 HTML 时,停下来想一想“这真的属于这里吗?”

一种解决方案是使用模板。查看Smarty模板系统,了解一个非常易于使用的选项。

于 2008-09-22T03:55:24.903 回答
2

然而,这样做会使我的 php 代码看起来很可怕......它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?

将您的 PHP 和 HTML 视为一个层次结构,具有单一、一致的缩进结构。因此,诸如“if”或“for”之类的 PHP 封闭结构引入了新级别的缩进,其内容始终是一组平衡的开始和结束标记。从本质上讲,您正在使您的 PHP 在 XML 术语的意义上“格式良好”,无论您是否实际使用 XHTML。

例子:

<div class="prettybox">
    Hello <?php echo(htmlspecialchars($name)) ?>!
    Your food:
    <?php foreach($foods as $food) { ?>
        <a href="/food.php?food=<?php echo(urlencode($food)) ?>">
            <?php echo(htmlspecialchars($food)) ?>
        </a>
    <?php } ?>
    <?php if (count($foods)==0) { ?>
        (no food today)
    <?php } ?>
</div>

警惕围绕分离逻辑和标记的宗教教条再次出现在答案中。虽然您当然希望将业务逻辑排除在页面输出代码之外,但这并不一定意味着使用单独的文件、类、模板和框架会产生大量开销,这对于您正在做的事情确实是必要的。对于一个简单的应用程序,将动作/逻辑的东西放在文件的顶部和下面的页面输出可能就足够了。

(例如,根据上面的评论之一,执行 htmlspecialchars() 是页面输出功能,您绝对不想将其放入 PHP 的操作位中,混入所有业务逻辑中。始终保持文本为纯文本,未转义字符串,直到它离开你的应用程序逻辑。如果一直输入'echo(htmlspecialchars(...))'太罗嗦,你总是可以用一个像'h'这样的短名称来做同样的事情。 )

于 2008-09-22T16:25:17.817 回答
1

从您的问题的声音来看,您的代码中的逻辑和表示之间似乎没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,原因完全可以从您当前面临的情况中得到证明。

如果您还没有,我会看看一些 PHP 模板引擎,例如Smarty

于 2008-09-22T03:53:41.040 回答
0

在这种情况下,我将所有内容增量写入变量或有时是数组,然后回显变量/数组。它还有一个额外的优势,即页面总是一次性呈现,而不是逐步呈现。

于 2008-09-22T03:49:09.647 回答
0

在这种情况下,我最终要做的是构建我包含的 HTML 数据的“模板”文件,然后使用正则表达式进行解析。它使代码保持干净,并且更容易将部分交给设计人员或其他 HTML 人员。

在Wikipedia上查看 MVC 编程实践背后的理想

于 2008-09-22T03:49:22.313 回答
0

你需要一个框架。这不仅会使您的代码变得漂亮(因为已经提到的模型-视图-控制器模式,MVC)- 由于已经为它编写了组件,它会节省您的时间。

我推荐 QCodo,它很棒;还有其他的——CakePHP、Symfony。

于 2008-09-22T03:57:22.323 回答
0

如果这是一个大项目,可能需要一个框架。如果没有,请创建一些模板文件并在页面顶部决定要包含的模板文件。

例如

if ($_SESSION['logged_in'])
     include(TPL_DIR . 'main_logged_in.tpl'); 
else
     include(tPL_DIR . 'main.tpl');

只是一个简单的例子

于 2008-09-22T04:18:35.237 回答
0

如上所述..您正在解决症状,而不是问题..

您需要的是逻辑和表示的分离。这可以通过某种 mvc 框架来完成。即使您不想一直使用 mvc 框架.. 模板引擎是必须的,至少如果您的逻辑足够复杂以至于您对所解释的内容有困难

于 2008-09-22T07:24:15.120 回答
0

我强烈建议savant而不是 smarty,

  • 您不必为了创建模板而学习新的模板“语言”,专家模板是用 php 编写的
  • 如果您不想使用 php,您可以使用编译器定义自己的模板“语言”
  • 它可以通过您自己的 php 对象轻松扩展

将逻辑与表示分离并不意味着您的所有业务逻辑都必须在 php 中,而您的表示逻辑必须在其他东西中,分离是一个概念性的事情,您必须将准备数据的逻辑与显示它的逻辑分开。显然,业务逻辑不必包含表示元素。

于 2008-09-22T09:02:32.793 回答
0

除了在模板系统(PHP 本身)之上实现模板系统,默认情况下会产生开销,您可以寻求更强大的解决方案,例如XSL Transformations,它也符合MVC 原则(前提是您将数据检索分开;另外,我个人将逻辑与显示具有不同文件的 XML 分开)。

想象一下在一个数组中有以下信息,您希望将其显示在一个表格中。

Array
{
  [car] => green
  [bike] => red
}

您可以轻松地创建一个以 XML 格式输出此信息的脚本:

echo "<VEHICLES>\n";
foreach(array_keys($aVehicles) as $sVehicle)
  echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n";
echo "</VEHICLES>\n";

生成以下 XML:

<VEHICLES>
  <VEHICLE>
    <NAME>car</NAME>
    <COLOR>green</COLOR>
  </VEHICLE>
  <VEHICLE>
    <NAME>bike</NAME>
    <COLOR>red</COLOR>
  </VEHICLE>
</VEHICLES>

现在这一切都很好,但不会以很好的格式显示。这就是 XSLT 的用武之地。使用一些简单的代码,您可以将其转换为表格:

<xsl:template match="VEHICLES">
  <TABLE>
    <xsl:apply-templates select="VEHICLE">
  </TABLE>
</xsl:template>

<xsl:template match="VEHICLE">
  <TR>
    <TD><xsl:value-of select="NAME"></TD>
    <TD><xsl:value-of select="COLOR"></TD>
  </TR>
</xsl:template>

瞧,你有:

<TABLE>
  <TR>
    <TD>car</TD>
    <TD>green</TD>
  </TR>
  <TR>
    <TD>bike</TD>
    <TD>red</TD>
  </TR>
</TABLE>

现在对于这个简单的例子,这有点矫枉过正;但是对于大型项目中的复杂结构,这是使您的脚本逻辑远离您的标记的绝对方法。

于 2008-09-22T10:21:42.790 回答
0

检查这个关于分离 PHP 和 HTML 的问题,有多种方法可以做到这一点,包括自己编写的模板系统、Smarty 等模板系统、PHP 作为自己的模板系统等等等等。

于 2008-09-22T13:03:16.427 回答
0

我认为你在这里有两个选择,要么使用 MVC 框架,要么使用惰性模板方式,这会给你的代码带来很大的开销。显然我支持前者,我认为学习 MVC 是本书中最好的 Web 开发技巧之一。

于 2008-09-22T15:57:26.337 回答