【发布时间】:2014-03-15 23:24:08
【问题描述】:
我想扩展 AddCommentForm 以便可以输出带有自定义类的字段标签。我想从标签中删除“左”类,因为它与 Foundation 冲突,但理想情况下我希望完全控制输出的 HTML。
我尝试在 mysite/code 中扩展 CommentingController 但没有运气...
我可以将其设置为每个字段类型都有自己的 .ss 模板吗?
我该怎么做?
【问题讨论】:
标签: silverstripe
我想扩展 AddCommentForm 以便可以输出带有自定义类的字段标签。我想从标签中删除“左”类,因为它与 Foundation 冲突,但理想情况下我希望完全控制输出的 HTML。
我尝试在 mysite/code 中扩展 CommentingController 但没有运气...
我可以将其设置为每个字段类型都有自己的 .ss 模板吗?
我该怎么做?
【问题讨论】:
标签: silverstripe
在 SilverStripe 中,您只需在 mysite 或主题文件夹中创建同名文件即可覆盖模板。
所以,假设你有一个 SomeForm 类的表单,你需要做的就是创建一个名为 SomeForm.ss 的文件,SilverStripe 将使用它而不是默认的 Form.ss。
但是,Form.ss 中没有添加 css 类“left”,在该模板中只有 html 表单,字段是循环添加的。
(另外,评论模块不使用表单的类,所以无论如何这里都行不通。)
每个字段都有自己的模板(实际上是 2 个模板)。 MyField.ss 和 MyField_holder.ss.
如果 2 个模板之一不存在,它将回退到默认文件 FormField.ss 和 FormField_holder.ss。
让我们以TextField 类为例,它将使用:
FormField_holder.ss 因为没有TextField_holder.ss TextField.ss 你寻找的<label>在FormField_holder.ss里面。
您当然可以只创建一个FormField_holder.ss 并复制Content from the original file,但这也会影响CMS。所以你需要一些方法来只影响前端。
不幸的是,对于这个问题,我真的没有很好的解决方案。
通常我会建议对该表单进行子分类并在循环中覆盖字段的模板。
但我认为您在这里使用了这个模块: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');
}
}
}
}
文件config.yml:
CommentingController:
extensions:
- 'MyCommentControllerExntesion'
文件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>
【讨论】:
mysite/code; 2)我认为没关系; 3) 将 ss 文件放入mysite/templates 或themes/mytheme/templates; 4) 不要忘记使用/?flush=all 访问您的站点以刷新缓存。模板和扩展都被缓存