类似于表单字段条件,表单字段可以通过定义 dependsOn 表单字段属性来声明对其他字段的依赖。这为当字段的依赖项被修改时更新字段提供了一个更健壮的服务器端解决方案。
当声明为依赖项的字段发生变化时, 定义字段将使用 AJAX 框架进行更新. 这提供了一个机会来使用 filterFields 方法与字段的属性进行交互, 或更改将提供给该字段的可用选项.
country:
label: Country
type: dropdown
state:
label: State
type: dropdown
dependsOn: country在上述示例中,当 country 字段的值发生变化时,state 表单字段将会刷新。发生这种情况时,当前表单数据将会填充到模型中,以便下拉选项可以使用它。
public function getCountryOptions()
{
return ['au' => 'Australia', 'ca' => 'Canada'];
}
public function getStateOptions()
{
if ($this->country == 'au') {
return ['act' => 'Capital Territory', 'qld' => 'Queensland', ...];
}
elseif ($this->country == 'ca') {
return ['bc' => 'British Columbia', 'on' => 'Ontario', ...];
}
}你可以在所使用的模型中通过重写 filterFields 方法来过滤表单字段定义。这允许你根据模型数据操作可见性和其他字段属性。该方法接受两个参数 $fields 将表示一个字段对象,这些字段已由 字段配置 定义 和 $context 表示活动的表单上下文。
public function filterFields($fields, $context = null)
{
if ($this->source_type === 'http') {
$fields->source_url->hidden = false;
$fields->git_branch->hidden = true;
}
elseif ($this->source_type === 'git') {
$fields->source_url->hidden = false;
$fields->git_branch->hidden = false;
}
else {
$fields->source_url->hidden = true;
$fields->git_branch->hidden = true;
}
}$context 值在显示和保存表单时将包含表单上下文(创建、更新等),然而,当表单被刷新时,上下文将始终设置为 refresh。这对于用新值填充字段很有用,而不会强制它成为已保存的值。以下操作将在父级值在刷新期间发生更改时重置父级名称值,但不会影响保存值。
public function filterFields($fields, $context = null)
{
if ($context === 'refresh' && $this->parent) {
$fields->parent_name->value = $this->parent->name;
}
}上述逻辑将通过检查 Model 属性 source_type 的值来设置某些字段的 hidden 标志。此逻辑将在表单首次加载时以及通过定义的字段依赖关系更新时应用。例如,以下是相关的表单字段定义。
source_type:
label: Source Type
type: dropdown
options:
git: Git
http: Http
upload: Upload
source_url:
label: Source URL
type: text
dependsOn: source_type
git_branch:
label: Git Branch
type: text
dependsOn: source_type在某些情况下,您可能希望在字段值发生变化时手动运行一个 AJAX 处理器。您可以使用 changeHandler 属性来指定一个 AJAX 处理器。以下示例将在值发生变化时调用 onChangeContent AJAX 处理器。
content:
label: Content
type: textarea
changeHandler: onChangeContentAJAX 处理程序可以常规方式添加到控制器中。以下内容会在字段更新时,使用 Flash facade 显示一条消息。
public function onChangeContent()
{
Flash::success('Great job!');
}如果您希望更新其他字段,请使用由表单控制器提供的 formRefreshFields 方法。
public function onChangeContent()
{
return $this->formRefreshFields('is_positive');
}你也可以通过传递一个数组来同时更新多个字段.
public function onChangeContent()
{
return $this->formRefreshFields(['is_positive', 'internal_comments']);
}