我如何提供静态 .phtml 子页面,参数在 db 中定义?
例如,我在数据库中有条目:
table 'static_subpages' {
id: 1
url: /author
route: module=about;controller=index;action=subpage
params: page=author.phtml
layout: true
}
这是一个简单的例子。当然,我可以在module.config.php中创建maaaany路由,但我想从数据库(在管理面板中)动态管理页面。非常重要的 SEO URL:像/about/subpage/author 这样的 URL 并不比/author 好。
任何想法我该怎么做?
您可以通过在路由配置中使用 URL 段来提供静态页面:
在您的module.config.php
:
'static' => array(
'type' => 'Zend'Mvc'Router'Http'Segment',
'options' => array(
'route' => 'about/:page_name',
'defaults' => array(
'controller' => 'About'Controller'Index',
'action' => 'subpage',
),
),
在您的About'Controller'IndexController
:
/**
* Render static pages
*
* @return 'Zend'View'Model'ViewModel
*/
public function staticAction()
{
$pageName = $this->params('page_name');
$view = new ViewModel();
// loads views like view/static/author.phtml
$view->setTemplate('static/' . $pageName);
return $view;
}
在您的视图中,您可以使用以下内容:
<a href="<?php echo $this->url('static', array('page_name' => 'author')); ?>">
Author
</a>
这将生成一个类似 URL 的 URL:/about/author/
除了mihaidoru的答案之外,您不一定需要使用"/",您可以将参数与任何分隔符映射。我这里有一个小例子,我生成了一些没有"/"的友好网址:
'randomroute' => array(
'type' => 'segment',
'options' => array(
'route' => '/[:param].:id:.html',
'constraints' => array(
'id' => '[0-9]+',
'param' => '[a-zA-Z-0-9-_'/%]+',
),
'defaults' => array(
'controller' => 'Your'Name'Space',
'action' => 'index',
),
),
),
在我的示例中,任何以 .html 结尾的 url 和 Id 约束都将映射到此处。
your.url.application/test123.01.html or your.url.application/foobar.02.html etc.
在这种情况下,[:param]
是可选的,由"[:]"指示。
这可能不完全是您要查找的内容,因为您可能需要为每个路由执行此操作,除非您为此 url 提供一个操作参数,这在某种程度上会导致额外的代码行。我会去为每条路由创建它,因为我觉得路由配置运行良好,一开始应该不会那么麻烦。
我找到了解决方案。感谢您的上述回复,但仅此而已。
首先,我创建了具有标准控制器和index
操作的新模块"子页面"。
接下来,为此设置路由器:
'router' => array(
'routes' => array(
'subpage' => array(
'type' => 'segment',
'options' => array(
'route' => '/[:page[.html]]',
'constraints' => array(
'page' => '[a-zA-Z0-9]*',
),
'defaults' => array(
'controller' => 'Subpage'Controller'Subpage',
'action' => 'index',
),
),
),
),
),
但是当我在 application.config.php 中添加模块时,真正的模块及其路由不可用。解决方案非常简单,但花了我几个小时的实验 - 将子页面模块移动到第一个:)
在application.config.php
:
'modules' => array(
'Subpage',
'Application',
'Gallery',
),
现在,路由器跟踪是:
- 匹配现有控制器和路由器的 URL,从阵列末尾开始
- 如果未找到,请尝试使用控制器路由
Subpage
; 此模块中的IndexAction
检查数据库,并在找到时提供静态页面 - 当网址不匹配时:
- 在
Subpage -> IndexController -> IndexAction()
时:重定向至ErrorController
- 或者,如果 URL 与子页面模块中的任何模块和路由器不匹配,请运行
ErrorController
- 在
这对于有 ZF2 经验的人来说很简单,但对我来说却不行。我没有找到这样的东西。