1

如何提供静态 .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 好。

任何想法我该怎么做?

4

3 回答 3

1

您可以通过在路由配置中使用 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,如:/about/author/

于 2013-09-13T07:16:56.930 回答
0

我找到了解决方案。谢谢楼上的回复,不过不是这样。

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. 当 URL 不匹配时:
    • 何时进入Subpage -> IndexController -> IndexAction():重定向到ErrorController
    • 或者如果 URL 不匹配任何模块子页面模块中的路由器,运行ErrorController

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

于 2013-09-27T14:30:16.023 回答
0

除了 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 提供一个动作参数,这在某种程度上会导致额外的代码行。我会去为每条路由创建它,因为我觉得路由配置工作得很好,一开始不应该那么麻烦。

于 2013-09-13T07:44:14.880 回答