我正在开发 DropdownField 的子类,并尝试将其与相应的 DrodownFieldData.ss 模板结合使用,但没有成功。
/simple/templates
、/simple/templates/forms
、/simple/templates/Includes
我这样称呼它:
return $this->customise($properties)->renderWith('DropdownFieldData');
您还有其他想法可以让我尝试吗?
这是代码。它基本上是 DropdownField 的副本,精简到 Field 方法。
<?php
class DropdownFieldData extends DropdownField {
public function Field($properties = array()) {
$source = $this->getSource();
$options = array();
if($source) {
// SQLMap needs this to add an empty value to the options
if(is_object($source) && $this->emptyString) {
$options[] = new ArrayData(array(
'Value' => '',
'Title' => $this->emptyString,
));
}
foreach($source as $value => $title) {
$selected = false;
if($value === '' && ($this->value === '' || $this->value === null)) {
$selected = true;
} else {
// check against value, fallback to a type check comparison when !value
if($value) {
$selected = ($value == $this->value);
} else {
$selected = ($value === $this->value) || (((string) $value) === ((string) $this->value));
}
$this->isSelected = $selected;
}
$disabled = false;
if(in_array($value, $this->disabledItems) && $title != $this->emptyString ){
$disabled = 'disabled';
}
$options[] = new ArrayData(array(
'Title' => $title,
'Value' => $value,
'Selected' => $selected,
'Disabled' => $disabled,
));
}
}
$properties = array_merge($properties, array('Options' => new ArrayList($options)));
return $this->customise($properties)->renderWith('DropdownFieldData');
// return parent::Field($properties);
}
}
我遇到了类似的问题,这是计时的结果(后来加载了一个模板,替换了我自己的自定义,但仅在使用默认表单模板时)。修复方法是确保子类化的表单字段具有自己的 FormField Holder 方法版本。例如:
public function FieldHolder($properties = array()) {
$obj = $properties ? $this->customise($properties) : $this;
return $obj->renderWith($this->getTemplates());
}
模板应位于 templates/forms/CustomField.ss 中。我认为这是否在您的主题文件夹、我的网站或模块文件夹中并不重要。
您可以尝试以下方法:
您还会发现这些字段是使用两个模板呈现的,其中一个以“_holder”为后缀,充当包装器,而另一个则呈现字段本身,因此取决于您想要如何自定义字段,您可能必须同时创建两者。
查看 FormField 类,以更好地了解字段的呈现方式,因为它们使用与页面类型略有不同的机制
关键是将模板保留在
[yourmodule]/templates
中,而不是任何主题的位置。