Silverstripe 元素模块在元素保存时重定向到前端 404 页面

Silverstripe Elemental Module redirects to frontend 404 page on element save

我使用 dnadesign/silverstripe-elemental 2.x-dev 和 Silverstripe 4.0.1。

我为页面创建了一个模块来保存所有页面。这就是我将扩展程序添加到主页的方式。

    XYPage\Model\HomePage:
      extensions: 
        - DNADesign\Elemental\Extensions\ElementalPageExtension

这是我的主页控制器:

    namespace XYpage\Controller;

    use PageController;

    class HomePageController extends PageController
    {
    }

这是我的主页模型:

    namespace XYpage\Model;

    use Page;
    use XYpage\Controller\HomePageController;
    class HomePage extends Page
    {

     private static $table_name = 'HomePage';

     /**
     * As our controller resides in a different namespace we have to 
     overwrite this method
     *
     * @return string
     */
     public function getControllerName()
     {
      return HomePageController::class;
     }
    }

我将模板变量更改为 $ElementalArea。我在后端看到预期的 UI。

现在,如果我在后端保存单个元素,我总是会被重定向到前端的 404 页面。

当我切换回后端时,元素链接到页面。

如果我在内容元素上的所见即所得编辑器中填写内容并保存,内容将显示在前端的页面上。

如果我尝试编辑该元素,则会错过内容的所见即所得编辑器。

我努力解决这个问题,修改了文档,但我看不出我做错了什么。

你有两个问题,我可以立即看到:

1:您的 YAML 配置引用 XYPage\HomePage,其中 class 的命名空间实际上是 XYPage\Model\HomePage。我怀疑这实际上是您示例中的一个错误,而不是您的实际项目,因为您说元素编辑器正在 CMS 中工作。

2:您的 getControllerName() 方法返回的 HomePageController::class 未在 class 中导入,因此它将解析为与模型相同的命名空间(XYPage\Model\HomePageController).虽然 this is the default/expected location 对于 SiteTree 控制器,重载此代码意味着一切都在您身上!将 use XYPage\Controller\HomePageController; 添加到您的 class 定义中。

经过大量调试后,我发现是什么导致了这些行为。就我而言,一个问题是我将 unclecheese/silverstripe-gridfield-betterbuttons 与元素一起使用。

下一个问题是反应错误:

BetterButtons 和 DNADesign Elemental 存在问题。

只需添加此项即可同时禁用 ElementContent 的 BetterButtons。

DNADesign\Elemental\Models\ElementContent:
  better_buttons_enabled: false