无法让我的自定义模板与我的自定义子类一起使用

问题描述 投票:0回答:3

我正在开发 DropdownField 的子类,并尝试将其与相应的 DrodownFieldData.ss 模板结合使用,但没有成功。

  • 我反复刷新缓存。
  • 我删除了本地主机(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);

    }
}
php templates silverstripe
3个回答
0
投票

我遇到了类似的问题,这是计时的结果(后来加载了一个模板,替换了我自己的自定义,但仅在使用默认表单模板时)。修复方法是确保子类化的表单字段具有自己的 FormField Holder 方法版本。例如:

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

模板应位于 templates/forms/CustomField.ss 中。我认为这是否在您的主题文件夹、我的网站或模块文件夹中并不重要。


0
投票

您可以尝试以下方法:

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

您还会发现这些字段是使用两个模板呈现的,其中一个以“_holder”为后缀,充当包装器,而另一个则呈现字段本身,因此取决于您想要如何自定义字段,您可能必须同时创建两者。

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


0
投票

关键是将模板保留在

[yourmodule]/templates
中,而不是任何主题的位置。

© www.soinside.com 2019 - 2024. All rights reserved.