防止在 silverstripe 中全部发布

Prevent publish all in silverstripe

Silverstripe 能够让用户在 /admin/pages/publishall 可用的站点上发布所有页面,并且发布所有代码在 /cms/code/controllers/CMSMain.php

我们遇到了一些问题,用户不小心 运行在生产环境中发布了所有内容,而它应该只在其他环境中 运行 - 如何禁用 publishall 功能?

我解决这个问题的第一个方法是创建一个自定义 CMSPageController.php,我将在其中覆盖 publishall,然后在 if 块中调用 parent::publishall($request) 检查哪个环境我们进去了。这种方法的问题是注入自定义 class 会导致编辑页面出现问题。理想情况下,我本来可以扩展 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);
    }

}