我们正在寻找使用Silverstripe CMS并希望能够拥有可以重新排序的模块。
我们来自Wordpress设置,主要使用灵活的内容ACF字段。模块(例如文本,标头或视频)需要能够重新排序。
我们使用我们的CMS作为API,因此这些模块作为一个部分输出到页面或帖子:
[
{
"id": 10,
"title": "Post title",
"slug": "post_slug",
"path": "/post_slug",
"template": "campaign",
"published": "2017-05-25 06:09:36",
"image": null,
"seo": {
"title": "",
"description": "",
"image": {
},
},
"sections": [
{
"type": "masthead",
"Title": "",
"video": false,
"image": [
],
"showCta": false,
"cta": [
]
},
{
"type": "video_text",
"video_text": [
{
"type": "video",
"video_url": "https://www.youtube.com/watch?v=asdfa",
"video_length": "07:38",
"video_preview": false
},
{
"type": "text",
"title": "Video Title",
"content": "Video text content",
"call_to_action": false,
"cta": [
]
}
]
},
{
"type": "text",
"title": "Text Title",
"content": "",
"alignment": "centre",
"call_to_action": false,
"cta": {
"text": "CTA button",
"link_type": "internal_link",
"internal_link": "about",
"external_link": "",
"section_id": [
]
}
},
]
}
]
Silverstripe是否拥有处理模块的方式/我是否需要放弃这种灵活的内容模块方法?其他人如何处理Silverstripe中的灵活内容模块?
答案 0 :(得分:1)
silverstripe-blocks和silverstripe-elemental在他们自己的方面都很有效,但我不认为他们会实现你想要的。这些模块并不能真正让您使用预定义的模板。你可以挂钩模板,但代码将是巨大的。我还不确定是否还有一个开源模块。
从您的JSON代码中,为了让这些部分在下面呈现如下内容,
<section id="Sections">
<div id="video_text" class="section">
<iframe width="560" height="315" src="https://www.youtube.com/watch?v=asdfa" frameborder="0" allowfullscreen></iframe>
</section>
<div id="text" class="section">
<h2>Text Title</h2>
<a class='text-center btn btn-default' href="/about/">CTA button</a>
</section>
</sections>
您可能想要这样做。 为您使用DataObjects(DO)部分,便于重新排序。 创建一个抽象的DO,BlockSection,其中包含Title(Varchar),Content(HTMLText),Sort(Int)等字段,最重要的是has_one到Page。
对于视频使用,可以命名DO VideoBlockSection并扩展BlockSection, 另一个TextBlockSection。不要忘记每个DO的$ singular_name(对于网格中很好的类命名很有用)
在页面上getCMSFields添加网格来管理章节。您需要添加GridFieldSortableRows和GridFieldAddNewMultiClass,现在您可以在每个页面上添加Section。
从Page到SetSection添加has_many,以及一个渲染块并输出html的方法。
Page.php
private static $has_many = array(
"Sections" => "BlockSection",
);
function SectionContent()
$aContent = ArrayList::create();
$oSections = $this->Sections();
if (count($oSections )) {
foreach ( $oSections as $oSection ) {
$aContent->push(ArrayData::create([
"Section" => $oSection,
"Content" => $oSection->renderWith([$oSection->ClassName, get_parent_class($oSection)]),
]));
}
}
return $aContent;
对于VideoBlockSection,模板数组列表将是VideoBlockSection和BlockSection
VideoBlockSection.ss
<div id="video_text_{$ID}" class="section">
<iframe width="560" height="315" src="{$URL}" frameborder="0" allowfullscreen></iframe>
</section>
在特定情况下,由于您使用的是API,因此需要使用包装器来呈现模板。 它需要将[section] [type]与Template(renderWith)video_text匹配到VideoBlockSection
最后在Page.ss
<% loop $SectionContent %>
{$Content}
<% end_loop %>
这是一个概念证明,但它为我工作,因此不考虑重构,速度和内存使用(但它的工作)。 这样我就不得不抛弃不必要的所谓的#34;页面类型&#34;在大多数情况下,我发现它不可重复使用。
这对我来说100%有效,我和Bootstrap 3一起使用它。我用它来创建CTA,视差滚动,谷歌地图部分(一页上有多个地图),缩略图。指定图像大小调整方法(裁剪,按宽度,按高度)。
不要放弃灵活的内容模块方法。 我正在开发一个与SS4和Bootstrap 4一起使用的开源模块(可以使用任何其他html框架)