【问题标题】:Dynamically generating page links for a CMS为 CMS 动态生成页面链接
【发布时间】:2011-08-30 01:05:34
【问题描述】:

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

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

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

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

理想情况下,应该有一个脚本在创建页面时根据 DB 表的页面名称行创建指向页面的链接。但是你如何获得这些与?=pageName 结尾的链接呢?如果我只知道它是如何工作的,那么我可以弄清楚其余的。

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

【问题讨论】:

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


    【解决方案1】:

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

    我们可以在没有路由的情况下使用这种模式,只需将我们的应用程序放在索引页面中即可。下面的脚本显示了您尝试以最简单的方式执行的操作的示例。我们的脚本基本上只有一页。我们可以通过更改 url 中的 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>
    

    【讨论】:

    • 谢谢!我实际上正在实施一种您建议的粗略框架。这些 in page 将在一个单独的文件中的其他地方,我确实有一个引导文件,其中连接变量作为常量,我正在创建一个文件来保存所有最常见的函数,以便我可以包含它们。我得到了理论,你的回答很有帮助,告诉我我越来越近了。这个怎么样:我使用 if 语句。如果未设置 GET,则从默认数据库行返回数据。如果 GET isset 则从 GET 保存的行中返回数据(例如 where id=whatever 和 page name=something.?
    • 达甘!谢谢!我只是重新阅读了该代码,它几乎与我在脑海中看到的完全一样!现在我该如何处理不同的页面模板?如果每个页面都有相同的布局,我可以使用相同的索引,并根据 GET 的值从不同的 DB 行调用不同的内容。但是,如果除了主页之外,每个页面的 HTML 都不同,我将不得不调用另一个 PHP 脚本,它基本上与 index 做同样的事情,但混合了不同的 HTML。我怎样才能避免这种情况并将所有内容保留在 index.php 上?
    • 非常好的和彻底的答案!
    【解决方案2】:

    I think you need to read about $_GET.

    我还推荐一本不错的 PHP 书。忘记在线教程;它们(在大多数情况下)完全没用。

    【讨论】:

    • 我现在正在阅读一本 PHP 书籍。我试图在 PHP.net 上了解 $_GET,但它变得令人困惑。你是说我可以编写一个使用 GET 和一些参数或值的脚本来提供一个调用正确数据库行的函数吗?我想我已经掌握了理论,但我真的可以使用一个至少部分与我的场景相关的实际示例。
    • @Bill:不幸的是,您的问题非常广泛,据我所知,相当于“我如何使用 PHP?”这绝不是一种侮辱,但我认为通读一本优质的 PHP 书籍将帮助您在尝试处理像您描述的那样的大型项目之前掌握 HTML 预处理器的基本概念。
    • 我明白了。我很尴尬地问,但我还是很高兴我问了。显然,我对 PHP 的了解参差不齐,但我非常感谢您提到 GET。我正在调查它,它似乎正是我所需要的。谢谢。也就是说,我仍然对他人的想法持开放态度。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多