SilverStripe 3-扩展注释表单

SilverStripe 3-扩展注释表单,silverstripe,Silverstripe,我想扩展AddCommentForm,以便可以输出带有自定义类的字段标签。我想删除“左”类从标签,因为它与基础冲突,但理想的是,我想完全控制输出HTML。 我试图在mysite/code中扩展CommentingController,但没有成功 我可以设置它使每个字段类型都有自己的.ss模板吗 如何做到这一点?在SilverStripe中,您只需在您的mysite或主题文件夹中创建一个同名文件,即可覆盖模板 因此,假设您有一个类SomeForm的表单,您需要做的就是创建一个名为SomeForm.

我想扩展AddCommentForm,以便可以输出带有自定义类的字段标签。我想删除“左”类从标签,因为它与基础冲突,但理想的是,我想完全控制输出HTML。 我试图在mysite/code中扩展CommentingController,但没有成功

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


如何做到这一点?

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

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

但是,css类“left”没有添加到
Form.ss
中,在该模板中只有表单html,字段添加在循环中。
(此外,comment模块没有为表单使用类,因此在这里无论如何也不起作用。)

每个字段都有自己的模板(实际上是两个模板)
MyField.ss
MyField\u holder.ss

如果两个模板中的一个不存在,它将返回默认文件
FormField.ss
FormField\u holder.ss

以类
TextField
为例,它将使用:

  • FormField\u holder.ss
    因为没有
    TextField\u holder.ss
  • TextField.ss
您查找的
位于
表单字段\u holder.ss中

当然,您可以创建一个
FormField\u holder.ss
并复制,但这也会影响CMS。所以你需要一些方法来只影响前端

不幸的是,对于这个问题,我并没有一个好的、干净的解决方案。 通常我会建议对表单进行子分类,并覆盖循环中字段的模板。
但我认为您在这里使用的是这个模块:它没有为该表单使用类,所以我们必须使用一个变通方法并将其挂接到该控制器中


文件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');
            }
        } 
    }
}
文件config.yml

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');
            }
        } 
    }
}
CommentingController:
  extensions:
    - 'MyCommentControllerExntesion'
<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>
文件MyFrontEndField\u holder.ss

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');
            }
        } 
    }
}
CommentingController:
  extensions:
    - 'MyCommentControllerExntesion'
<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>

$Title
$Field
$RightTitle
$Message
$Description

@Zauberfish-Man,这真是帮了大忙——正是我要找的!SilverStripe 3是一个很棒的系统,但缺少高级教程。我并不害怕用PHP弄脏我的手,但我很少知道我的子类放在哪里。非常感谢!NP是的,silverstripe有个众所周知的问题,没有足够好的医生。尽管SilverStripe社区可能很小,但你可以在这里或IRC上继续提问,但你得到的帮助通常都很好?难道它不应该扩大紧张吗?和.ss文件转到mytemplate/templates或mytemplate/templates/Includes?我都做了,但没有效果……是的。php文件进入
mysite/code
;2) 我想没关系;3) 将文件放入
mysite/templates
themes/myteme/templates
;4) 不要忘记使用
/?flush=all
访问您的站点以刷新缓存。模板和扩展都被缓存