Создать новое поле вручную из заданной функции. Пользовательский плагин

1

Я хочу добавить некоторые поля по умолчанию, используя плагин Userforms в Silverstripe 3.2. Я думаю, что нашел функцию, которая добавляет поля, когда кнопка "Добавить поле" нажата в Gridfield, но я не уверен, и я не знаю, как добавить formfield type (ввод даты), вызвав простую функцию. Вот полная функция:

public function getFieldEditorGrid() {
    Requirements::javascript(USERFORMS_DIR . '/javascript/FieldEditor.js');

    $fields = $this->owner->Fields();

    $this->createInitialFormStep(true);
    $editableColumns = new GridFieldEditableColumns();
    $fieldClasses = singleton('EditableFormField')->getEditableFieldClasses();
    $editableColumns->setDisplayFields(array(
        'ClassName' => function($record, $column, $grid) use ($fieldClasses) {
            if($record instanceof EditableFormField) {
                return $record->getInlineClassnameField($column, $fieldClasses);
            }
        },
        'Title' => function($record, $column, $grid) {
            if($record instanceof EditableFormField) {
                return $record->getInlineTitleField($column);
            }
        }
    ));

    $config = GridFieldConfig::create()
        ->addComponents(
            $editableColumns,
            new GridFieldButtonRow(),
            GridFieldAddClassesButton::create('EditableTextField')
                ->setButtonName(_t('UserFormFieldEditorExtension.ADD_FIELD', 'Add Field'))
                ->setButtonClass('ss-ui-action-constructive'),
            GridFieldAddClassesButton::create('EditableFormStep')
                ->setButtonName(_t('UserFormFieldEditorExtension.ADD_PAGE_BREAK', 'Add Page Break')),
            GridFieldAddClassesButton::create(array('EditableFieldGroup', 'EditableFieldGroupEnd'))
                ->setButtonName(_t('UserFormFieldEditorExtension.ADD_FIELD_GROUP', 'Add Field Group')),
            new GridFieldEditButton(),
            new GridFieldDeleteAction(),
            new GridFieldToolbarHeader(),
            new GridFieldOrderableRows('Sort'),
            new GridFieldDetailForm()
        );

    $fieldEditor = GridField::create(
        'Fields',
        _t('UserDefinedForm.FIELDS', 'Fields'),
        $fields,
        $config
    )->addExtraClass('uf-field-editor');

    return $fieldEditor;
}
  • 0
    Вы пытаетесь создать поле формы по умолчанию каждый раз, когда создается страница формы пользователя?
  • 0
    да. Я создал новый тип страницы, и каждый раз, когда создается новая страница этого типа, для автоматического добавления будут добавлены 2 поля. Так что я думаю, чтобы вызвать функцию (при создании страницы), которая добавляет эти поля.
Теги:
silverstripe

1 ответ

2
Лучший ответ

Мы можем вызвать onAfterWrite для установки полей по умолчанию после того, как страница будет сохранена в первый раз.

class CustomFormPage extends UserDefinedForm {

    public function onAfterWrite() {

        if (!$this->Fields() || !$this->Fields()->exists()) {

            $nameField = new EditableTextField();
            $nameField->Name = 'Name';
            $nameField->Title = 'Name';
            $nameField->ParentID = $this->ID;
            $nameField->Required = true;
            $nameField->CustomErrorMessage = 'Please enter your name.';
            $nameField->write();

            $dateField = new EditableDateField();
            $dateField->Name = 'Date';
            $dateField->Title = 'Date';
            $dateField->ParentID = $this->ID;
            $dateField->Required = true;
            $dateField->CustomErrorMessage = 'Please enter this date.';
            $dateField->write();
        }
        parent::onAfterWrite();
    }

}
  • 1
    именно то, что мне нужно. Это работает. Спасибо за помощь. ура

Ещё вопросы

Сообщество Overcoder
Наверх
Меню