Проблемы с расширением класса UserDefinedForm в Silverstripe 4

Я застрял на этом некоторое время, и я не вижу, где я ошибаюсь.

Я создал класс, расширяющий UserDefinedForm, поэтому у меня может быть страница, на которой также есть UserDefinedForm. Форма загружается на страницу, но это не так просто, как просто сказать $ Form в файле шаблона, вместо этого мне нужно создать и вызвать следующую функцию:

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

Поэтому, когда я вызываю эту функцию в шаблоне, она отображает форму, однако ни одно из моих правил поля не применяется, и при отправке формы я попадаю на пустую страницу с добавленным к URL-адресу «/ finished»: «https://example.com/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();
        }
    }
    }

Вы вызываете UserDefinedForm::get(), возможно, вам нужен static::get() для загрузки правильного контекста класса.

Scuzzy 18.07.2018 00:21

Вы правы, я должен это делать. Я наконец-то нашел ответ и разместил его ниже. Спасибо за ваш комментарий @Scuzzy

Matthew Jeffery 18.07.2018 01:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
364
1

Ответы 1

Я понял.

Оказывается, контроллер класса, который я расширял для переопределения, не работал, вместо этого он ссылался на UserDefinedFormController. Я исправил это, скопировав следующую функцию из класса UserDefinedForm:

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

и скопировал его в мой расширенный класс из UserDefinedForm и переименовал оператор return в имя класса, например:

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

Если вы используете return static::class;, тогда он будет использовать текущий контекст класса без необходимости дублировать функцию в каждом классе :) см. php.net/manual/en/language.oop5.static.php / php.net/manual/en/language.oop5.late-static-bindings.php Edit: если вы не вызываете эту функцию из своего контроллера, проигнорируйте это.

Scuzzy 18.07.2018 04:20

Другие вопросы по теме