SilverStripe many_many_extrafields 配置错误
SilverStripe many_many_extrafields configuration error
我在一个项目中设置一些数据对象之间的 many_many_extraFields
关系,遵循 official doc。
使用以下代码:
<?php
// Definizione Namespace
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Security\Permission;
/**
* Classe Sconto catalogo e prodotto
*/
class Sconto extends DataObject
{
[...]
private static $many_many = [
'Regole' => 'Regola'
];
private static $many_many_extraFields = [
'Regole' => [
'Area' => 'Varchar',
'Tipologia' => 'Varchar',
'Prezzo' => 'Currency'
]
];
[...]
/**
* Metodo gestione campi CMS
* Setter
* @return FieldList $fields Campi Back-End
*/
public function getCMSfields()
{
$fields = parent::getCMSFields();
[...]
// Fetching campi Regole
$regolaFields = singleton('Regola')->getCMSfields();
// Aggiunta campi specifici Regole
$regolaFields->addFieldsToTab('Root.Regola', array(
DropdownField::create('ManyMany[Area]', 'Area di applicazione', array(
'Prodotto' => 'Prodotto'
))->setEmptyString('Applica a'),
DropdownField::create('ManyMany[Tipologia]', 'Criterio di applicazione', array(
'Prezzo' => 'Prezzo'
))->setEmptyString('Applica per'),
NumericField::create('ManyMany[Prezzo]', 'Prezzo prodotto (€)')->setScale(2)->setAttribute('placeholder', 'Es. 5,00')
), 'Criterio');
$configRegole = GridFieldConfig_RelationEditor::create();
$configRegole->getComponentByType('GridFieldDetailForm')->setFields($regolaFields);
$gridRegole = GridField::create('Regole', 'Regole', $this->Regole(), $configRegole);
$fields->findOrMakeTab('Root.Sconto')->replaceField('Regole', $gridRegole);
[...]
return $fields;
}
}
framweork 抛出这个异常:
[Alert] Call to a member function setFields() on null
参考这一行:
$configRegole->getComponentByType('GridFieldDetailForm')->setFields($regolaFields);
如您所见,我在它之前添加了规范实例化 - 如开发人员指南所建议的那样。
我正在尝试找出原因,但我确定缺少某些东西。
提前致谢。
您需要使用完全限定的 class 名称来引用 GridFieldComponent classes。这也适用于 SS4 中的任何 classes,如果您养成使用 ::class
引用它们的习惯,例如Regola::class
即使他们没有自己的命名空间。
正确代码:
use SilverStripe\Forms\GridField\GridFieldDetailForm;
// ...
$configRegole->getComponentByType(GridFieldDetailForm::class)->setFields($regolaFields);
我在一个项目中设置一些数据对象之间的 many_many_extraFields
关系,遵循 official doc。
使用以下代码:
<?php
// Definizione Namespace
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Security\Permission;
/**
* Classe Sconto catalogo e prodotto
*/
class Sconto extends DataObject
{
[...]
private static $many_many = [
'Regole' => 'Regola'
];
private static $many_many_extraFields = [
'Regole' => [
'Area' => 'Varchar',
'Tipologia' => 'Varchar',
'Prezzo' => 'Currency'
]
];
[...]
/**
* Metodo gestione campi CMS
* Setter
* @return FieldList $fields Campi Back-End
*/
public function getCMSfields()
{
$fields = parent::getCMSFields();
[...]
// Fetching campi Regole
$regolaFields = singleton('Regola')->getCMSfields();
// Aggiunta campi specifici Regole
$regolaFields->addFieldsToTab('Root.Regola', array(
DropdownField::create('ManyMany[Area]', 'Area di applicazione', array(
'Prodotto' => 'Prodotto'
))->setEmptyString('Applica a'),
DropdownField::create('ManyMany[Tipologia]', 'Criterio di applicazione', array(
'Prezzo' => 'Prezzo'
))->setEmptyString('Applica per'),
NumericField::create('ManyMany[Prezzo]', 'Prezzo prodotto (€)')->setScale(2)->setAttribute('placeholder', 'Es. 5,00')
), 'Criterio');
$configRegole = GridFieldConfig_RelationEditor::create();
$configRegole->getComponentByType('GridFieldDetailForm')->setFields($regolaFields);
$gridRegole = GridField::create('Regole', 'Regole', $this->Regole(), $configRegole);
$fields->findOrMakeTab('Root.Sconto')->replaceField('Regole', $gridRegole);
[...]
return $fields;
}
}
framweork 抛出这个异常:
[Alert] Call to a member function setFields() on null
参考这一行:
$configRegole->getComponentByType('GridFieldDetailForm')->setFields($regolaFields);
如您所见,我在它之前添加了规范实例化 - 如开发人员指南所建议的那样。
我正在尝试找出原因,但我确定缺少某些东西。
提前致谢。
您需要使用完全限定的 class 名称来引用 GridFieldComponent classes。这也适用于 SS4 中的任何 classes,如果您养成使用 ::class
引用它们的习惯,例如Regola::class
即使他们没有自己的命名空间。
正确代码:
use SilverStripe\Forms\GridField\GridFieldDetailForm;
// ...
$configRegole->getComponentByType(GridFieldDetailForm::class)->setFields($regolaFields);