我使用博尔特开发的网站内容的心智模型是,有"子页面":
在文档中,我找到了关于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
中的条目,而不是每个页面组的新路由(当然,配置页面组内容元素条目和菜单它仍然必须发生)menu(pagegroup.slug)
而不是为每个页面组重复模板有人可以建议如何开始吗? 如果这是最好的方法,我很乐意写一个自定义控制器。如果是的话,我应该把它放在哪里?
我可以想象这个用例并不罕见,把它放到扩展中会很棒,但是我不知道如何开始使用它,如果额外的抽象级别是妨碍我如何解决实际问题。
还有一件重要的事情是:我希望能够更新bolt,所以我不想修改现有的类......
感觉就像问了一个以上的问题,随时回答你有想法的任何部分。
答案 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