php - 为 CMS 动态生成页面链接

标签 php mysql dynamic content-management-system hyperlink

我进行了广泛的搜索,那里的每个 CMS 教程要么根本没有解释这一点,要么给了你一大堆代码而没有解释它是如何工作的。即使在堆栈溢出时,我也找不到任何接近答案的东西,但如果有人能指出我的答案,我会接受我的话。

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

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

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

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

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

最佳答案

您的账单实际上是在正确的轨道上。今天几乎所有的网络软件都进行大量的 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 只是为了跟上最新的进展。您可以学到很多术语,并可能找到一些您甚至不知道自己想问的问题的答案。


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

  • 页面编号
  • 页面名称
  • 页面标题
  • 页面主体

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

关于php - 为 CMS 动态生成页面链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6078809/

相关文章:

mysql - 针对供应商和服务对 MySQL 中的 SQL 进行排名

javascript - jquery 动态选择单选按钮(表单重置问题)

php - 使用 MySQL PDO 显示每种费用类型下的费用

php - 显示 MySQL 中包含相同值的所有行

php - 在 Cookie 中存储登录信息

haskell - 结合 Data.Dynamic 和类型类

ios - 使用 NSString 变量的名称创建可变数组

php - 来自 PHP (CodeIgniter) 的 MySQL 调用无法正常工作

mysqlcheck 不接受密码

java - 如何在部署在 tomcat 上的 JBPM 6.2 中设置应用程序角色