使用自定义CMS动态创建PHP新页面

3
我正在从零开始创建自己的CMS,以此来提高我的php和mysql技能。一切都进行得很好,但我想要为我写的每篇博客文章创建单独的帖子页面。因此,index.php页面列出了所有博客的清单,并且每个帖子都有一个摘录,并有一个“阅读更多”按钮,应该将用户带到每个博客文章的完整页面。每个帖子都有一个由“创建帖子”表单中输入的博客标题创建的URL。我正在尝试弄清楚如何创建每个帖子的唯一页面,而不需要通过GET传递标题、副标题、帖子内容和其他信息。
这也与我正尝试添加的另一个功能相吻合。我希望能够使用“创建页面”表单来创建单独的页面,就像我为我的帖子所做的那样。因此,如果我想要一个“关于我们”的页面,我会进入我的管理员表单,填写标题,添加内容,当我点击提交时,它会动态创建页面。我已经思考了一整天如何做这两件事,但还不能确定如何实现。
顺便说一下,我不是在寻求代码,我只需要在我尝试概念化如何实现时获得正确方向上的推动。谢谢!

1
不传递任何内容,如何在单篇文章页面上显示内容。您必须通过get或post至少传递一个文章id。然后,您可以使用永久链接将url更改为任何您喜欢的样式。 - Jasminder Pal Singh
@jasminder,这是我一直在脑海中思考的问题,也是我能想到的唯一实现方式,但在编码之前我想确认一下。 - heyjohnmurray
2
不要这样想:“我想为我写的每篇博客文章创建单独的帖子页面。”你应该想要创建一个名为“post.php”的页面,它可以根据链接中的参数显示动态(可变)内容,例如:“post.php?postid=1”。 - Kamil
有趣的是,只要访问http://thenewboston.org/,我就能在某种程度上理解我们正在讨论的内容。他们所有的教程视频都在一个名为watch.php的模板上,然后在URL中添加了一个ID。有趣的是,这在我的脑海中一下子就明白了。 - heyjohnmurray
1
当你掌握了具有可变内容的动态页面创意后,你可以尝试使用htaccess重写URL,将帖子标题放在链接中而不是ID中,或者您可以使用一些PHP框架。CodeIgniter是最容易学习的,可以节省很多时间在页面之间的POST / GET变量“战斗”上。我在1小时内学会了CI... - Kamil
@Kamil,感谢您的建议,CodeIgniter 绝对是要学习的事情清单上的一项。 - heyjohnmurray
3个回答

5
如果您不熟悉模型-视图-控制器模式,阅读相关资料可能是明智之举。MVC通常是Web应用程序高级设计的正确起点。
此外,CMS是一个足够大的项目,您应该考虑使用PHP框架,如CodeIgniter,Symfony,Zend等来使生活更轻松。它可以消除许多单调乏味的工作和常见任务。
动态页面创建和显示
我认为您想将其分成两个部分:文本内容(基本上是表单中输入的内容)和围绕该内容的HTML模板。
当您制作页面或博客文章时,您希望将实际内容(您在创建表单中键入的内容)存储在某种数据库中(不一定是关系型数据库,但如果您想构建MySQL技能,则是一个合理的选择)。
然后,您将使用单独的函数将该内容绑定到HTML模板中,并在用户加载给定页面时呈现它。
URL路由
为了获得更美观的URL,您可以使用类似于Apache的mod_rewrite。您可以使用它将URL转换为类似于以下内容: 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");

如果您这样做,只要您愿意接受略微美观的URL,就可以完全避免使用mod_rewrite,例如:mysite.com/main.php?/posts/show/how-to-make-a-cms。我以前没有做过这种事情(因为框架已经做得很好了),所以可能会错过一些细节。

1
我不确定MVC适合那些没有PHP经验的人。 - Kamil
@Kamil,MVC不仅适用于PHP,所以我不知道你为什么会这样说。它是一种广泛的设计模式,对于任何在设计CMS之类的东西时都很重要。 - FoolishSeth
@FoolishSeth,你说:“然后,您将使用单独的函数将该内容绑定到HTML模板中,并在用户加载给定页面时呈现它。”我知道我需要将我的标题、副标题、内容等放入模板中,但是如何使每个博客URL都成为例如“www.sitename.com/this-is-post-1”或“www.sitename.com/about.php”,而不是“www.sitename.com/?post_id=12”?这是可能的吗,还是应该创建具有该URL结构的每个页面,然后使用URL重写使URL实际上变得“漂亮”? - heyjohnmurray
好的,框架会使这种路由变得非常容易,但我会在答案中更新一些关于URL路由的信息。 - FoolishSeth
@FoolishSeth 好的,你可能是对的。我们要给他看看CodeIgniter吗? :) - Kamil
@FoolishSeth,我刚刚看到你在早先评论中添加的细节。非常感谢。根据你、Kamil和Jasminder之前所说的,我已经开始编写我的其他页面,现在一切都很完美。一旦我把所有东西都设置好了,我就会回去进行重写。谢谢你们的帮助! - heyjohnmurray

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"); 

?>

你的代码很完美,只需要做一些修改:在第7行,你应该写成类似于“$cont =”而不是“$cont .=”(没有点号)。 - TheBosti

1

你应该观看一些来自phpacademy.orgthenewboston.org的教程,它们是有史以来关于PHP最好和最有价值的教程。

我认为你可以从这个课程/播放列表开始:

phpacademy.org: PHP教程:创建博客

如果你不理解所有内容,可以观看这个:

thenewboston.org: 官方初学者PHP教程播放列表!


如果您对 PHP 本身没有问题,可以尝试使用一些带有 MVC 支持的简单框架。这在页面之间处理变量、更轻松地处理数据库等方面非常有帮助。 phpacademy.org: CodeIgniter 简介 phpacademy.org: CodeIgniter 基础网站

1
我知道phpacademy,那个确切的链接已经在我这周要做的事情清单上了,所以你提到它真是很有趣。 - heyjohnmurray
你应该立即开始观看这些教程,而不是浪费时间询问已经在这些教程中专业解释过的内容 :) - Kamil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接