Php Silverstripe 4中类扩展UserDefinedForm的问题

Php Silverstripe 4中类扩展UserDefinedForm的问题,php,web,silverstripe,silverstripe-4,Php,Web,Silverstripe,Silverstripe 4,我已经在这上面呆了一段时间了,我看不出哪里出了问题 我创建了一个类来扩展UserDefinedForm,这样我就可以有一个页面,上面也有一个UserDefinedForm。表单加载到页面上,但这并不像在模板文件上只说$form那么简单,相反,我必须生成并调用以下函数: public function getUserForm() { $page = UserDefinedForm::get()->byID($this->ID); $controller = UserDe

我已经在这上面呆了一段时间了,我看不出哪里出了问题

我创建了一个类来扩展UserDefinedForm,这样我就可以有一个页面,上面也有一个UserDefinedForm。表单加载到页面上,但这并不像在模板文件上只说$form那么简单,相反,我必须生成并调用以下函数:

public function getUserForm() {
    $page = UserDefinedForm::get()->byID($this->ID);
    $controller = UserDefinedFormController::create($page);
    return $controller->Form();
}
因此,当我在模板上调用该函数时,它会显示表单,但是,没有应用任何字段规则,并且在提交表单时,它会将我带到一个空白页面,并在URL:“”中附加“/finished”

如果有人能帮我一下,我将不胜感激。 我会在下面写下我的代码

类扩展UserDefinedForm:

  <?php
    use SilverStripe\Forms\FieldList;
    use SilverStripe\Forms\TextField;
    use SilverStripe\Forms\FileHandleField;
    use SilverStripe\Core\Injector\Injector;
    use SilverStripe\Assets\Image;
    use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
    use SilverStripe\Forms\GridField\GridField;
    use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
    use SilverStripe\Forms\DropdownField;
    use SilverStripe\UserForms\Model\UserDefinedForm;
    use SilverStripe\UserForms\Control\UserDefinedFormController;
    use SilverStripe\UserForms\Model\EditableCustomRule;

    class Package extends UserDefinedForm {

    private static $db = [
        'Date' => 'Text',
        'Location' => 'Text',
        'Availability' => 'Enum(array("Available","Hidden","Sold Out"))',
        'Extras' => 'HTMLText',
        'NeedTo' => 'HTMLText',
        'Price' => 'Text'

    ];

    private static $has_one =[
        'Photo' => Image::class,

    ];

    private static $has_many =[
        'FileAttachments' => 'PackageFile'
    ];

    private static $many_many = [
        'SacredTexts' => 'ImportantText'
    ];

    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root.Main', Injector::inst()->create(FileHandleField::class, 'Photo'));
        $fields->addFieldToTab('Root.Main', new TextField('Date', 'Date'));
        $fields->addFieldToTab('Root.Main', new TextField('Location', 'Location'));
        $fields->addFieldToTab('Root.Main', new TextField('Price', 'Price'));
        $fields->addFieldToTab('Root.Main', new HTMLEditorField('Extras', 'Extras'));
        $fields->addFieldToTab('Root.Main', new HTMLEditorField('NeedTo', 'What you need to know'));
        $fields->addFieldToTab('Root.Main',  new DropdownField('Availability', 'Availability',  singleton('Package')->dbObject('Availability')->enumValues()));
        $fields->addFieldToTab('Root.Main', new GridField('SacredTexts', 'Important Texts',  $this->SacredTexts(), GridFieldConfig_RecordEditor::create()),'Date');
        $fields->addFieldToTab('Root.Main', new GridField('FileAttachments', 'File Attachments',  $this->FileAttachments(), GridFieldConfig_RecordEditor::create()),'Content');
        return $fields;
    }
    /* Look up SS4 docs on SS Sitetree URL parse function and what needs to be namespaced */
    function onBeforeWrite () {
        parent::onBeforeWrite ();
        if($this->Name){
            $this->Slug =  str_replace(' ','-', strtolower($this->Name));;
        }
    }

    public function ShortContent( $word_limit = 20 ) {
        $NoHTML = htmlspecialchars_decode(strip_tags($this->NewsText),ENT_QUOTES);
        $words = explode( ' ', $NoHTML );
        return implode( ' ', array_slice( $words, 0, $word_limit ) );
    }

    public function ParentEvent(){
        return $this->Parent()->URLSegment;
    }

    public function getUserForm() {
        $page = UserDefinedForm::get()->byID($this->ID);
        $controller = UserDefinedFormController::create($page);
        return $controller->Form();
    }

    public function hasUserForm() {
        if (count($this->getUserForm()->Fields()) > 1) {
            return $this->getUserForm();
        }
    }
    }
我想出来了

事实证明,我扩展到override的类控制器不起作用,而是引用了UserDefinedFormController。我通过从UserDefinedForm类复制以下函数修复了它:

public function getControllerName()
{
    return UserDefinedFormController::class;
}
将它从UserDefinedForm复制到我的扩展类中,并将return语句重命名为该类的名称,例如:

public function getControllerName()
{
    return PackageController::class;
}

您正在调用
UserDefinedForm::get()
,可能需要
static::get()
来加载正确的类上下文。您是对的,我应该这样做。我现在终于找到了答案,把它贴在下面。感谢您在@ScuzzyIf使用
returnstatic::class然后它将使用当前类上下文,而无需在每个类中复制函数:)请参见/编辑:除非您不是从控制器中调用此函数,否则忽略此函数。