我是php的新手,我正在使用mysql数据库进行项目。该项目由能够撰写帖子的用户组成,然后以列表格式显示。问题是,帖子显示在网站的不同位置,如索引(主)页面和用户个人资料页面。如果你感到困惑,就像推特一样。我的问题是,显示帖子的最佳方式是什么?目前我正在使用我创建的课程。它具有从数据库中检索帖子的功能,将它们全部保存在多维数组中。然后,该类中的另一个函数使用foreach
格式化整个列表,然后返回格式化的HTML列表。我所要做的就是回复所返回的内容。但我在某处读到,编写输出HTML的函数(尤其是类函数)是不好的做法。什么是最好的方法,而不必在显示帖子的每个页面上重写相同的代码。在函数中使用HTML真是不好的做法吗?
...例 个人资料页面看起来像这样。
<
require('class.php');
require('header.php');
$profile = new Profile();
$userProfile = $profile->GetUserProfile($userID);
echo $userProfile;
$class = new Posts();
$posts = $class->GetUserPosts($userID);
echo $posts;
require('footer.php');
?>
主页看起来像这样
<
$class = new Posts();
$posts = $class->GetAllPosts();
echo $posts;
?>
其中,配置文件类将获取用户ID并输出已用HTML格式化的用户配置文件。 posts类具有返回已在HTML列表中格式化的确定数量的帖子的功能。
我应该把所有课程都保留在课堂上,还是有更好的方法?
谢谢
答案 0 :(得分:1)
好吧,如果你没有使用某种类型的MVC框架,那么我会说拥有输出HTML的函数不会杀死任何人。
然而,一般来说,将HTML与逻辑分离是有帮助的,这通常是通过创建HTML模板和散布PHP的模板片段来完成的。像这样:
<div>
<h1><?php echo $title; ?></h1>
</div>
然后,您可以设置$title
变量(和其他),并include('title_fragment.php')
输出该位的HTML。您可以扩展它以使用整个页面,使其只需处理传递给模板的少量数据。
当需要更改页面布局或外观时,您不必通过代码查找生成的HTML的位...您可以直接转到模板文件。
答案 1 :(得分:1)
这对于可维护设计和代码非常重要,并且以后可以更轻松地生成其他输出类型。
使用PHP,用于分离两者的最简单的库之一是Smarty模板。使用Smarty(或任何其他模板库),您可以编写带有布局和一些简单循环或其他构造的HTML文件,然后使用数据结构渲染该模板。至少,我会建议改变你的课程以利用模板并以这种方式产生输出,而不是用一堆带来的 print 或 echo 语句。其中包含HTML。
我甚至回避@ zombat在HTML片段中的echo语句解决方案,它们很快变得难看。
示例Smarty模板,以实现您想要的东西:
{section name=i loop=$posts}
<li>{$posts[i].author} — {$post[i].text}</li>
{/section}
还有一些PHP支持代码:
// Instantiate Smarty object
$smarty = new Smarty();
// Assign a hash of data
$smarty->assign('posts', array(
array('author' => 'Jim', 'text' => 'Hi this is my post!'),
array('author' => 'Sally', 'text' => 'My first post to the system')
)
);
// Use the file with the above template in it
$smarty->display('posts.html');
将数据分配给模板的部分应该通过一些编程方法完成,以将类对象列表转换为哈希列表。
通过这种方式,您可以通过编辑HTML模板轻松更改输出的显示方式,而无需担心触摸任何代码来更改输出。
答案 2 :(得分:0)
理想情况下,您的课程应仅提供数据。使用另一个PHP文件或通用类来输出HTML,以后您可以输出例如来自同一数据类的XML,JSON等。这将您的数据处理(模型/控制器)与数据表示(视图)分开。
我不同意使用像Smarty这样的模板引擎。 PHP 是模板引擎。
答案 3 :(得分:0)
您可以使用输出缓冲。它有助于构建模板,而不是被迫按显示顺序处理数据。
<?php
$posts = take_data_from_class();
ob_start();
require_once('path/to/posts.php');
$html_posts = ob_get_clean();
// you can do the same with other parts like header or footer
ob_start();
require_once('path/to/header.php');
$header = ob_get_clean();
ob_start();
require_once('path/to/footer.php');
$footer = ob_get_clean();
?>
在posts.php中,您可以显示帖子:
<? foreach ($posts as $p) { ?>
<div class="...">
post data here
</div>
<? } ?>
现在,要展示整件事:
<?php echo $header . $html_posts . $footer; ?>
更多http://us3.php.net/manual/en/book.outcontrol.php
享受!
答案 4 :(得分:0)
我根本不熟悉Smarty ......究竟是如何工作的,以及使用smarty与仅创建函数来获取大量数据并返回包含该数据的html以便稍后回应的好处是什么? ?