2

プロジェクトでプリコントローラーフック codeigniter を使用しています

説明: サブドメインの概念と 3 つのテンプレート (テーマ) を使用しています。例: 私のサイトは xyz.com です。これには最初のテンプレートが 1 つあります。

この xyz サイトでのビジネス サインアップ。たとえば。abc(ビジネス)。abc.xyz.com を作成します。abc は 2 つのテンプレートを選択します。ブラウザの abc.xyz.com は、2 番目のテンプレートを表示する必要があります。2 番目のテンプレートが表示されていません。最初のテンプレートのみを表示しています。

サイト上の任意のリンクを複数回クリックすると、テンプレート 2 が abc.xyz.com リンクに設定されます。

コードイグナイターを使用しています。ロードされたセッション、自動ロード ファイル内のデータベース。

プリコントローラーフックを使用して、URL が xyz かサブドメイン abc.xyz.com かを確認しました。URL がサブドメイン 1 の場合、フックでテンプレートを設定しています。

ただし、abc.xyz.com がブラウザーにある場合、テンプレートは表示されません。いくつかのクリックの URL を更新するか、ヘッダー リンクのいずれかをクリックすると、ビジネス abc の実際のテンプレートが表示されます。

この問題を解決するか、解決策を教えてください。

<?php
class Subdomain_check extends CI_Controller{
public function __construct(){
    parent::__construct();
    $this->CI =& get_instance();

    if (!isset($this->CI->session))
    {
    $this->CI->load->library('session');
    }

}
function checking()
{

$subdomain_arr = explode('.', $_SERVER['HTTP_HOST']); //creates the various parts

if($subdomain_arr[0] == 'www')
{
    $subdomain_name = $subdomain_arr[1]; //2ND Part            
}
else
{
    $subdomain_name = $subdomain_arr[0]; // FIRST Part                      
}        

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");   
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache"); 

if( $subdomain_name != 'xyz' )
{
    $where = array();
    $where['subdomain_name'] = $subdomain_name;
    $where['status'] = 1;
    $this->db->from('subdomain_map');
    $this->db->where($where); 
    $query = $this->db->get();         
    if($query->num_rows() < 1)
    {
    header('Location:http://xyz.com/index.php?/error');
    }   
    else
    {
    $result = $query->row_array();
    $this->CI->session->set_userdata('subdomain_id',$result['subdomain_id']);
    $this->CI->session->set_userdata('subdomain_name',$result['subdomain_name']);
    $org_id = gat_organisationid_using_subdomainid($result['subdomain_id']);
    $this->CI->session->set_userdata('organisation_id', $org_id);

    if($org_id)
    {
    $templ_id = get_templid_using_organisationid($org_id);
    $org_logo = get_organisation_logo($org_id);
    }  

    if($templ_id){
    if($this->session->userdata('pinlogin'))
    $this->CI->session->set_userdata('template_set', 4);
    else
    $this->CI->session->set_userdata('template_set', $templ_id);               
    }

    if($org_logo)
    $this->CI->session->set_userdata('org_logo', $org_logo);              
    }           
}
else
{
    $this->CI->session->unset_userdata('subdomain_id');
    $this->CI->session->unset_userdata('subdomain_name');
    if( $this->CI->session->userdata('user_id') && $this->CI->session->userdata('user_category')<=2 )
    {
    $this->CI->session->unset_userdata('organisation_id');
    $this->CI->session->unset_userdata('org_logo');
    }
}    
}

}

4

1 に答える 1

0

サブドメインごとのカスタム テーマをサポートするために必要な基本的なチェックは次のとおりです。

// Gets the current subdomain
$url = 'http://' . $_SERVER['HTTP_HOST'];
$parsedUrl = parse_url($url);
$host = explode('.', $parsedUrl['host']);

// store $host[0], which will contain subdomain or sitename if no subdomain exists
$subdomain = $host[0];   

// check for subdomain
if ($subdomain !== 'localhost' OR $subdomain !== 'mysite')
{
    // there is a subdomain, lets check that its valid
    // simplified get_where using activerecord
    $query = $this->db->get_where('subdomain_map', array('subdomain_name' => $subdomain, 'status' => 1));

    // num_rows will return 1 if there was a valid subdomain selected
    $valid = $query->num_rows() === 1 ? true : false;

    if($valid)
    {
         // set theme, user_data, etc. for subdomain.
    }
    else
    {
        // get user out of here with redirect
        header('Location: http://' . $_SERVER['HTTP_HOST'] . '/error');
        exit();
    }
}

サブドメインを codeigniter で使用する場合は、config > base_url を次のように設定する必要があることに注意してください。

$config['base_url'] = 'http://' . $_SERVER['HTTP_HOST'] . '/poasty/poasty-starterkit/';

これにより、site_url() やその他の CI ヘルパーが引き続き機能することが保証されます。

コードを読んで、Codeigniters の組み込み機能をさらに活用することをお勧めします。たとえば、__construct関数には不要なコードがたくさんあります。

元のコード

public function __construct(){
    parent::__construct();

    /**
    * CI already exists 
    * since this controller extends CI_controller, there is already and instance of CI available as $this.
    $this->CI =& get_instance();
    */

    /**
    * duplicate check, CI checks if library is loaded
    * and will ignore if loaded already
    if (!isset($this->CI->session))
    {
        $this->CI->load->library('session');
    }
    */

    $this->CI->load->library('session');

}

コードイグナイター用に最適化

public function __construct()
{
    parent::__construct();
    $this->CI->load->library('session');
}

codeigniter ができることをよりよく理解するために、Codeigniter user_guide を読むことをお勧めします。@see http://codeigniter.com/user_guide/

これがお役に立てば幸いです。

于 2012-10-24T01:05:46.600 に答える