Я застрял на этом некоторое время, и я не вижу, где я ошибаюсь.
Я создал класс, расширяющий 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();
}
}
}
Вы правы, я должен это делать. Я наконец-то нашел ответ и разместил его ниже. Спасибо за ваш комментарий @Scuzzy






Я понял.
Оказывается, контроллер класса, который я расширял для переопределения, не работал, вместо этого он ссылался на 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: если вы не вызываете эту функцию из своего контроллера, проигнорируйте это.
Вы вызываете
UserDefinedForm::get(), возможно, вам нуженstatic::get()для загрузки правильного контекста класса.