我使用TreeDropdownField作为SiteTree下拉列表,虽然这是一个可选字段,并希望能够清除/删除此值。我如何使用Silverstripe做到这一点?
<?php
class StaticSidebar extends Page {
static $db = array(
'ExternalLink' => 'Text',
'ExternalText' => 'Varchar',
'ImageLink' => 'Text'
);
static $has_one= array(
"Image" => "Image",
"InternalLink" => "SiteTree"
);
static $allowed_children = array("none");
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldToTab("Root.Content.Main", new TextField("ExternalText", "External Text"), "Content");
$fields->addFieldToTab("Root.Content.Main", new TextField("ExternalLink", "External Link"), "Content");
$fields->addFieldToTab("Root.Content.Main", new TreeDropdownField("InternalLinkID", "Internal Link", "SiteTree"), "Content");
$fields->addFieldToTab("Root.Content.Main", new ImageField("Image"), "Content");
$fields->addFieldToTab("Root.Content.Main", new TextField("ImageLink", "Image Link"), "Content");
return $fields;
}
}
class StaticSidebar_Controller extends Page_Controller
{
}
答案 0 :(得分:5)
$fields->addFieldToTab('Root.TreeDropdown', new TreeDropdownField('PageID','Link','SiteTree'));
$fields->addFieldToTab('Root.TreeDropdown', new CheckboxField('UnselectTreeDropdown','remove Link'));
对我来说,简单易用的解决方案是创建一个CB字段并在检查CB时清除treedropdown
function onBeforeWrite(){
if($this->UnselectTreeDropdown)
$this->PageID= 0;
parent::onBeforeWrite();
}
答案 1 :(得分:2)
我担心TreeDropdownField无法做到这一点。
你可以做一些有点hacky的事情,例如创建一个名为“None”的虚拟页面(具有特定的页面类型,例如NoPage),用户可以选择,然后你实现onBeforeWrite方法来检查这个页面类型然后如果选择的页面是该页面类型,则将“InternalLinkID”字段设置为0。虽然不是那么优雅。
另一种选择是使用DropdownField。这为您提供了一个简单的选择框。在拥有站点树视图方面不太好,但您可以设置“空”值。
第三个选项可能是使用TreeMultiselectField。此字段允许多个选择(与TreeDropdownField相同,但使用复选框)。至少这样你可以取消选择所有项目。唯一的问题是,如果您的CMS用户选择了多个项目,请使用哪个页面。
编辑:在SilverStripe 3中,可以通过选择当前选定的项目来清除/删除TreeDropdownField选项。
答案 2 :(得分:2)
只需重新选择当前选定的项目即可清除TreeDropdownField。
答案 3 :(得分:1)
我创建了一个简单的模块,它扩展了TreeDropdownField以允许清除TreeDropdownField中的选择。它可以在github上找到:https://github.com/richardsjoqvist/silverstripe-optionaltreedropdownfield