我正在创建一个网站,根据某些条件(即登录或不登录,填写或不填写表格等),不同页面可能看起来非常不同。这使得有必要在不同的时间输出不同的html块。
但是,这样做会让我的php代码看起来很恐怖......它真的与代码的格式和“形状”混淆。我应该怎么解决这个问题?在我的脚本底部包含自定义“html转储”功能?同样的事情,但包括? Heredocs(看起来不太好)?谢谢!
答案 0 :(得分:26)
不要惊慌,每个新的Web程序员都会面临这个问题。
您必须将程序逻辑与显示屏分开。首先,尝试使用每个网页的两个文件制作自己的解决方案:
然后包括您需要的地点/时间。 E.G:
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模式的书(或者查找关于它的堆栈溢出条目)。你要做什么 NEXT TIME 。然后你会尝试一些模板系统和框架,但 LATER 。现在,只需编写代码并从头开始学习。你可以完美地编写像这样的项目,作为一个新手,没关系。
答案 1 :(得分:8)
使用mvc方法。
这不是你会在几个小时内拿到的东西。你真的需要练习它。主要的是控制器将访问您的模型(数据库层),对您的数据执行操作,然后将其发送到视图以进行渲染。这是过于简单的,但你只需要阅读并练习它来理解它。
这是我用来帮助我学习的东西。 http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html
答案 2 :(得分:4)
尽量将您的内容和布局与代码分开。每次在.php文件中编写任何HTML时,请停下来思考“这个真的是否属于这里?”
一种解决方案是使用模板。查看Smarty模板系统是否易于使用。
答案 3 :(得分:2)
但是,这样做会让我的php代码看起来很恐怖......它真的与代码的格式和“形状”混淆。我应该怎么解决这个问题?
将PHP和HTML视为单个层次结构,具有单一,一致的缩进结构。因此,诸如“if”或“for”之类的PHP封闭结构引入了新级别的缩进,其内容始终是一组平衡的开始和结束标记。从本质上讲,无论您是否实际使用XHTML,您都会在XML意义上使PHP“格式良好”。
示例:
<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'这样的名字也是如此。)
答案 4 :(得分:1)
从您的问题的声音来看,您的代码中的逻辑和表示可能没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,原因在于您目前面临的情况。
如果您还没有看过Smarty等PHP模板引擎。
答案 5 :(得分:0)
在这种情况下,我将所有内容逐步写入变量或有时是数组,然后回显变量/数组。它的另一个优点是页面总是一次性呈现,而不是逐步呈现。
答案 6 :(得分:0)
我最终在这种情况下做的是构建我包含的HTML数据的“模板”文件,然后用正则表达式解析。它使代码保持干净,并且更容易将片断交给设计者或其他HTML人员。
查看MVC编程实践背后的理想答案 7 :(得分:0)
你需要一个框架。这不仅会使您的代码变得漂亮(因为已经提到的模型 - 视图 - 控制器模式,MVC) - 由于已经为其编写的组件,它将节省您的时间。
我推荐QCodo,这太棒了;还有其他 - CakePHP,Symfony。
答案 8 :(得分:0)
如果这是一个大项目,框架可能是有序的。如果没有,请创建一些模板文件,并在页面顶部决定要包含哪个模板文件。
例如
if ($_SESSION['logged_in'])
include(TPL_DIR . 'main_logged_in.tpl');
else
include(tPL_DIR . 'main.tpl');
只是一个简单的例子
答案 9 :(得分:0)
如上所述..你正在修复症状,而不是问题..
您需要的是逻辑和表达的分离。可以使用某种mvc框架来完成。即使你不想一直使用mvc框架..至少如果你的逻辑足够复杂,你在解释你所解释的内容时,模板引擎是必须的
答案 10 :(得分:0)
我强烈建议savant而不是聪明,
将逻辑与表示分离并不意味着所有业务逻辑都必须在PHP中,而您的表示逻辑必须在其他东西中,分离是一个概念性的事情,您需要将准备数据的逻辑从显示它的逻辑中分离出来。显然,业务逻辑不必包含表示元素。
答案 11 :(得分: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>
现在,对于这个简单的例子,这有点过分;但是对于大型项目中的复杂结构,这是使脚本逻辑远离标记的绝对方法。
答案 12 :(得分:0)
检查question有关分离PHP和HTML的方法,有多种方法可以做到这一点,包括自写模板系统,模板系统(如Smarty),PHP作为模板系统,等等。
答案 13 :(得分:0)
我认为你有两个选择,要么使用MVC框架,要么使用懒惰模板方法,这会给你的代码带来很大的开销。显然我和前者在一起,我认为学习MVC是本书中最好的网络开发技巧之一。