防止在 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);
}
}
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);
}
}