Silverstripe中的灵活内容模块

时间:2017-06-22 23:12:08

标签: content-management-system silverstripe

我们正在寻找使用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中的灵活内容模块?

1 个答案:

答案 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框架)