【问题标题】:Web pages generation (CMS like) [closed]网页生成(类似 CMS)[关闭]
【发布时间】:2014-01-20 19:41:34
【问题描述】:

出于学习目的,我决定了解 Joomla 等 CMS 如何生成网页。根本没有物理页面的事实让我感到不舒服。我的意思是你在使用 Joomla 时在你的主机上找不到 about.htmlcontacts.html 网页,你所拥有的只是大量的 PHP 文件,它们会从 MySQL 生成你需要的页面(我猜)。

我想了解这是如何工作的?例如,当有人去http://example.com/about.html 时,Joomla 会做什么?如果我的目录中没有页面about.html,当有人通过这个链接时,Joomla如何生成我需要的页面?

由于对这个主题缺乏了解,我无法提出简短的问题,这就是为什么谷歌搜索对我没有太大帮助,所以如果有人能告诉我应该从哪里看或从哪里开始,那就太好了一些简单的例子。

我希望至少能够创建一个页面,当用户转到example.com/topic.php 并知道它是如何工作时,它由 PHP 生成。

UPD:我是为了 SEO 需要这个,还是简单的静态页面也可以?

【问题讨论】:

  • 一切都始于.htaccess。您将看到一条规则,该规则会尝试访问任何不存在的文件以调用确定的 PHP 脚本,然后它将生成或路由到所需的内容。
  • 下载 joomla,阅读源代码和手册
  • 你为什么不自在?大多数 CMS 都有一个路由引擎,可以引导请求加载正确的页面。页面内容存储在数据库中,因此可以添加无限数量的页面。
  • 它不生成页面,它只是从数据库中获取标识符和内容。像example.com/1/title 1 是一个数据库ID,因此它通过该ID 从数据库中获取所有内容。扩展只是一个 apache 技巧。你很快就会得到它:)
  • 如果投票结果接近,我将投票支持重新开放。这是一个新手,但一个很好的问题

标签: php mysql joomla


【解决方案1】:

我给了你一个赞成票:

所有你有无限的 php 文件...

那是因为 Joomla 的代码很糟糕。然而,所有的内容管理系统都有本质上相同的问题需要解决。基本目标是将给定的 url 与所需的“页面”相关联——即内容/布局/样式等。管理面板让您选择/创建内容并将其关联到给定的 url。内容和设置存储在数据库中。当您访问该站点时,您实际上被定向到一个 php 文件 - index.php。该 php 文件将拉入其他 php 文件,它需要基本上查看当前 url,找到该 url 的内容和设置,并使用这些设置显示该内容。

您的大部分担忧似乎与路由有关。在此处查看我的答案,了解路由的基本示例(这应该对您有很大帮助):Htaccess and user accounts

内容管理系统通常还允许您将页面内容与其设计分开。这是一件了不起的事情。如果您的网站上有 20 个页面,并且您决定重新设计网站,那么您根本不需要接触内容。考虑一下:

<article>
  <header>
    <h1>{{article.title}}</h1>
    <time>{{article.date | date:'mediumDate'}}</time>
    <span>by <a href="{{article.authorHref}}">{{article.author}}</a></span>
    <p>From: <a href="{{article.categoryHref}}">{{article.category}}</a></p>
    <p>{{article.categoryDesc}}</p>
  </header>
  <section>{{article.content}}</section>
</article>

这是来自我正在创建的 CMS 的实际模板标记。如果我有 20 页的文章,那么这一套代码将在所有 20 页上重复。把手{{}} 是用于从数据库中拉入内容的挂钩。因此,如果我想更改文章布局,我可以简单地打开这个模板文件并将其更改为:

<article>
  <section>{{article.content}}</section>
  <footer>
    <h1>{{article.title}}</h1>
    <time>{{article.date | date:'mediumDate'}}</time>
    <span>by <a href="{{article.authorHref}}">{{article.author}}</a></span>
    <p>From: <a href="{{article.categoryHref}}">{{article.category}}</a></p>
  </footer>
</article>

这肯定比必须更改 20 个文件中的代码更好! CMS 中的很多东西都是模板化的 - 整个网站以及单个内容片段(插件),如 twitter 提要等。

关于搜索引擎优化

SEO 抓取工具只能看到页面的来源。在这一点上,静态页面和 CMS 生成的页面没有区别。

网址

使用 CMS 的一大优势是它可以强制执行 SEO 原则。首先,为了获得 SEO url,您必须实现某种路由,使您的 url 看起来像 site.com/about 而不是 site.com/about.html。一个好的 CMS 将具有此内置功能。

元标记

虽然&lt;meta&gt; 标签现在不像以前那么重要,但它们仍然很有帮助。如果您在管理面板中设置它们,CMS 应该会根据默认设置自动为您生成这些内容,并为每个页面提供可选覆盖。您可能会争辩说,这确保了每个页面上都有元数据并且不会被遗忘。

