我记得当我在制作静态页面多年后开始使用 CMSes 时,缺少 html 文件对我来说也很奇怪。 http://docs.joomla.org/Where_are_the_web_pages%3F
与大多数现代(又名“web 2.0”)网络应用程序一样,Joomla 将演示与内容分开。
这当然是在简化,但是...
内容存储在数据库中。
演示文稿由模板管理(Joomla 的默认模板或您替换的各个部分)。
Joomla 是一种响应页面请求的软件,它将您的内容和演示文稿汇集并返回,最常见的是作为 HTML 发送到浏览器。
Joomla 可帮助您管理复杂和动态的页面构建,减少或消除手动构建页面的需要,但仍允许您以不同的方式进行尽可能多的手动构建。
PHP 作为一门语言的创建就是考虑到这个想法。
当 Joomla 将网页放入浏览器时,它会做很多事情(再次简化)。
它从模板文件夹中加载模板的 index.php。这为页面提供了基本结构。如果您查看该文件,您会看到熟悉的<html><head></head><body></body></html> 标签,就像您在静态页面中看到的一样。您还将看到包含 css 和 javascript,但不是以普通的 HTML 方式,而是以一种经过修改使其更灵活的方式。元数据也是如此,Joomla 将以灵活的方式将来自不同位置(您的站点配置、特定文章等)的元数据放在一起,而不是您在文件中单独输入。
一旦到达<body>,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 中所期望的 <ul></ul>,<li></li><span></span> 和 <a></a>,但是我们看到我们正在使用 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 工作所需的数据。
无论如何,这并不简单,它是使用具有解决此问题的记录的解决方案的一个很好的论据。