类似于 表单字段条件,表单字段可以通过定义 dependsOn 表单字段属性来声明对其他字段的依赖。这提供了一个更健壮的服务器端解决方案,用于在其依赖项被修改时更新字段。
当声明为依赖项的字段发生变化时,定义字段将使用 AJAX 框架进行更新。这提供了一个机会,可以使用 filterFields 方法与字段的属性进行交互,或者更改要提供给该字段的可用选项。
country:
label: Country
type: dropdown
state:
label: State
type: dropdown
dependsOn: country在上述示例中 state 表单字段将会在 country 字段的值发生变化时刷新。当这种情况发生时,当前的表单数据将被填充到模型中以便下拉选项可以使用它。
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', ...];
}
}您可以通过覆盖所用 Model 中的 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;
}
}上述逻辑将通过检查模型属性 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 外观显示一条消息。
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']);
}