【讨论】:

  • 我只是在问这个问题!你的直觉很好,谢谢你的 SEO 观点
  • @bla2eOD 我看到了你的更新 =D
  • 另外,我想我可以添加一些从数据库中获取数据的字段,因此更新设计或文本会更容易,正如你提到的,但我仍然会有“真实”的 html 页面对吧?
  • @bla2eOD 想一想:如果您有一个 5 页的网站并且每个页面都有相同的标题。页脚和侧边栏,那么您将要为每个文件创建一个文件。然后在 5 个页面中的每一个上,您只需使用 include "header.php"; 等。正如我所说,您还需要有一个 php 文件来处理所有请求,只是为了修复 url(请参阅我的关于路由的链接) .这为您提供了一些可合理维护的东西......但它也越来越接近成为 CMS =D。这当然不是静态页面。
  • @bla2eOD 我可能会称之为基本动态页面生成。 CMS 会有一个管理面板,因为非开发人员需要能够使用它,而且它非常好。
【解决方案2】:

我记得当我在制作静态页面多年后开始使用 CMSes 时,缺少 html 文件对我来说也很奇怪。 http://docs.joomla.org/Where_are_the_web_pages%3F

与大多数现代(又名“web 2.0”)网络应用程序一样,Joomla 将演示与内容分开。
这当然是在简化,但是...

内容存储在数据库中。 演示文稿由模板管理(Joomla 的默认模板或您替换的各个部分)。

Joomla 是一种响应页面请求的软件,它将您的内容和演示文稿汇集并返回,最常见的是作为 HTML 发送到浏览器。 Joomla 可帮助您管理复杂和动态的页面构建,减少或消除手动构建页面的需要,但仍允许您以不同的方式进行尽可能多的手动构建。

PHP 作为一门语言的创建就是考虑到这个想法。

当 Joomla 将网页放入浏览器时,它会做很多事情(再次简化)。 它从模板文件夹中加载模板的 index.php。这为页面提供了基本结构。如果您查看该文件,您会看到熟悉的&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt; 标签,就像您在静态页面中看到的一样。您还将看到包含 css 和 javascript,但不是以普通的 HTML 方式,而是以一种经过修改使其更灵活的方式。元数据也是如此,Joomla 将以灵活的方式将来自不同位置(您的站点配置、特定文章等)的元数据放在一起,而不是您在文件中单独输入。

一旦到达&lt;body&gt;,Joomla 就会开始提取数据和 html 布局。它对数据库的不同部分进行查询,以获取您的文章文本、菜单链接列表、了解查找最受欢迎的标签等,基本上是您页面中想要的任何数据。

然后它会得到我所谓的布局,它们基本上是为页面的较小部分定义 html 的文件(例如文章文本、菜单、最流行的标签列表)。这些有点分散,但是 joomla 首先在模板的 html 文件夹中查找它们(例如 templates/beez3/html),如果它们不存在,它会在 tmpl 文件夹中查找,您将在组件的 views 文件夹中看到和模块。这些天来,布局的一些共享元素也可以在顶层的 layouts 文件夹中找到,但这些元素是从其他布局中调用的,而不是直接调用的。 因此,对于这个包含文章、菜单和流行标签模块的页面,它将从

获取布局
  • /components/com_content/views/article/tmpl
  • /modules/mod_menu/tmpl
  • /modules/mod_tags_popular/tmpl

或任何替换您放入模板的 html 文件夹中的内容。 现在 Joomla 基本上采用布局和他们说的地方,它用数据库中的数据替换 PHP 变量。 所以在流行的标签中我们会得到这样的代码

<ul >
    <?php foreach ($list as $item) : ?>
    <li><?php $route = new TagsHelperRoute; ?>
        <a href="<?php echo JRoute::_(TagsHelperRoute::getTagRoute($item->tag_id . '-' . $item->alias)); ?>">
            <?php echo htmlspecialchars($item->title); ?></a>
        <?php if ($display_count) : ?>
            <span class="tag-count badge badge-info"><?php echo $item->count; ?></span>
        <?php endif; ?>
    </li>
    <?php endforeach; ?>
</ul>

所以你看到了你在 html 中所期望的 &lt;ul&gt;&lt;/ul&gt;,&lt;li&gt;&lt;/li&gt;&lt;span&gt;&lt;/span&gt;&lt;a&gt;&lt;/a&gt;,但是我们看到我们正在使用 PHP 来自动化一些事情,比如获取标题文本 ($item->title) 或次数已使用标签 ($item->count) 或 url echo JRoute::_(TagsHelperRoute::getTagRoute($item->tag_id . '-' . $item->alias));这是 Joomla 管理路由和生成 SEF URL 的地方。 这就是我们使用 CMS 的原因,以便能够自动执行所有这些任务,这样我们就可以将数千个页面全部由几个文件管理。

现在,上述内容有例外和变化。例如,您可以从文件或 Web 服务中获取数据,可以返回 json 而不是 html,等等,但这是基本原则。将演示与内容分开,让设计师控制演示,但让她或他不必担心内容,让内容创建者不必担心设计,让开发人员不必担心'两者都不必担心,让它变得足够简单,让身兼三职的网站管理员仍然可以弄清楚。

