3

我将 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 
{


}
4

4 回答 4

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();
}

编辑:只需选择当前选择的相同项目即可清除 TreeDropdownField。

于 2013-10-17T13:56:13.683 回答
2

恐怕这对于 TreeDropdownField 是不可能的。

您可以做一些小技巧,例如创建一个名为“None”的虚拟页面(具有特定的页面类型,例如 NoPage),用户可以选择该页面,然后您将实现 onBeforeWrite 方法来检查此页面类型,然后设置“如果所选页面是该页面类型,则 InternalLinkID" 字段为 0。虽然不是那么优雅。

另一种选择是使用 DropdownField 代替。这为您提供了一个简单的选择框。在拥有站点树视图方面不太好,但您可以设置“空”值。

第三种选择可能是改用 TreeMultiselectField。此字段允许多选(与 TreeDropdownField 相同,但使用复选框)。至少这样你可以取消选择所有项目。如果您的 CMS 用户选择了多个项目,唯一的问题是使用哪个页面。

编辑:在 SilverStripe 3 中,可以通过选择当前选定的项目来清除/删除 TreeDropdownField 选择。

于 2012-01-31T11:18:44.687 回答
2

只需重新选择当前选定的项目即可清除 TreeDropdownField。

于 2015-01-09T17:02:41.923 回答
1

我创建了一个简单的模块,它扩展了 TreeDropdownField 以允许清除 TreeDropdownField 中的选择。它在 github 上可用:https ://github.com/richardsjoqvist/silverstripe-optionaltreedropdownfield

于 2013-04-16T10:54:32.537 回答