网页生成(CMS喜欢)

时间:2014-01-20 19:41:34

标签: php mysql joomla

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

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

由于缺乏本主题的知识,我无法提出简短的问题,这就是为什么谷歌搜索对我没有多大帮助,所以有人可以告诉我应该在哪里看看会很棒或者从一些简单的例子开始。

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

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

4 个答案:

答案 0 :(得分:2)

我给了你一个upvote:

  

所有你有无限的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 feed等。

关于SEO

SEO抓取工具只能看到该网页的来源。此时,与静态页面和CMS生成的页面没有区别。

网址

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

元标记

虽然<meta>标签现在不像过去那么重要,但它们仍然有用。如果您在管理面板中设置了CMS,则CMS应根据默认设置自动为您生成这些设置,并为每个页面添加可选覆盖。你可以说这可以确保每一页都有元数据,并且不会遗忘。

答案 1 :(得分:2)

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

Joomla就像大多数现代(又名&#34; web 2.0&#34;)Web应用程序将表示与内容分开。
当然,这简化了......但是......

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

Joomla是一种软件,它响应页面请求将您的内容和演示文稿汇集在一起​​并将其返回,最常见的是将HTML发送到浏览器。 Joomla可以帮助您管理复杂和动态的页面构建,减少或消除手工构建页面的需要,但仍然可以让您按照自己的意愿进行尽可能多的手工构建。

PHP作为一种语言是在考虑到这一想法的情况下创建的。

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

一旦到达<body>,Joomla开始提取数据和html布局。它会对数据库的不同部分进行查询,以便查看文章文本,菜单链接列表,了解最常用的标签等等,基本上是您在页面中想要的任何数据。

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

获取布局
  • /组件/ com_content /视图/条/ TMPL
  • /模块/ mod_menu / TMPL
  • /模块/ 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中您期望的<ul></ul>,<li></li><span></span><a></a>,但我们发现我们正在使用PHP来自动获取标题文字($ item- &gt; title)或标签使用的次数($ item-&gt; count)或url echo JRoute :: _(TagsHelperRoute :: getTagRoute($ item-&gt; tag_id。&#39; - &# 39;。$ item-&gt;别名));这是Joomla管理路由和生成SEF URL的地方。 这就是为什么我们使用CMS,以便能够自动完成所有这些任务,因此我们可以通过几个文件管理数千个页面。

现在,上面有例外和变体。例如,您可以从文件或Web服务获取数据,您可以返回json而不是html,依此类推,但这是基本原则。将内容与内容分开,让设计师控制演示,但要使其不必担心内容,使内容创建者不必担心设计,使其如此开发人员也不必担心这两种情况,使其变得简单,以至于戴着这三顶帽子的网站管理员仍然可以解决这个问题。

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


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

所以基本的答案是,你做一个简单或复杂的查找,这样你就可以获得让mvc完成工作所需的数据。 它在任何方面都不简单,并且它是使用具有跟踪记录的解决方案来解决此问题的良好理由之一。

答案 2 :(得分:1)

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

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

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

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

有关Joomla是什么的更深入的信息,请阅读:

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

希望这有帮助

答案 3 :(得分:1)

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

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

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

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