动态生成CMS的页面链接

时间:2011-05-21 00:30:05

标签: php mysql dynamic content-management-system hyperlink

我已经进行了广泛的搜索,每个CMS教程都没有解释这一点,或者给你一大堆代码而不解释它是如何工作的。即使在堆栈溢出时我也找不到任何接近答案的内容,但是如果有人能指出我的答案,我可以吃掉我的话。

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

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

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

理想情况下,会有一个脚本在创建页面时根据数据库表的页面名称行创建指向页面的链接。但是,如何在最后获得?=pageName的链接?如果我只知道它是如何工作的那么我可以想出其余的。

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

2 个答案:

答案 0 :(得分:4)

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

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

下面的解决方案可以帮助您入门,但是当您需要管理页面时,您会怎么做?你如何验证用户?你为另一个页面复制了很多代码吗?如果你认真对待你的CMS,那么你想要在它下面实现某种框架。用于处理URL,路由到应用程序,加载配置文件以及可能管理数据库连接的框架。是的,它变得复杂,但如果你一次解决每个问题就不行。利用类或函数来共享代码以启动。至少在页面顶部包含一个通用的“bootstrap”文件来初始化常用功能,例如数据库连接。阅读Stack Overflow只是为了跟上最新进展。您可以学习很多术语,并且可能会找到一些您甚至不想知道的问题的答案。


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

  • 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>

答案 1 :(得分:1)

I think you need to read about $_GET.

我还推荐一本不错的PHP书。忘记在线教程;它们(大部分)完全无用。