带有 SEO URL 的静态子页面


Static subpages with SEO URLs

我如何提供静态 .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',
),

现在,路由器跟踪是:

  1. 匹配现有控制器和路由器的 URL,从阵列末尾开始
  2. 如果未找到,请尝试使用控制器路由Subpage; 此模块中的IndexAction检查数据库,并在找到时提供静态页面
  3. 当网址不匹配时:
    • Subpage -> IndexController -> IndexAction()时:重定向至ErrorController
    • 或者,如果 URL 与子页面模块中的任何模块路由器不匹配,请运行ErrorController

这对于有 ZF2 经验的人来说很简单,但对我来说却不行。我没有找到这样的东西。