Bolt CMS:为 "grouping" 分类下的页面添加路由
Bolt CMS: Adding routes for pages under "grouping" taxonomy
我对使用 Bolt 开发的网站内容的心智模型是 "sub pages":
- 每个页面(内容类型)都与一个相关"sub page"
- 每个 "sub page" 都有自己的菜单,可以使用自己的模板
- 页面的 url 应该看起来像 /{sub_page_slug}/{page_slug}
在文档中我找到了关于 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: [???]
具有以下优点:
- 它会检查已配置页面组的列表,所以唯一要添加的是
taxonomy.yml
中的条目,而不是为每个页面组添加新路由(当然配置页面组内容元素条目和它的菜单仍然必须发生)
- 在模板中设置了正确的页面组内容元素,因此我可以简单地编写
menu(pagegroup.slug)
而不是为每个页面组复制模板
有人可以建议如何开始使用它吗?
如果那是最好的方法,我很乐意编写自定义控制器。如果是,我应该把它放在哪里?
我可以想象这个用例并不少见,将其放入扩展中会很棒,但我不确定如何开始使用它,以及额外的抽象级别是否会妨碍我如何解决实际问题。
还有一件重要的事情是:我希望能够更新螺栓,所以我不想修改现有的 类...
感觉好像问了不止一个问题,有什么想法就随便回答吧。
目前这比应该做的更棘手,好消息是,由于对控制器进行了重大重构,下一版本的 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
我对使用 Bolt 开发的网站内容的心智模型是 "sub pages":
- 每个页面(内容类型)都与一个相关"sub page"
- 每个 "sub page" 都有自己的菜单,可以使用自己的模板
- 页面的 url 应该看起来像 /{sub_page_slug}/{page_slug}
在文档中我找到了关于 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: [???]
具有以下优点:
- 它会检查已配置页面组的列表,所以唯一要添加的是
taxonomy.yml
中的条目,而不是为每个页面组添加新路由(当然配置页面组内容元素条目和它的菜单仍然必须发生) - 在模板中设置了正确的页面组内容元素,因此我可以简单地编写
menu(pagegroup.slug)
而不是为每个页面组复制模板
有人可以建议如何开始使用它吗?
如果那是最好的方法,我很乐意编写自定义控制器。如果是,我应该把它放在哪里?
我可以想象这个用例并不少见,将其放入扩展中会很棒,但我不确定如何开始使用它,以及额外的抽象级别是否会妨碍我如何解决实际问题。
还有一件重要的事情是:我希望能够更新螺栓,所以我不想修改现有的 类...
感觉好像问了不止一个问题,有什么想法就随便回答吧。
目前这比应该做的更棘手,好消息是,由于对控制器进行了重大重构,下一版本的 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