我正在创建一个网站,其中不同的网页可能会根据特定的条件(即登录或不,表格填写或不等,等)看起来非常不同。这使得有必要在不同的时间输出不同的html块。保持我的PHP漂亮
但是,这样做会让我的php代码看起来很可怕......它真的会与代码的格式和“形状”混淆。我应该如何解决这个问题?在我的脚本底部包含自定义“html转储”功能?同样的事情,但包括? Heredocs(看起来不太好)?
谢谢!
我正在创建一个网站,其中不同的网页可能会根据特定的条件(即登录或不,表格填写或不等,等)看起来非常不同。这使得有必要在不同的时间输出不同的html块。保持我的PHP漂亮
但是,这样做会让我的php代码看起来很可怕......它真的会与代码的格式和“形状”混淆。我应该如何解决这个问题?在我的脚本底部包含自定义“html转储”功能?同样的事情,但包括? Heredocs(看起来不太好)?
谢谢!
不要惊慌,每个新鲜的Web程序员都面临着这个问题。
您必须将您的程序逻辑与显示器分开。首先,请尝试使用两个文件为每个网页自己的解决方案,使:
然后包括何时/何时需要它。 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。就目前而言,只需编码并从一开始就学习。你可以像这样完美地编写一个项目,作为一个菜鸟,没关系。
在这种情况下,我会将所有东西逐渐写入变量或有时是数组,然后回显变量/数组。它具有额外的优势,即页面始终呈现,而不是逐渐呈现。
我在这种情况下最终做的是构建包含HTML数据的'模板'文件,然后使用正则表达式进行解析。它使代码保持清洁,并且更容易将代码片断传递给设计人员或其他HTML人员。
退房背后MVC编程实践理想的Wikipedia
使用MVC方法。
这是不是你会在几个小时回升。你真的需要练习它。主要的是控制器将访问你的模型(数据库层),做你的数据的东西,然后将其发送到视图进行渲染。这是过于简单化了,但你只需要阅读和实践它来理解它。
这是我用来帮助我学习的东西。 http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html
从您的问题的声音看来,您的代码中的逻辑和表示之间似乎没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,因为您目前所面临的情况正好证明了这一点。
如果你还没有,我会看看一些PHP模板引擎,如Smarty。
尽量将您的内容和布局与代码分开。任何时候你在.php文件中写入任何HTML,停下来想一想“这真的是属于这里吗?”
一个解决方案是使用模板。看看Smarty模板系统是一个非常易于使用的选项。
您需要一个框架。这不仅会使你的代码更漂亮(因为已经提到了模型 - 视图 - 控制器模式,MVC) - 它会为你节省时间,因为已经为它编写的组件。
我推荐QCodo,它很棒;还有其他的 - CakePHP,Symfony。
如果这是一个大项目,框架可能是有序的。如果没有,请创建一些模板文件,并在页面顶部决定要包含哪个模板文件。
例如
if ($_SESSION['logged_in'])
include(TPL_DIR . 'main_logged_in.tpl');
else
include(tPL_DIR . 'main.tpl');
只是一个简单的例子
以上..你是固定的症状,而不是问题,因为提到..
你需要的是逻辑的分离和介绍。这可以通过某种mvc框架来完成。即使你不想全部采用mvc框架..一个模板引擎是必须的,至少如果你的逻辑足够复杂以至于你在解释你的问题上有困难
我强烈建议savant而不是智者,
逻辑分离这并不意味着你所有的业务逻辑都必须用php和你的表示逻辑来完成,分离是一个概念性的东西,你需要将准备数据的逻辑从显示它的逻辑中分离出来。显然,业务逻辑不必包含表示元素。
代替在模板系统之上实现模板系统(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>
现在对于这个简单的例子,这是一个有点过度杀伤;但对于大型项目中的复杂结构,这是让脚本逻辑远离标记的绝对方法。
入住这question关于分离PHP和HTML,也有不同的方法来做到这一点,包括编写自己的模板系统,模板系统,如Smarty的,PHP作为它自己的模板系统,等等等等......
我想你在这里有两个选择,要么使用MVC框架,要么使用懒惰的模板方式,这会给代码带来很大的开销。很显然,我与前者一样,我认为学习MVC是本书中最好的Web开发技巧之一。
但是,这样做会让我的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 '也是这样。)
这就是我现在所做的。处理脚本中的数据,包括适当的'视图'脚本。在视图脚本中,我只在HTML内部回显变量,并在必要时使用if-else和循环。 – Imran 2008-09-22 13:20:24