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

时间:2015-07-13 08:45:54

标签: url-routing silex bolt-cms

我使用博尔特开发的网站内容的心智模型是,有"子页面":

  • 每个页面(内容类型)与一个"子页面"
  • 相关
  • 每个"子页面"有自己的菜单,可以使用自己的模板
  • 页面的网址应如/ {sub_page_slug} / {page_slug}

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

所以我将以下内容添加到taxonomy.yml

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

通过contenttype.yml中的正确添加,我可以将页面分配到"子页面"又名页组。 (为了能够获得页面组的其他信息,我还有一个" 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: [???]

具有以下优点:

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

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

我可以想象这个用例并不罕见,把它放到扩展中会很棒,但是我不知道如何开始使用它,如果额外的抽象级别是妨碍我如何解决实际问题。

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

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

1 个答案:

答案 0 :(得分: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);
        }
    }

正如你所看到的,获取当前app对象的静态hack并不理想,并且将在下一版本中弃用,但是这些路由需求当前必须是静态方法的问题,而下一个版本你将会能够指定服务,例如:controller.requirements