【问题标题】:Validation Controller inside CMS in SilverstripeSilverstripe 中 CMS 内的验证控制器
【发布时间】:2016-04-06 14:38:04
【问题描述】:

目前我有一个名为“应用程序”的 LeftAndMain 部分,其中包含一个带有密码字段的表单:

代码如下:

class Applications extends LeftAndMain {
    static $url_segment = 'applications';
    static $menu_title = 'Applications';
    static $url_rule = '$Action/$ID';

    public function init(){
        parent::init();
    }

    public function getEditForm($id = null, $fields = null) {
        $fields = new FieldList(
            TextField::create('Password', ' Password')
        );
        $actions = new FieldList(new FormAction('applicationPassword'));
        return new Form($this, "EditForm", $fields, $actions);
    }

    public function applicationPassword($data, Form $form){
        $form->sessionMessage('Correct password. I will redirect you to manage your model', 'success');
        return $this->redirectBack();
    }
}

提交此表单时,操作函数应验证它是否与某些内容相等(在我的情况下,它是从数据库中解密数据的密钥),然后重定向/显示 Gridfield。

第二点是 ModelAdmin,我可以在其中通过 GridField 管理数据(来自该数据库)。

代码如下:

class Applications2 extends ModelAdmin {
    static $url_segment = 'applications2';
    static $menu_title = 'Applications2';

    private static $managed_models = array(
        'SecureFormInput'
    );
}

这是我的问题:有可能做到这一点吗?任何建议/帮助,因为我尝试了一段时间但没有结果。

【问题讨论】:

  • 您尝试实施的是对同一模型管理员的额外保护。只需在 getEditForm() 中使用条件即可返回您的自定义表单或标准 M​​odelAdmin 表单。 ( noPassword ? showPasswordForm : parent:getEditForm )

标签: php backend silverstripe


【解决方案1】:

我发现很难弄清楚你真正想要做什么。

以下是一些我认为可能仍然对您有所帮助的事情:

  1. 您通常不会直接扩展LeftAndMain。 99% 的时间,开发人员都在构建管理屏幕或区域,在其中管理单个或多个模型(DataObject 子类)。
  2. 在您的Applications 类中,您没有$allowed_actions 静态。您需要它至少有一个值:'applicationPassword',以便告诉 SilverStripe 该控制器可以执行哪些合法操作。
  3. 同样,根据您尝试执行的操作,您通常会使用 SilverStripe CMS 的标准权限系统对 CMS 管理区域进行密码保护(请参阅“安全”菜单项)。请注意,您可以在 一些 管理屏幕上授权用户或组。 如果这是您尝试对各种自定义控制器执行的操作,则应确保您的控制器声明了 canView() 方法。有关示例,请再次参阅 LeftAndMain.php
  4. 验证通常在模型级别完成。例如。你有一个 DataObject 子类,你想从 ModelAdmin 中管理它。在这种情况下,您在 DataObject 子类上定义一个名为 validate() 的方法。编辑/创建此模型的新实例时 在您的 ModelAdmin 中,CMS 知道如果在您的模型上找到一个方法,它就会运行您的 validate() 方法。
  5. 当您说“它不起作用”时,我们真的需要知道“以什么方式?”例如您是否看到错误消息,您是否没有看到您应该看到的内容,如果有,等等

如果这些要点都没有帮助,那么真正能帮助其他人帮助你的是,如果你重写你的问题类似这样:

“我正在尝试使用密码保护自定义 CMS 管理屏幕。我有一个模型 MyModel 具有以下类定义(屏幕截图或代码)和一个 ModelAdmin(屏幕截图或代码)。代码应显示密码错误消息是错误的(错误密码是与数据库中的密码不匹配,或不遵循特定格式等)或密码成功消息与数据库条目匹配或确实遵循特定模式或格式。”

祝你好运:-)

【讨论】:

  • 第 2 点对自定义控制器动作有效,而表单动作会自动添加到允许列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2015-07-30
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多