2008-09-22 52 views
10

我正在创建一个网站,其中不同的网页可能会根据特定的条件(即登录或不,表格填写或不等,等)看起来非常不同。这使得有必要在不同的时间输出不同的html块。保持我的PHP漂亮

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

谢谢!

回答

25

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

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

  • 一个只有PHP代码(无HTML)充满变数
  • 另一个HTML和很少的PHP:这是你的页面设计

然后包括何时/何时需要它。 EG:

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> 

(您可能需要使用alternative PHP syntax这一个,但不要着急,使其完善。第一次,真的。)

myPage.php

<?php 

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

现在不要担心性能问题。这不是你作为新手的优先事项。这个解决方案是不完善的,但会帮助您解决您的编程级别的问题,并会教您基本知识。然后,一旦你对这个概念感到满意,就买一本关于MVC模式的书(或者查看关于它的堆栈溢出条目)。那你想做什么下一次。然后你会尝试一些模板系统和框架,但是LATER。就目前而言,只需编码并从一开始就学习。你可以像这样完美地编写一个项目,作为一个菜鸟,没关系。

+0

这就是我现在所做的。处理脚本中的数据,包括适当的'视图'脚本。在视图脚本中,我只在HTML内部回显变量,并在必要时使用if-else和循环。 – Imran 2008-09-22 13:20:24

0

在这种情况下,我会将所有东西逐渐写入变量或有时是数组,然后回显变量/数组。它具有额外的优势,即页面始终呈现,而不是逐渐呈现。

0

我在这种情况下最终做的是构建包含HTML数据的'模板'文件,然后使用正则表达式进行解析。它使代码保持清洁,并且更容易将代码片断传递给设计人员或其他HTML人员。

退房背后MVC编程实践理想的Wikipedia

1

从您的问题的声音看来,您的代码中的逻辑和表示之间似乎没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,因为您目前所面临的情况正好证明了这一点。

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

4

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

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

+0

任何模板引擎都可以解决这个问题,而不需要MVC框架的开销。 Smarty是最好的选择。 – Ian 2008-09-22 08:54:46

+1

另一个模板系统(PHP本身)之上的模板系统(Smarty)原则上处于开销状态。我都是用XSL Transformations(http://www.w3schools.com/xsl/)Twan – Twan 2008-09-22 09:40:15

+1

这样的技术人,认真的...... XSLT是太复杂了,绝对不需要OP所说的内容。对于初学者来说,首先需要一些XML进行转换。 – nickf 2008-09-22 12:34:47

0

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

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

0

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

例如

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

只是一个简单的例子

以上..你是固定的症状,而不是问题,因为提到
0

..

你需要的是逻辑的分离和介绍。这可以通过某种mvc框架来完成。即使你不想全部采用mvc框架..一个模板引擎是必须的,至少如果你的逻辑足够复杂以至于你在解释你的问题上有困难

0

我强烈建议savant而不是智者,

  • 你不必去学习,以创建模板的新模板“语言”,学者模板是用PHP编写的
  • 如果你不”不想使用PHP,你可以用一个编译器定义自己的模板“语言”
  • 它是由您自己的PHP易于扩展从presenta对象

逻辑分离这并不意味着你所有的业务逻辑都必须用php和你的表示逻辑来完成,分离是一个概念性的东西,你需要将准备数据的逻辑从显示它的逻辑中分离出来。显然,业务逻辑不必包含表示元素。

0

代替在模板系统之上实现模板系统(PHP本身),创建默认开销,您可以选择一个更强大的解决方案,如XSL Transformations,它也符合MVC princples(前提是您需要分离数据 - 检索;另外,我个人将显示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> 

的Et瞧,你有:

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

现在对于这个简单的例子,这是一个有点过度杀伤;但对于大型项目中的复杂结构,这是让脚本逻辑远离标记的绝对方法。

0

入住这question关于分离PHP和HTML,也有不同的方法来做到这一点,包括编写自己的模板系统,模板系统,如Smarty的,PHP作为它自己的模板系统,等等等等......

0

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

2

但是,这样做会让我的php代码看起来很可怕......它真的与代码的格式和“形状”混淆在一起。我应该如何解决这个问题?

将您的PHP和HTML视为一个层次结构,并使用一个一致的缩进结构。因此,一个PHP封闭结构(如'if'或'for')引入了新的缩进级别,其内容始终是一组平衡的开始和结束标记。从本质上讲,您使用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 '也是这样。)