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

Silverstripe 使用GridFieldDetailForm修改字段时获取当前记录,silverstripe,Silverstripe,首先,我使用的是SilverStripe 3.2 RC1 如果单击gridfield项,我需要修改它的显示字段。为了实现这一点,我修改了像这样的“GridFieldDetailForm”字段 $bundleGridForm = $bundleGridConfig->getComponentByType('GridFieldDetailForm'); $detailFormFields = FieldList::create( TabSet::create( 'Root',

首先,我使用的是SilverStripe 3.2 RC1

如果单击gridfield项,我需要修改它的显示字段。为了实现这一点,我修改了像这样的“GridFieldDetailForm”字段

$bundleGridForm = $bundleGridConfig->getComponentByType('GridFieldDetailForm');

$detailFormFields = FieldList::create(
  TabSet::create(
    'Root',
    Tab::create(
      'Haupt-Inhalt',
      CheckboxSetField::create(
        'ManyMany[AvailableVariations]',
        'Verfügbare Variationen',
        $HELP-NEEDED-HERE->VariationItems()->map()->toArray()
      )
    )
  )
);

$bundleGridForm->setFields($detailFormFields);
如您所见,我只想显示一个CheckboxSetField,作为source$HELP-NEEDED-HERE->VariationItems->map->toArray,我想使用当前选中/单击项的realation VariationItems

问题是我不知道如何获得这个关系,因为$this当然是引用类,我的gridfield在其中,而不是引用单击的项

也许这个函数就是我所需要的,因为它返回了一个类,在这个类中我可以调用这个函数。但是所有这些都是以我从gridfield获取请求来使用handleItem函数为前提的,我完全不知道如何获取这个记录

如果有任何帮助,我将不胜感激


请回答我自己的问题,并向所有困在这里的人致以最诚挚的问候:

$bundleGridConfig
  ->removeComponentsByType('GridFieldAddNewButton');

$bundleGridForm = $bundleGridConfig->getComponentByType('GridFieldDetailForm');
// reset all fields, either you'r just adding new fields below
$bundleGridForm->setFields(FieldList::create());
$bundleGridForm->setItemEditFormCallback(function($form) {
  $record = $form->getRecord();

  // get the saved values 
  $availableVariations = $this->Items()->getExtraData('AvailableVariations', $record->ID);

  $form->Fields()->push(
    CheckboxSetField::create(
      'VariationList',
      'Verfügbare Variationen',
      $record->VariationItems(),
      // use the saved values as preset
      explode(',', $availableVariations['AvailableVariations'])
    )
  );

  // workaround for https://github.com/silverstripe/silverstripe-framework/issues/4067
  $form->Fields()->push(
    HiddenField::create('ManyMany[AvailableVariations]', 'Verfügbare Variationen', $availableVariations['AvailableVariations'])
  );
});
问题在于存在一个阻止将CheckboxSetFields写入数据库的错误。作为一种快速解决方法,my CheckboxSetField只是一个显示复选框的伪字段,而将所选选项保存到数据库的字段是一个HiddenField


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

您需要从何处获取当前项?编辑项目时?编辑表单是在当前项目中生成的,请参见项目类的getCMSFields方法…但在修改显示的字段$bundleGridForm->setFields$detailFormFields时不会生成;