【问题标题】:Dynamically add fields to relation manager using relationExtendManageWidget()使用relationExtendManageWidget() 将字段动态添加到关系管理器
【发布时间】:2018-11-29 13:13:29
【问题描述】:

我创建了一个与另一个模型有关系的模型。我使用关系管理器小部件来处理关系。一切都很好。

现在,我需要根据父模型中字段的选择动态地将字段添加到关系模型中。我注意到有针对那个的 relationExtendManageWidget() 函数。

但是,我不知道如何使用它,文档也没有提供任何示例。我试图这样做:

public function relationExtendManageWidget($widget, $field, $model)
{
    // Make sure the field is the expected one
    if ($field != 'references') return; 

    $widget->addFields([
        'test' => [
            'label' => 'Test',
            'span' => 'left',
            'type' => 'text',
        ],
    ]);

    return $widget;

}

但是当我转到我的表单时,我收到以下错误:

在 null 上调用成员函数 addField() /modules/backend/widgets/Form.php 第 569 行

【问题讨论】:

  • 只是有人想知道,relationExtendManageWidget 方法在 \Backend\Behaviors\RelationController 中定义,并且应该在您的控制器中被覆盖以使用它。
  • relationExtendManageWidget 预计不会返回任何内容。它会被忽略。

标签: field backend octobercms


【解决方案1】:

$widget 对象 (Widget Base documentation) 上不存在 addFields 方法。为了实现您想要做的事情,我建议您使用 extendFormFields 方法来扩展表单字段,或者改为创建一个部分字段。使用 extendFormFields 的示例如下所示(代码未经测试):

public function extendFormFields(function($form, $model, $context)
{
    if (!$model instanceof MyModel) { //your related model
        return;
    }

    $form->addFields([
        'test' => [
            'label' => 'Test',
            'span' => 'left',
            'type' => 'text',
        ],
    ]);
});

【讨论】:

  • 您不能这样做来扩展关系的视图管理器,此代码仅用于扩展主创建/更新表单的字段。扩展管理小部件的字段正确的方法是relationExtendManageWidget,唯一的问题是表单没有完全初始化,所以你需要绑定到小部件的form.extendFields事件
【解决方案2】:

不使用$widget->addFields(...),而是将字段配置直接添加到$widget->fields。 这对我有用。

public function relationExtendManageWidget($widget, $field, $model)
{
    // Make sure the field is the expected one
    if ( $field != 'references') return;

    $widget->fields += [
        'test' => [
            'label' => 'Test',
            'span' => 'left',
            'type' => 'text',
        ],
    ];
}

【讨论】:

    【解决方案3】:

    没有明确记录管理小部件,但与Extending the view widget 下的文档中解释的相同:

    由于小部件在运行时周期的此时尚未完成初始化,因此您不能调用 $widget->removeColumn()。 ListController 文档中描述的 addColumns() 方法将按预期工作,但要删除列,我们需要在 relationExtendViewWidget() 方法中侦听“list.extendColumns”事件。

    为了添加字段,我们需要监听 form.extendFields 事件:

    public function relationExtendManageWidget($widget, $field, $model)
    {
        if ($field != 'references') return; 
    
        $widget->bindEvent('form.extendFields', function () use($widget) {
            $widget->addFields([
                'test' => [
                    'label'   => 'test'
                ],
            ]);
        });        
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多