现在生成你想要的一个页面...... Joomla 永远不会以你拥有的方式在末尾创建一个带有 php 的 url。它总是没有扩展名或您在全局配置中选择的扩展名,通常是 .html 或 .htm。因此,假设您想要 topic.html。 转到管理员处,确保您已打开所有 SEF 功能(并将 htaccess.txt 复制到 .htaccess 或将其添加到现有的 .htaccess 中)。然后转到文章管理器并创建一篇文章。然后转到菜单管理器和主菜单。使用您创建的文章创建单个项目菜单链接,并将别名设为“主题”。现在转到您网站的前端并刷新。单击您的新菜单链接。


好的,那么问题是当 Joomla 以 SEF URL 的形式发送请求时会发生什么。 所以首先,让我们假设您没有使用 SEF 网址,而是使用 index.php?option=com_content&view=article&id=7 之类的东西......在这种情况下,我们可以看到会发生什么,我们转到 com_content、文章 MVC 和模型将使用 7 的 id 进行查询,并在文章 views/article/tmpl/default.php 文件中找到的内容生成 html。如果我明白你在问什么。所以这一切都很明显,从发布的 url 获取数据,运行查询,返回 html。 那么,正如您正确地问的那样,当我们没有那个时怎么办?这是关于 Joomla 和许多其他系统的最困难、最复杂和争论最多的问题之一。这是因为当您拥有物理文件时,它们具有清晰的名称,并且它们被清晰地组织到分层文件夹中。因此,当您构建静态页面时,您可以通过为文件命名然后将其放入命名文件夹来完全控制文件的 url。 您可以通过不同的方式在系统中处理此问题。例如,如果您有有限数量的页面/url,您可以创建一个查找表或将缓存列表存储在文件中。 或者,您可以执行当前 cms 所做的事情,即设置一个规则,用于确定该 url 实际要求的内容。 因此,例如,您会看到我告诉您创建一个别名为“topic”的菜单项。这是因为 Joomla 做的第一件事是检查具有与 url 完全匹配的别名的菜单项。菜单项表包含匹配的完整动态 url。使用这种 url 模式,如果它没有找到别名,它会给你一个 404。之后,当没有菜单项时,找到匹配的有效 url 变得更加复杂,但最终它只是一个分层集的检查规则。

因此,基本答案是,您可以进行简单或复杂的查找,以便获得让 mvc 工作所需的数据。 无论如何,这并不简单,它是使用具有解决此问题的记录的解决方案的一个很好的论据。

【讨论】:

  • 答案非常清晰,加分!但我想我没有清楚地描述我的想法。我想做类似 joomla 的事情,而不使用 joomla。是的,我知道我将有一个充满 php 代码的模板,例如 &lt;body&gt;&lt;p&gt;&lt;?php echo $content?&gt;&lt;/p&gt;&lt;/body&gt; 或类似的东西,但我很难理解 example.com/topic.html 被 php(或其他东西)解码的那一刻并用作 POST(是吗?)对 MySQLi 进行查询并提取我需要的值。它发生在哪里?如何?我一直认为链接它的目录存在文档,但它不是
【解决方案3】:

Joomla 是一个内容管理系统,因此为了能够管理内容,它被存储在一个数据库中,而不是拥有单独的 html 文件。一切,无论是内容、菜单项、扩展名等都存储在数据库表中。使用 Joomla,您有 1 个主 index.php 文件,应用程序以及所有内容都被推送到该文件。 Joomla 使用 MVC(模型-视图-控制器)。以下是它们的简要概述 (source)

  • 模型,它表示软件应用程序中数据的底层逻辑结构以及与之关联的高级类。此对象模型不包含有关用户界面的任何信息。
  • 一个 View ,它是代表元素的类的集合 在用户界面中(用户可以看到和响应的所有内容 到屏幕上,例如按钮、显示框等)
  • 一个Controller,代表连接模型和视图的类,用于模型和视图中的类之间进行通信。

您看到的 URL,例如 http://example.com/about.html,是 SEF(搜索引擎友好)并通过 Joomla 核心生成。文章的标准 URL 可能看起来像这样:

http://www.example.com/index.php?option=com_content&view=article&id=1

如需更深入了解 Joomla 是什么,请阅读以下内容:

http://www.joomla.org/about-joomla.html

希望对你有帮助

【讨论】:

  • * 一切 - 除了图像和其他媒体;存储在文件系统中。
【解决方案4】:

大多数非平面文件 CMS 系统都使用某种 MVC 系统,或者至少是模板系统。

例如,Wordpress 也没有针对每个帖子或页面的特定页面,而是将内容保存在数据库中,这样用户可以更轻松地进行管理,并且主题可以轻松访问和更改数据以适应“视图”(或 WP 的模板)。

大多数 CMS 平台出于各种原因这样做,所有这些都与

  • 易于管理。 CMS 平台提供了无需访问文件系统和更改实际文件即可轻松编辑内容的工具。
  • 在启用 UI 更改中易于集成。
  • 能够导出系统并适应新环境。上传数据库导出文件比上传数百个文件和文件夹要容易得多,希望能做对。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 2010-12-24
    • 1970-01-01
    • 2014-09-22
    • 2015-12-22
    • 2014-02-12
    • 2020-04-22
    • 2016-01-30
    相关资源
    最近更新 更多