使用 GridFieldDetailForm 修改字段时获取当前记录

csy*_*_io 2 silverstripe

首先,我使用的是 SilverStripe 3.2 RC1。

\n\n

如果您单击网格字段项,我需要修改它的显示字段。为了实现此目的,我正在修改“GridFieldDetailForm”字段,如下所示

\n\n
$bundleGridForm = $bundleGridConfig->getComponentByType(\'GridFieldDetailForm\');\n\n$detailFormFields = FieldList::create(\n  TabSet::create(\n    \'Root\',\n    Tab::create(\n      \'Haupt-Inhalt\',\n      CheckboxSetField::create(\n        \'ManyMany[AvailableVariations]\',\n        \'Verf\xc3\xbcgbare Variationen\',\n        $HELP-NEEDED-HERE->VariationItems()->map()->toArray()\n      )\n    )\n  )\n);\n\n$bundleGridForm->setFields($detailFormFields);\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,我只想显示一个 CheckboxSetField 并且作为源,$HELP-NEEDED-HERE->VariationItems()->map()->toArray()我想使用当前选定/单击的项目的关系 (VariationItems)。

\n\n

问题是我不知道如何获得这种关系,因为 $this 当然引用了我的网格字段所在的类,而不是单击的项目。

\n\n

也许handleItem()函数是我所需要的,因为它返回GridFieldDetailForm_ItemRequest类,我可以在其中调用getRecord()函数。但所有这一切都假设我从网格字段中获取使用handleItem()函数的请求,并且我绝对不知道如何获取该记录。

\n\n

对于任何帮助,我将非常感激。

\n\n

此致

\n

csy*_*_io 5

回答我自己的问题以及也被困在这里的任何人:

\n\n
$bundleGridConfig\n  ->removeComponentsByType(\'GridFieldAddNewButton\');\n\n$bundleGridForm = $bundleGridConfig->getComponentByType(\'GridFieldDetailForm\');\n// reset all fields, either you\'r just adding new fields below\n$bundleGridForm->setFields(FieldList::create());\n$bundleGridForm->setItemEditFormCallback(function($form) {\n  $record = $form->getRecord();\n\n  // get the saved values \n  $availableVariations = $this->Items()->getExtraData(\'AvailableVariations\', $record->ID);\n\n  $form->Fields()->push(\n    CheckboxSetField::create(\n      \'VariationList\',\n      \'Verf\xc3\xbcgbare Variationen\',\n      $record->VariationItems(),\n      // use the saved values as preset\n      explode(\',\', $availableVariations[\'AvailableVariations\'])\n    )\n  );\n\n  // workaround for https://github.com/silverstripe/silverstripe-framework/issues/4067\n  $form->Fields()->push(\n    HiddenField::create(\'ManyMany[AvailableVariations]\', \'Verf\xc3\xbcgbare Variationen\', $availableVariations[\'AvailableVariations\'])\n  );\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是有一个bug,它阻止了 CheckboxSetFields 写入数据库。作为一种快速解决方法,我的 CheckboxSetField 只是一个用于显示复选框的“伪字段”,而用于将所选选项保存到数据库的字段是一个 HiddenField。

\n\n

现在您所要做的就是将所选选项解析为字符串,并在 CheckboxSetField 发生任何更改时将此字符串插入到隐藏字段中。

\n