Sulu CMS - 来自资源单选底层价值的可见性条件
Sulu CMS - Visiblity condition from underlying value of resource single selection
我有三个实体 Provision
、Gatekeeper
和 Data
。
class Provision {
private Gatekeeper $keeper; // ManyToOne
private Collection $points; // ManyToMany
}
class Gatekeeper {
private int $id;
private string $name;
private bool $allowData;
}
class Data {
private int $value;
}
所有实体都实现了 REST-CRUD 逻辑。为了编辑 Provision
实体,我将配置添加到 sulu_admin.yaml
:
sulu_admin:
field_type_options:
selection:
data_selection:
default_type: 'list_overlay'
resource_key: 'data'
types:
list_overlay:
adapter: 'table'
list_key: 'data'
display_properties: ['value']
icon: 'su-plus'
label: 'app.data'
overlay_title: 'app.action.select.data'
single_selection:
single_gatekeeper_selection:
default_type: 'single_select'
resource_key: 'gatekeepers'
types:
single_select:
display_property: 'name'
id_property: 'id'
overlay_title: 'app.action.select.gatekeeper'
现在,在 Provision
实体的表单配置文件中,我想为数据列表包含一个 visibleCondition
:
<form xmlns="http://schemas.sulu.io/template/template"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.sulu.io/template/template http://schemas.sulu.io/template/form-1.0.xsd">
<key>provision_details</key>
<properties>
<property name="gatekeeper" type="single_gatekeeper_selection" mandatory="true">
<meta>
<title>app.gatekeeper</title>
</meta>
</property>
<property name="data" type="data_selection" visibleCondition="!!gatekeeper && gatekeeper.allowData">
<meta>
<title>app.data</title>
</meta>
</property>
</properties>
</form>
是否有可能实现这种行为?我已经尝试添加自定义 ConditionDataProvider
,但主要问题是 visibleCondition
是在 Field
级别评估的,而我唯一可以从中提取所需数据的地方是ResourceListStore
在 SingleSelect
.
这是不可能的,您只能访问原始表格数据。对于单个选择,gatekeeper
值仅包含所选元素的 id
。没有该元素后面元素的任何数据。
您有权访问的所有数据,您会在表格的保存 (POST/PUT) 请求中看到。
唯一可能的是使用 resource_store_properties_to_request
通过网守 ID 过滤您的 data_selection 结果,这需要您的数据 api 需要保持 gatekeeper
记住要过滤的参数:
<properties>
<property name="gatekeeper" type="single_gatekeeper_selection" mandatory="true">
<meta>
<title>app.gatekeeper</title>
</meta>
</property>
<property name="data" type="data_selection">
<meta>
<title>app.data</title>
</meta>
<params>
<param name="resource_store_properties_to_request" type="collection">
<param name="gatekeeper" value="gatekeeper"/>
</param>
</params>
</property>
</properties>
我有三个实体 Provision
、Gatekeeper
和 Data
。
class Provision {
private Gatekeeper $keeper; // ManyToOne
private Collection $points; // ManyToMany
}
class Gatekeeper {
private int $id;
private string $name;
private bool $allowData;
}
class Data {
private int $value;
}
所有实体都实现了 REST-CRUD 逻辑。为了编辑 Provision
实体,我将配置添加到 sulu_admin.yaml
:
sulu_admin:
field_type_options:
selection:
data_selection:
default_type: 'list_overlay'
resource_key: 'data'
types:
list_overlay:
adapter: 'table'
list_key: 'data'
display_properties: ['value']
icon: 'su-plus'
label: 'app.data'
overlay_title: 'app.action.select.data'
single_selection:
single_gatekeeper_selection:
default_type: 'single_select'
resource_key: 'gatekeepers'
types:
single_select:
display_property: 'name'
id_property: 'id'
overlay_title: 'app.action.select.gatekeeper'
现在,在 Provision
实体的表单配置文件中,我想为数据列表包含一个 visibleCondition
:
<form xmlns="http://schemas.sulu.io/template/template"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.sulu.io/template/template http://schemas.sulu.io/template/form-1.0.xsd">
<key>provision_details</key>
<properties>
<property name="gatekeeper" type="single_gatekeeper_selection" mandatory="true">
<meta>
<title>app.gatekeeper</title>
</meta>
</property>
<property name="data" type="data_selection" visibleCondition="!!gatekeeper && gatekeeper.allowData">
<meta>
<title>app.data</title>
</meta>
</property>
</properties>
</form>
是否有可能实现这种行为?我已经尝试添加自定义 ConditionDataProvider
,但主要问题是 visibleCondition
是在 Field
级别评估的,而我唯一可以从中提取所需数据的地方是ResourceListStore
在 SingleSelect
.
这是不可能的,您只能访问原始表格数据。对于单个选择,gatekeeper
值仅包含所选元素的 id
。没有该元素后面元素的任何数据。
您有权访问的所有数据,您会在表格的保存 (POST/PUT) 请求中看到。
唯一可能的是使用 resource_store_properties_to_request
通过网守 ID 过滤您的 data_selection 结果,这需要您的数据 api 需要保持 gatekeeper
记住要过滤的参数:
<properties>
<property name="gatekeeper" type="single_gatekeeper_selection" mandatory="true">
<meta>
<title>app.gatekeeper</title>
</meta>
</property>
<property name="data" type="data_selection">
<meta>
<title>app.data</title>
</meta>
<params>
<param name="resource_store_properties_to_request" type="collection">
<param name="gatekeeper" value="gatekeeper"/>
</param>
</params>
</property>
</properties>