【问题标题】:SilverStripe many_many_extrafields configuration errorSilverStripe many_many_extrafields 配置错误
【发布时间】:2018-04-12 19:52:22
【问题描述】:

我正在一个项目中设置一些数据对象之间的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] 在 null 上调用成员函数 setFields()

引用此行:

$configRegole->getComponentByType('GridFieldDetailForm')->setFields($regolaFields);

如您所见,我在它之前添加了规范实例化 - 如开发人员指南建议的那样。

我正在尝试找出原因,但我确定缺少某些东西。

提前致谢。

【问题讨论】:

    标签: php silverstripe silverstripe-4


    【解决方案1】:

    您需要使用完全限定的类名来引用 GridFieldComponent 类。这也适用于 SS4 中的任何类,如果您养成使用 ::class 引用它们的习惯,例如Regola::class 即使他们没有自己的命名空间。

    正确代码:

    use SilverStripe\Forms\GridField\GridFieldDetailForm;
    // ...
    $configRegole->getComponentByType(GridFieldDetailForm::class)->setFields($regolaFields);
    

    【讨论】:

    • 再次感谢@robbie-averill。问题解决了。当然,我会更多地关注这种方法。
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多