2011-05-21 149 views
1

我已经搜索了很多,每个CMS教程都没有解释这一点,或者给你一大块代码,而没有解释它是如何工作的。即使在堆栈溢出问题上,我也找不到任何接近答案的东西,尽管如果有人能指出我的答案,我可以吃掉我的话。动态生成CMS的页面链接

我在这个项目中使用PHP和mysql。

我正在构建一个CMS。它非常简单,我理解我认为我需要的每个概念,除了如何动态生成页面和页面链接。我想要做的方式是让数据库表存储页面的名称和页面的主要内容。就这样。然后,我只需调用一个脚本即可将页面的主要内容拖入我碰巧呼叫的任何页面。没什么大不了的,对吧?错误。

这是问题所在。如果我要这样做,那么我必须为每个我想创建的页面创建一个文件,该文件调用从正确的数据库行中提取内容的脚本。因此,我可以将各种页面名称和内容添加到表格中,但是我不知道如何在每次要链接到新页面时手动创建新文件的情况下调用它们。

理想情况下,会创建一个脚本,该脚本根据数据库表的页面名称行创建页面链接。但是,最后如何获得与?=pageName的链接?如果我只是知道如何工作,那么我就可以找出其他问题。

UPDATE 第二个答案确实证实了我认为我必须做的一切,但有一个问题。我现在的计划是将所有代码分解为一系列函数,并将它们包含在不同的模板中或要求它们用于格式化页面显示方式。我需要一个寻找主页和其他页面的其他设计。我在想我会有一个函数说ID是0,然后调用这个页面template.php,否则调用这个其他模板file.php。但是,我如何将所需的变量传递给这些新文件?我是否只包含index.PHP页面?

回答

4

比尔你真的在正确的轨道上。今天几乎所有的网络软件都会进行大量的URL处理。传统上你会在你的web根目录下有php页面,然后利用URL中的查询字符串来改进页面的输出。你已经到达了为什么这可能不被期望。所以流行的选择是Front Controller设计模式。基本上,我们将每个请求都汇集到index.php页面,然后将请求路由到Web根目录之外的内部页面或应用程序。这可能会变得很复杂,每个人似乎都以独特的方式实现这一模式。

我们可以通过简单地将我们的应用程序放入索引页面来使用这种模式,而无需路由。下面的脚本以最简单的方式显示了您想要做什么的例子。我们基本上有一个页面与我们的脚本。我们可以通过更改我们网址中的ID查询字符串来请求虚拟页面。例如www.demo.net/?id=0可以用作您网站的索引。这应该与没有'id'查询的www.demo.net相同。即使你不知道问题是什么,只要一个接一个地解决这些问题。一旦你开始查看其他人的代码,那么你就可以开始看到其他人如何解决你的问题。

下面的解决方案将帮助您开始,但是当您需要管理页面时,您会做什么?你如何认证用户?你是否为另一个页面重复了很多代码?如果你认真对待你的CMS,那么你会想要在它下面实现某种框架。一个框架来处理URL,路由到您的应用程序,加载配置文件,并可能管理您的数据库连接。是的,它变得复杂,但不是如果你一次解决每个问题。利用类或函数来共享代码以开始。至少在页面顶部包含一个通用的“引导程序”文件,用于初始化数据库连接等常用功能。阅读堆栈溢出只是为了跟上发生了什么。你可以学习很多术语,并可能找到一些你甚至不知道你想问的问题的答案。


下面假设我们有一个具有以下字段的表:

  • PAGE_ID
  • PAGE_NAME
  • PAGE_TITLE
  • page_body

<?php 
//<--------Move outside of web root--------------> 
define('DB_HOST', 'localhost'); 
define('DB_USER', 'cms'); 
define('DB_PASS', 'changeme'); 
define('DB_DB',  'cms'); 
define('DB_TABLE', 'cms_pages'); 
//<----------------------------------------------> 

//Display errors for development testing 
ini_set('display_errors','On'); 

//Get the requested page id 
if(isset($_GET['id'])) 
{ 
    $id = $_GET['id']; 
} 
else 
{ 
    //Make page id '0' an index page to catch all 
    $id = 0; 
} 

//Establish a connection to MySQL 
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die(mysql_error()); 

