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

时间:2015-09-28 11:25:40

标签: silverstripe

首先,我正在使用SilverStripe 3.2 RC1。

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

(function( $ ){

    $.fn.LazyImageLoad = function() { 

        $(this).on('scroll' , function() {
            doMyStuff(this);
        });
        $(this).on('load' , function() {
            doMyStuff(this);
        });
        $(this).on('resize' , function() {
            doMyStuff(this);
        });

    }

    function doMyStuff(this)
    {
        console.log ( 'Lazy Image Load run' )

        $('img' , this).each(function() {
            $(this).hide(1000) ;
        });
    }

})( jQuery );

如您所见,我只想显示一个CheckboxSetField和一个源$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); 我想使用当前所选/点击项目的realation(VariationItems)。

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

Perhapse handleItem()函数是我需要的,因为它返回GridFieldDetailForm_ItemRequest类我可以调用getRecord()函数。但所有这一切都预示着我从gridfield获取请求以使用handleItem()函数,我绝对无法弄清楚如何获取此记录。

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

最好的问候

1 个答案:

答案 0 :(得分:4)

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

$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'])
  );
});

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

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