无法使用我的自定义模板来使用我的自定义子类

时间:2014-04-17 19:54:31

标签: templates silverstripe

我正在开发DropdownField的子类,我正在尝试将它与相应的DrodownFieldData.ss模板耦合而没有成功。

  • 我反复刷新缓存。
  • 我删除了localhost(XAMPP)上的缓存文件夹
  • 我将模板移动到我的“简单”主题的各个位置:/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);

    }
}

3 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

  • 重命名模板DropdownFieldData_holder.ss
  • 将DropdownFieldData_holder.ss移至mysite / templates / DropdownFieldData_holder.ss
  • 在您的字段上使用setFieldHolderTemplate方法,即$ this-&gt; setFieldHolderTemplate(&#39; DropdownFieldData_holder&#39;);

您还会发现这些字段是使用两个模板呈现的,其中一个模板以&#39; _holder&#39;为后缀,它充当包装器,而另一个模板呈现字段本身,所以根据您想要自定义字段的方式,您可能需要创建两者。

查看FormField类以更好地理解字段的呈现方式,因为它们使用的机制与页面类型略有不同

答案 1 :(得分:0)

我有一个类似的问题,这是计时的结果(后来加载的模板取代了我自己的自定义,但只有在使用默认表单模板时)。修复程序确保子类表单字段具有自己的FormField Holder方法版本。 EG:

public function FieldHolder($properties = array()) {
    $obj = $properties ? $this->customise($properties) : $this;
    return $obj->renderWith($this->getTemplates());
}

模板应位于templates / forms / CustomField.ss中。如果它位于您的主题文件夹,mysite或模块文件夹中,我认为这不重要。

答案 2 :(得分:0)

关键是要将模板保留在[yourmodule]/templates中,而不是放在任何主题的位置。