OctoberCMS:如何根据父表单域预填充子表单域

问题描述

我只是想在 OctoberCMS 后端建立一个关系,其中子表单应该从父表单获取一个值作为建议(认)。

详细地讲,有两个模型由belongsTo 关系链接一个参加者属于一个锦标赛) 第一个涵盖体育比赛的父模型 (field.yaml):

tournament:
    # ... some other fields
    start_date:
        label: Start date
        type: date
    attendees:
        label: Attendees
        type: partial

第二位参加者的儿童模型:

attendee:
    name:
        label: Name
        type: text
    start_date:
        label: Start date
        type: date
        # how to get the value from tournament->start_date as preset?

家长表格(在体育比赛中)有开始日期以及相关的部分报道运动员参加比赛。每个运动员还有一个单独的开始日期字段,我想在父锦标赛表单调用此表单时预先填写比赛的开始日期。但它必须是可编辑的,因为并非所有与会者都会在同一天开始。

一个内置函数可以用来自同一表单的另一个字段的值预设一个字段,但不幸的是我找不到如何从父表单获取值的解决方案。

提前致谢!

解决方法

您可以将 relationExtendManageWidget 方法添加到您的 Tournament controller 中并扩展其行为。您现在可以在创建新记录时inject initial values for your new modal

// ..code
class Tournament extends Controller
{
    // ..code

    public function __construct()
    {
        // ..code
    }

    public function relationExtendManageWidget($widget,$field,$model)
    {
      // make sure we are doing on correct relation
      // also make sure our context is create so we only copy name on create
      if($field === 'attendees' 
          && property_exists($widget->config,'context') 
          && $widget->config->context === 'create'
      ) {         
        $widget->config->model->start_date = $model->start_date;
        // this is attendee ^ model            ^ this is main tournament model
      }
    }
}

现在,当您尝试从您的 attendee record 创建新的 Tournament record 时,您的与会者的 start_date 将根据您锦标赛的 start_date 进行预填充,并且只会在创建新记录。

如有任何疑问,请评论。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...