CakePHP - 为站点创建离线/在线功能

时间:2011-06-14 20:23:03

标签: cakephp

======================================== 编辑 ====================================

根据查尔斯的建议,我使用以下代码完成了离线/在线功能,基于查尔斯代码:

<?php

      Class AppController extends Controller{

          // prevents unauthorized access
          public $components = array('Auth');

          // the name of the model storing site_offline boolean
          public $uses = array('Configuration');

          // callback invoked before every controller action
          public function beforeFilter() {

              // returns your site_offline status assuming 0 is offline
              if ($this->Configuration->get_site_status() == 1) {
                   $this->Auth->allow('*');
              }else {
                   if(($this->Configuration->get_site_status() == 0) and (!$this->Auth->user() == null)){
                       // I set it up like this for now to allow access to any authenticated user, 
                       //but later will change it to only allow admins access thru a login form
                       $this->Auth->allow('*');
                   }else{ 
                       //If site is offline and user is not authenticated, sent them to 
                       // the a screen using the OFFLINE layout and provide a screen for login.
                       $this->layout = 'offline';  
                       $this->setFlash('Maintenance Mode. Check back shortly.');
                       $this->Auth->deny('*');
                   }
              }

          }

       }
 ?>

然后我使用jQuery来隐藏我的登录表单。管理员单击该消息以显示登录表单。这是一种阻止任何登录试用的尝试。

============================ END EDIT ================= =========================

我想知道在CakePHP中创建“站点离线/在线”功能的最佳方法是什么。基本上,我想允许管理员关闭对所有注册的网站的访问权限。离线页面应具有登录访问权限,只有管理员才能登录。

我的想法是创建某种仪表板控制器,只要管理员登录,他/她就会被重定向到此仪表板,从那里他可以访问其他控制器操作(admin_edit等)。此仪表板和所有管理操作(admin_delete等)应使用管理布局。

这是一个好方法吗?对于离线/在线功能,我应该创建一个设置表,其中包含可以打开或关闭的site_offline字段吗?在允许或不访问网站之前,app_controller中应该使用哪些代码来检查它?

非常感谢你的帮助,

2 个答案:

答案 0 :(得分:3)

首先在 core.config

中添加配置
/*
 * This is the site maintenance 
 *   The built in defaults are:
 *
 * - '1' - Site works
 * - '0' - site down for maintenance.
 */

Configure::write('Site.status', 1);

AppController 中,您将在 beforeRender 功能

中查看它
if (Configure::read('Site.status') == 0) {
            $this->layout = 'maintenance';
            $this->set('title_for_layout', __('Site_down_for_maintenance_title'));
        } else {
// do something
}

我在这里加载一个单独的布局形式维护,让我添加我想要的任何布局

答案 1 :(得分:1)

如果要在数据库表中保存site_offline布尔值,您应该可以使用AppController和Auth组件中的回调轻松完成此操作。

<?php

AppController extends Object {

    // prevents unauthorized access
    public $components = array('Auth');

    // the name of the model storing site_offline boolean
    public $uses = array('NameOfModel');

    // callback invoked before every controller action
    public function beforeFilter() {

        // returns your site_offline status assuming 0 is offline
        if ($this->NameOfModel->get_status() === 0) {
             $this->Auth->deny('*');
        } else {
             $this->Auth->allow('*');
        }

    }

}

我一直很喜欢DashboardsController的管理功能。这实际上是我使用的类的确切名称和相同的一般想法。