Php 防止在silverstripe中发布所有

Php 防止在silverstripe中发布所有,php,silverstripe,Php,Silverstripe,Silverstripe允许用户在/admin/pages/publishall上发布网站上的所有页面,发布所有代码位于/cms/code/controllers/CMSMain.php中 我们遇到了一些问题,用户在生产环境中意外运行publish all,而它本应仅在其他环境中运行-我如何禁用publishall功能?我解决这一问题的第一个方法是创建一个自定义的CMSPageController.php,在其中我将覆盖publishall,只需在if块中调用parent::publishall

Silverstripe允许用户在/admin/pages/publishall上发布网站上的所有页面,发布所有代码位于/cms/code/controllers/CMSMain.php中


我们遇到了一些问题,用户在生产环境中意外运行publish all,而它本应仅在其他环境中运行-我如何禁用publishall功能?

我解决这一问题的第一个方法是创建一个自定义的CMSPageController.php,在其中我将覆盖publishall,只需在if块中调用parent::publishall($request),检查我们所处的环境。这种方法的问题是,注入自定义类会在编辑页面时产生问题。理想情况下,我可以只扩展publishall,但正如Nunser上面提到的,Silverstripe(令人沮丧的)没有在该方法中包含扩展挂钩

我最终创建了一个自定义路由来覆盖admin/pages/publishall

所以在mysite/_config/routes.yml中

'admin/pages/publishall': CustomPublishallController
在mysite/code/controllers/CustomPublishallController.php中

<?php

/**
 * Controller for providing silverstripes inbuilt publishall functionality with the ability to
 * run in production removed.
 *
 * @package  sitename
 * @subpackage mysite
 */
class CustomPublishallController extends Controller {

    public function index($request){

        $cmsMain = new CMSMain();

        if(ENVIRONMENT_CONSTANT != 'prod'){
            return $cmsMain->publishall($request);
        }
        return Security::permissionFailure($this);
    }

}

他们是否“意外”按下了“确认”按钮?用户,对吗?你正在运行什么版本的ss?因为我没有看到任何用于扩展该函数的钩子,也没有任何对dev env的检查,所以除非修改代码(不要这样做),否则可能无法禁用该功能。它会检查管理员权限tho,因此您可以创建一个新角色,为其他用户设置几乎所有的权限,只要不给他们管理员权限,就可以了。问题是,一个管理员用户在生产环境中运行publishall时,认为他们在开发环境中。