SilverStripe 3 - 扩展评论表

Ric*_*art 3 silverstripe

我想扩展AddCommentForm,以便我可以使用自定义类输出字段标签.我想从标签中删除'left'类,因为它与Foundation冲突,但理想情况下我希望完全控制输出的HTML.

我试图在mysite/code中扩展CommentingController,但没有运气......

我可以设置它,以便每个字段类型都有自己的.ss模板吗?

我该怎么做呢?

Zau*_*sch 5

在SilverStripe中,只需在您的mysite主题文件夹或主题文件夹中创建同名文件即可覆盖模板.

所以,假设您有一个类的表单,SomeForm您需要做的就是创建一个名为的文件SomeForm.ss,SilverStripe将使用它而不是默认值Form.ss.

但是,没有添加css类'left' Form.ss,在该模板中只有html形式,字段被添加到循环中.
(此外,注释模块不使用表单的类,因此无论如何这将不起作用.)

每个字段都有自己的模板(实际上是2个模板).MyField.ssMyField_holder.ss.
如果两个模板中的一个不存在,它将回退到默认文件FormField.ssFormField_holder.ss.

所以我们以类为例TextField,它将使用:

  • FormField_holder.ss 因为没有 TextField_holder.ss
  • TextField.ss

<label>你追求的是里面FormField_holder.ss.
您当然可以从原始文件创建FormField_holder.ss并复制内容,但这也会影响CMS.所以你需要一些方法来只影响前端.

不幸的是,我对这个问题并没有很好的解决方案.通常我会建议在循环中形成和覆盖Fields的模板的子类.
但我认为你在这里使用这个模块:https://github.com/silverstripe/silverstripe-comments/它没有使用该表格的类,所以我们必须使用一个解决方法并挂钩到该控制器.


文件MyCommentControllerExntesion:

class MyCommentControllerExntesion extends Extension {
    public function alterCommentForm($form) {
        foreach($form->Fields() as $field) {
            if (!$field->is_a('HiddenField') {
                // skip hidden fields
                $field->setFieldHolderTemplate('MyFrontEndField_holder');
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

文件config.yml:

CommentingController:
  extensions:
    - 'MyCommentControllerExntesion'
Run Code Online (Sandbox Code Playgroud)

文件MyFrontEndField_holder.ss:

<div id="$Name" class="field<% if $extraClass %> $extraClass<% end_if %>">
    <% if $Title %><label class="not-left" for="$ID">$Title</label><% end_if %>
    <div class="middleColumn">
        $Field
    </div>
    <% if $RightTitle %><label class="right" for="$ID">$RightTitle</label><% end_if %>
    <% if $Message %><span class="message $MessageType">$Message</span><% end_if %>
    <% if $Description %><span class="description">$Description</span><% end_if %>
</div>
Run Code Online (Sandbox Code Playgroud)