【问题标题】:Using backend forms in frontend - OctoberCMS在前端使用后端表单 - OctoberCMS
【发布时间】:2021-01-29 01:46:11
【问题描述】:

我在后端有一个表单来创建新条目。我想让我网站的前端用户也可以创建这些条目,所以由于我已经在后端有这样的表单和控制器,我想在前端也使用它。

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

# 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>

但是,我收到以下错误:

在渲染模板期间引发了异常(“The 未找到部分“_field_richeditor.htm”。”)。

【问题讨论】:

    标签: octobercms octobercms-backend october-form-controller october-partial


    【解决方案1】:

    您需要 resister 那些 widgets 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 ...
    }
    

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

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

    【讨论】:

    • 这修复了它。非常感谢。但是,我现在遇到另一个错误:Call to a member function hasAccess() on null。我猜,这是因为后端表单会检查后端用户是否已登录。您知道如何使表单对前端用户可用吗?如果是这样,我是否应该创建一个单独的问题,以便您回答,我可以投票并接受它?
    • 嗯让我检查一下可能是
    • 我不确定从我的组件中添加了 ajax 处理程序,我可以使用普通表单并提交它。我猜你的表格可能有点复杂
    • 你确定你测试的时候没有登录后台吗?
    • 当我禁用 fields.yaml 中的 richeditor 字段时,错误消失了,我猜这个问题与访问 richeditor 中的媒体文件有关i> 这在前端是不允许的。您是否使用后端表单中的 richeditor 字段对其进行了测试?
    猜你喜欢
    • 2016-09-25
    • 2019-04-20
    • 1970-01-01
    • 2017-12-03
    • 2019-08-09
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多