我正在从头开始创建自己的CMS,以此来构建我的php和mysql技能。一切进展顺利,但我正在为我写的每个博客文章创建单独的帖子页面。因此,index.php页面列出了我所有博客的每个帖子的片段,并且有一个阅读更多按钮,可以将用户带到每个博客帖子的整个页面。每个帖子都有一个网址,该网址是在“创建帖子”表单中输入的博客标题创建的。我试图弄清楚如何为每个帖子创建唯一的页面,而不通过GET传递标题,小标题,发布内容和其他信息。
这也与我试图添加的另一个功能相吻合。我希望能够使用“创建页面”表单创建单独的页面,就像我为帖子所做的那样。因此,如果我想要一个“关于我们”页面,我会转到我的管理员表单,填写标题,添加内容,当我点击提交时,它会动态创建页面。我整天都在想我将如何做这两件事但却无法弄清楚我是如何做到这一点的。
仅供参考,我不是要求代码,我只是需要向正确的方向努力,因为我试图概念化如何实现这一目标。谢谢!
答案 0 :(得分:5)
如果您不熟悉模型 - 视图 - 控制器模式,那么阅读它可能是谨慎的。 MVC通常是Web应用程序高级设计的正确起点。
此外,CMS是一个足够大的项目,你应该考虑使用像CodeIgniter,Symfony,Zend等PHP框架来让你的生活更轻松。它消除了许多苦差事和常见任务。
动态页面创建和显示
我认为您希望将其分为两部分:文本内容(基本上是您在表单中添加的内容)以及围绕该内容的HTML模板。
当您创建页面或博客帖子时,您可能希望将实际内容(您在创建表单中键入的内容)存储在某种类型的数据库中(不一定是RDBMS,但如果您正在尝试构建MySQL)技能这是一个合理的选择)。
然后,您将使用单独的函数将该内容绑定到HTML模板中,并在加载给定页面时将其呈现给用户。
网址路由
要获得更好看的网址,您可以使用类似apache的mod_rewrite。您可以使用它来转换这样的URL:
posts/how-to-make-a-cms
到此:
posts.php?title=how-to-make-a-cms
然后你可以像往常一样从GET读取posts.php。你如何选择进行转换是非常开放的。
为了避免真正复杂的重写,人们通常只是构建所有内容以转到中央路由脚本,该脚本确定要调用的类和方法以及传递它的参数。所以它会将上面的URL重写为:
main.php?a=posts/how-to-make-a-cms
然后main.php会从GET中解析出该参数的片段,并找出发送它们的位置。就像它可能需要posts/show/how-to-make-a-cms
并做类似的事情:
$o = new Posts();
$o->show("how-to-make-a-cms");
如果你这样做,我认为你可以完全避免使用mod_rewrite,只要你愿意只接受稍微漂亮的URL,就像这样:
mysite.com/main.php?/posts/show/how-to-make-a-cms
我之前没有做过这种事情(因为框架已经做得非常漂亮),所以我可能会遗漏一些细节。
答案 1 :(得分:1)
你应该看一些来自phpacademy.org或thenewboston.org的教程,他们有关于PHP的最好和最有价值的教程。
我想您可以尝试从该课程/播放列表开始:
phpacademy.org: PHP Tutorials: Creating a Blog
如果您不了解所有内容,请观看:
thenewboston.org: Official Beginner PHP Tutorials Playlist!
如果您对PHP本身没有任何问题,可以尝试使用一些支持MVC的简单框架。这有助于在页面之间进行变量处理,使数据库工作更容易等。
答案 2 :(得分:1)
我遇到了同样的问题。您可以使用fopen函数轻松完成此操作。以下是教程的链接:http://www.tizag.com/phpT/filecreate.php
<?php
function wwwcopy($link,$file)
{
$fp = @fopen($link,"r");
while(!feof($fp))
{
$cont.= fread($fp,1024);
}
fclose($fp);
$fp2 = @fopen($file,"w");
fwrite($fp2,$cont);
fclose($fp2);
}
//Example on using this function
wwwcopy("http://www.domain.com/list.php?member=sample", "sample.html");
//Another example
wwwcopy("http://www.domain.com/list.php?member=sample2", "sample2.html");
?>