【问题标题】:Bolt CMS: Adding routes for pages under "grouping" taxonomyBolt CMS:为“分组”分类下的页面添加路由
【发布时间】:2015-07-13 08:45:53
【问题描述】:

我正在使用 Bolt 开发的网站内容的心理模型是,有“子页面”:

  • 每个页面(内容类型)都与一个“子页面”相关
  • 每个“子页面”都有自己的菜单,可以使用自己的模板
  • 页面的 url 应该类似于 /{sub_page_slug}/{page_slug}

在文档中,我找到了关于 Taxonomies 的部分,这听起来像是我想要的“分组”分类法。

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

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

在contenttype.yml 中添加正确的内容后,我可以将页面分配给“子页面”,即页面组。 (为了能够获得页组的其他信息,我还有一个“页组”内容类型,其中 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: [???]

具有以下优点:

  • 它会检查已配置页面组的列表,所以唯一要添加的是taxonomy.yml 中的条目,而不是为每个页面组添加新路由(当然,仍然要配置页面组内容元素条目和菜单必须发生)
  • 在模板中设置了正确的页面组内容元素,因此我可以简单地编写menu(pagegroup.slug),而不是为每个页面组复制模板

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

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

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

感觉就像问了一个以上的问题,随意回答你有想法的任何部分。

【问题讨论】:

    标签: url-routing silex bolt-cms


    【解决方案1】:

    目前这比它应该做的更棘手,好消息是,由于控制器的大规模重构,下一个版本的 Bolt 将更加灵活和易于扩展。

    要让它现在工作,您可以创建一个静态方法,返回内容组的管道分隔字符串,这是一个简单的示例:

    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
    

    如您所见,我们要求类 My\Routing 和方法 getTaxonomyGroups 返回允许值的列表,该方法如下所示:

        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

    【讨论】:

    • 如果这个问题能在这个“下一个版本”发生时得到更新,那就太好了;)
    • 你建议把这个类放在bolt的文件结构中的什么地方?
    猜你喜欢
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多