Bolt CMS:为 "grouping" 分类下的页面添加路由

Bolt CMS: Adding routes for pages under "grouping" taxonomy

我对使用 Bolt 开发的网站内容的心智模型是 "sub pages":

在文档中我找到了关于 Taxonomies 的部分,在我看来 "grouping" 分类法就是我想要的。

所以我在 taxonomy.yml 中添加了以下内容:

pagegroups:
    slug: pagegroups
    singular_slug: pagegroup
    behaves_like: grouping
    options: { main, work, others }

通过在 contenttype.yml 中正确添加,我可以将页面分配给 "sub page" aka 页面组。 (为了能够获得页面组的附加信息,我还有一个 "pagegroup" 内容类型,其中 slug 对 taxonomy.yml 中的条目进行数学运算。)

为了允许像 /others/stefan/work/currently 这样的路由,我在 routing.yml 中添加了以下内容:

work_page_binding:
    path: '/work/{slug}'
    defaults: { _controller: 'Bolt\Controllers\Frontend::record', 'contenttypeslug': 'page' }
    contenttype: pages

others_page_binding:
    path: '/others/{slug}'
    defaults: { _controller: 'Bolt\Controllers\Frontend::record', 'contenttypeslug': 'page' }
    contenttype: pages

但要使其与模板和菜单一起使用,页面组中的所有页面都必须使用正确的模板,这样才能显示正确的菜单。

我想一定有更动态的路由方式:

pagegroups_page_binding:
    path: '/{pagegroup}/{slug}'
    defaults: { [???] }
    contenttype: pages
    restrictions:
        pagegroup: [???]

具有以下优点:

有人可以建议如何开始使用它吗?
如果那是最好的方法,我很乐意编写自定义控制器。如果是,我应该把它放在哪里?

我可以想象这个用例并不少见,将其放入扩展中会很棒,但我不确定如何开始使用它,以及额外的抽象级别是否会妨碍我如何解决实际问题。

还有一件重要的事情是:我希望能够更新螺栓,所以我不想修改现有的 类...

感觉好像问了不止一个问题,有什么想法就随便回答吧。

目前这比应该做的更棘手,好消息是,由于对控制器进行了重大重构,下一版本的 Bolt 将更加灵活且易于扩展。

要使其立即运行,您可以创建一个静态方法,该方法 return 是内容组的竖线分隔字符串,这是一个简单的示例:

routing.yml第一名:

contentgrouppage:
    path: '/{contentgroup}/{slug}'
    defaults:
        _controller: 'controller.frontend:record'
        contenttypeslug: page
        contentgroup: '<put your default value here>'
    requirements:
        contentgroup: 'My\Routing::getTaxonomyGroups'
    contenttype: page

如您所见,我们向 class My\Routing 和方法 getTaxonomyGroups 请求 return 允许值列表,此方法如下所示:

    use Bolt\Configuration\ResourceManager;

    /**
    * 
    */
    class Routing
    {

        public function getTaxonomyGroups()
        {
            $app = ResourceManager::getApp();
            $groups = $app['config']->get('taxonomy/categories');

            $urls = [];
            foreach ($groups['options'] as $slug => $name) {
                $urls[] = $slug;
            }


            return implode('|',$urls);
        }
    }

如您所见,获取当前应用程序对象的静态 hack 并不理想,下一个版本将被弃用,但问题是这些路由要求目前必须是静态方法,而下一个版本你'将能够指定服务,例如:controller.requirements