在前端使用后端表单-OctoberCMS

问题描述

我在后端有一个表单来创建新条目。我也想允许我的网站的前端用户也创建这些条目,因此,由于我已经在后端具有这样的表格和控制器,因此我也希望在前端中使用它。>

我已经为前端创建了一个组件,并试图在其中渲染后端表单,如下所示:

# components/NewEntryForm.PHP
<?PHP namespace Author\PluginName\Components;

use Cms\Classes\ComponentBase;
use Author\PluginName\Models\Entry;
use Author\PluginName\Controllers\Entries as EntryController;

class NewEntryForm extends ComponentBase
{
    public function componentDetails()
    {
        return [
            'name'        => 'NewEntryForm Component','description' => 'No description provided yet...'
        ];
    }

    public function onRun()
    {
        // New back-end form with the context of 'frontend'
        $formController = new EntryController();
        $formController->create('frontend');

        // Append the entryController to the page
        $this->page['form'] = $formController;

        // Add backend styles to the form
        $this->addCss('/modules/backend/assets/css/controls.css','core');
    }
}

组件的default.htm

<!-- components/newentryform/default.htm -->
<form role="form"
    data-request="{{ __SELF__ }}::onSave"
    data-request-success="$el.hide();$('.confirm-container').removeClass('hide');">

    {{ form.formRender()|raw }}

    <div class="form-group">
        <button class="btn btn-primary btn-block btn-lg" type="submit" value="register">Create</button>
    </div>
</form>

但是,出现以下错误

在呈现模板的过程中引发了异常(“ 找不到部分“ _field_richeditor.htm”。”

解决方法

您需要resisterwidgets manually,就像backend中的registered by backend provider

用于在前端注册小部件的代码,您需要将此代码放入插件的Plugin.php文件中

// import
use Backend\Classes\WidgetManager;

class Plugin extends PluginBase
{
    public function register() {
      WidgetManager::instance()->registerFormWidgets(function ($manager) {
        // You can add them as per need
        $manager->registerFormWidget('Backend\FormWidgets\RichEditor','richeditor');

        // $manager->registerFormWidget('Backend\FormWidgets\CodeEditor','codeeditor');          
        // $manager->registerFormWidget('Backend\FormWidgets\MarkdownEditor','markdown');
        // $manager->registerFormWidget('Backend\FormWidgets\FileUpload','fileupload');
        // $manager->registerFormWidget('Backend\FormWidgets\Relation','relation');
        // $manager->registerFormWidget('Backend\FormWidgets\DatePicker','datepicker');
        // $manager->registerFormWidget('Backend\FormWidgets\TimePicker','timepicker');
        // $manager->registerFormWidget('Backend\FormWidgets\ColorPicker','colorpicker');
        // $manager->registerFormWidget('Backend\FormWidgets\DataTable','datatable');
        // $manager->registerFormWidget('Backend\FormWidgets\RecordFinder','recordfinder');
        // $manager->registerFormWidget('Backend\FormWidgets\Repeater','repeater');
        // $manager->registerFormWidget('Backend\FormWidgets\TagList','taglist');
        // $manager->registerFormWidget('Backend\FormWidgets\MediaFinder','mediafinder');
        // $manager->registerFormWidget('Backend\FormWidgets\NestedForm','nestedform');
      });
    }
    // ... other code ...
}

它将注册小部件,您可以在前端使用它们而不会出现任何问题。

如有任何疑问,请发表评论。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...