//Select the database we will be querying 
mysql_select_db(DB_DB, $conn) or die(mysql_error()); 

//Lets just grab the whole table 
$sql = "SELECT * FROM ".DB_TABLE; 
$resultset = mysql_query($sql, $conn) or die(mysql_error()); 

//The Select Query succeeded, but returned 0 result. 
if (mysql_num_rows($resultset)==0) 
{ 
    echo "<pre>Add some Pages to my CMS</pre>"; 
    exit; 
} 

//This is our target array we need to fill with arrays of pages 
$result = array(); 

//Convert result into an array of associative arrays 
while($row = mysql_fetch_assoc($resultset)) 
{ 
    $result[] = $row;  
} 

//We now have all the information needed to build our app 
//Page name - Short name for buttons, etc. 
$name = ""; 

//Page title - The page content title 
$title = ""; 

//Page body - The content you have stored in a table 
$body = ""; 

//Page navigation - Array of formatted links 
$nav = array(); 

//Process all pages in one pass 
foreach($result as $row) 
{ 
    //Logic to match the requested page id 
    if($row['page_id'] == $id) 
    { 
     //Requested Page 
     $name = $row['page_name']; 
     $title = $row['page_title']; 
     $body = $row['page_body']; 
     $page = "<b>$name</b>"; 
    } 
    else 
    { 
     //Not the requested page 
     $page = $row['page_name']; 
    } 

    //Build the navigation array preformatted with list items 
    $url = "./?id=" . $row['page_id']; 
    $nav[] = "<li><a href=\"$url\">$page</a></li>"; 

} 

?> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <title>SimpleCMS | <?php echo $title; ?></title> 
</head> 
<body> 
<div> 
    <div id="navigation" style="float:left;"> 
     <ul> 
      <?php 
       foreach($nav as $item) 
       { 
        echo $item; 
       } 
      ?> 
     </ul> 
    </div> 
    <div id="content"><?php echo $body;?></div> 
</div> 
</body> 
</html> 
+0

谢谢!我实际上正在实施一种像你所建议的粗糙框架。这些在页面将在其他地方在一个单独的文件,我确实有一个引导文件与连接变量作为常量,我正在创建一个文件来保存所有最常用的功能,所以我可以包括他们的过程。我得到的理论和你的答案帮助了很多,并告诉我我越来越近了。这个如何:我使用if语句。如果未设置GET,则返回默认数据库行中的数据。如果GET isset,然后从GET持有的行返回数据(比如where id = whatever和page name = something。? – Bill 2011-05-21 19:59:15

+0

Daganh!谢谢!我只是重读了这段代码,这几乎就是我在头脑中看到的!我使用不同的页面模板?如果每个页面的布局相同,我可以使用相同的索引,并根据GET的值从不同的DB行调用不同的内容。但是,如果每个页面中的HTML不同但主页I将不得不调用另一个PHP脚本,基本上与索引做同样的事情,但混合了不同的HTML。我怎样才能避免这种情况,并保持index.php上的一切? – Bill 2011-05-21 21:06:00

+0

非常好的和彻底的答案! – SquareCat 2013-12-19 22:19:30

1

I think you need to read about $_GET.

我也推荐一个体面的PHP的书。忘记在线教程;他们(大部分)完全无用。

+0

我正在阅读PHP书。我试图在PHP.net上学习$ _GET,但它令人困惑。您是否在说我可以编写一个使用GET和一些参数或值的脚本来提供将调用正确DB行的函数?我想我得到的理论,但我真的可以用一个实际的例子,至少部分涉及到我的情况。 – Bill 2011-05-21 00:41:38

+0

@Bill:不幸的是,您的问题确实非常广泛,并且据我所知可以达到“我如何使用PHP?”。我绝对不认为这是一种侮辱,但我认为通过高质量的PHP书籍阅读将帮助您在尝试解决大规模项目(如所描述的项目)之前掌握HTML预处理器的基本概念。 – 2011-05-21 00:43:40

+0

我明白了。我很尴尬地问,但仍然很高兴我做到了。我对PHP的了解很明显,但我非常感谢你提到GET。我正在研究它,它看起来正是我所需要的。谢谢。也就是说,我仍然愿意接受别人的想法。 – Bill 2011-05-21 00:51:56