【发布时间】:2011-03-09 14:47:29
【问题描述】:
我只是想知道在 PHP Web 项目中将逻辑组件与布局分开的最佳方法是什么?
内容存储在 MySQL 中,逻辑是 PHP,模板当然是 HTML/CSS。 我的问题是,如何最好地解决这个问题(不使用 CMS)。
打个招呼
【问题讨论】:
-
(tipp) 环顾 SO 寻找 MVC。
我只是想知道在 PHP Web 项目中将逻辑组件与布局分开的最佳方法是什么?
内容存储在 MySQL 中,逻辑是 PHP,模板当然是 HTML/CSS。 我的问题是,如何最好地解决这个问题(不使用 CMS)。
打个招呼
【问题讨论】:
使用Template Engine,例如Smarty。
或者只使用带有嵌入 php 的 HTML 作为模板,只是注意不要在模板中放入太多逻辑。
【讨论】:
只需使用一些模板引擎。
最熟悉的就是 PHP 本身。
这是一个非常基本的 CRUD 应用示例:
只做数据操作的逻辑部分
<?
mysql_connect();
mysql_select_db("new");
$table = "test";
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part:
$name = mysql_real_escape_string($_POST['name']);
if ($id = intval($_POST['id'])) {
$query="UPDATE $table SET name='$name' WHERE id=$id";
} else {
$query="INSERT INTO $table SET name='$name'";
}
mysql_query($query) or trigger_error(mysql_error()." in ".$query);
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
exit;
}
if (!isset($_GET['id'])) { //listing part:
$LIST=array();
$query="SELECT * FROM $table";
$res=mysql_query($query);
while($row=mysql_fetch_assoc($res)) $LIST[]=$row;
include 'list.php';
} else { // form displaying part:
if ($id=intval($_GET['id'])) {
$query="SELECT * FROM $table WHERE id=$id";
$res=mysql_query($query);
$row=mysql_fetch_assoc($res);
foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v);
} else {
$row['name']='';
$row['id']=0;
}
include 'form.php';
}
?>
还有两个负责输出的简单模板,
form.php
<? include TPL_TOP ?>
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>
<? include TPL_BOTTOM ?>
和list.php
<? include TPL_TOP ?>
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
<? include TPL_BOTTOM ?>
虽然有很多其他模板引擎,不同种类和意识形态。
【讨论】:
尝试类似的 MVC 框架
代码点火器: http://codeigniter.com/
或 CakePHP: http://cakephp.org/
(Cake 的学习曲线更陡峭,但会自动完成更多工作)
以下是 MVC 的内容: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
【讨论】: