ListboxField 的 SilverStripe 显示逻辑不起作用

问题描述

SilverStripe:v4
使用的模块:https://github.com/unclecheese/silverstripe-display-logic

你好,美好的一天!

我在安全页面(成员列表)中,并试图在某个字符串或值在另一个 ListBoxField 上找到时显示 ListBoxField。

Security Page

通过上图,我想在字段中选择或输入销售代表角色,一旦销售代表是出现在中,那是我将显示一个字段的时刻

这是我的代码片段

$codesList = Member::get()->column('Code');
$codes = ListBoxField::create(
    'AccountPurchases','Account Purchases',$codesList);
$fields->insertAfter('DirectGroups',$codes);

$codes->displayIf("DirectGroups")->contains("Sales Representative");

但问题是,无论我做什么(1: dev/build?flush=1,2: refresh the page,3: restart the app)所需的名为 $codes 的字段仍然不会出现.

After Placing Sales Representative

但是如果我将它应用到像 FirstName 这样的普通字段(它是一个简单的 TextField),它工作得非常好......

$codesList = Member::get()->column('Code');
$codes = ListBoxField::create(
    'AccountPurchases',$codes);

$codes->displayIf("FirstName")->contains("Sales Representative");

Fin

任何想法如何执行我想要的输出

解决方法

对于非标准表单字段,您需要使用显示逻辑包装器。 https://github.com/unclecheese/silverstripe-display-logic#dealing-with-non-standard-form-fields

“非标准”的定义有点难找,但根据我的经验,它是任何非普通 html-input 的东西。 Listbox 是一个花哨的前端东西,所以它是合格的。文档中的示例可能会令人困惑,但如果您使用的是 SS4 和最新的显示逻辑,则使用 Wrapper::create 而不是 DisplayLogicWrapper::create。如果你包装它,它应该可以工作。

$codesList = Member::get()->column('Code');
$codes = Wrapper::create(
    ListboxField::create('AccountPurchases','Account Purchases',$codesList);
)->displayIf("DirectGroups")->contains("Sales Representative")->end();

$fields->insertAfter('DirectGroups',$codes);