簡體   English   中英

如何在Codeigniter的任何地方向URL添加GET參數

[英]How to add GET param to URL everywhere in Codeigniter

我想將參數GET添加到codeigniter中的URL。 例如,參數?lang=en可以檢測網站中的當前語言。 如何在所有頁面上使用此參數?

嘗試這個..

首先,我們需要配置必要的文件,然后才能開始使用語言支持。 位於application/config目錄中的CodeIgniter配置文件包含一個名為language的選項,該選項定義了應用程序的默認語言。

<?php
$config['language'] = 'english';

我們還需要創建包含不同語言消息的實際文件。 這些文件需要放置在application/language目錄中,每種語言都有一個單獨的目錄。 例如,英語文件應位於application/language/english目錄中,而法語文件應位於application/language/french

讓我們創建一些語言文件,其中包含示例應用程序的錯誤消息。 創建文件english / message_lang.php(所有語言文件的后綴_lang.php很重要)。 以下代碼包含一些有關我們語言文件內容的示例條目:

<?php
$lang["msg_first_name"] = "First Name";
$lang["msg_last_name"] = "Last Name";
$lang["msg_dob"] = "Date of Birth";
$lang["msg_address"] = "Address";

當然,您可以在一個語言目錄中包含多個語言文件。 建議您根據消息的上下文和用途將消息分組到不同的文件中,並為消息密鑰添加特定於文件的關鍵字,以確保一致性。

另一種方法是為每個控制器創建單獨的消息文件。 該技術的優勢在於,僅加載所需的消息,而不是整個語言文件,這會造成一定程度的性能開銷。

加載語言文件即使我們創建語言文件,它們也只有在將它們加載到控制器內部后才有效。 以下代碼顯示了如何在控制器內部加載文件:

<?php
class TestLanguage extends CI_Controller
{
    public function __construct() {
        parent::__construct();       
        $this->lang->load("message","english");
    }

    function index() {
        $data["language_msg"] = $this->lang->line("msg_hello_english");
        $this->load->view('language_view', $data);
    }
}

我們通常在控制器和視圖中使用語言文件(在模型內部使用語言文件不是一件好事)。 在這里,我們使用了控制器的構造函數來加載語言文件,以便可以在整個類中使用它,然后在類的index()方法中對其進行引用。

lang->load()方法的第一個參數將是不帶_lang后綴的語言文件名。 第二個參數(可選)是語言目錄。 如果此處未提供,它將指向配置中的默認語言。

我們可以使用lang->line()方法直接引用語言文件的條目,並將其返回值分配給傳遞到視圖模板的數據。 在視圖內部,我們可以將以上語言消息用作$ language_msg。

有時候,我們也需要直接從視圖中加載語言文件。 例如,將語言項用於表單標簽可能被認為是直接在視圖內直接加載和訪問消息的一個很好的理由。 可以對視圖內部的這些文件使用與控制器內部相同的訪問方法。

<?php
$this->lang->line("msg_hello_english");

盡管它可以完美工作,但是當我們的視圖模板代碼不是實際的類時,使用$ this可能會造成混淆。 我們還可以在語言助手的支持下使用以下代碼在視圖內加載語言條目,這使我們的代碼更簡潔。

<?php
lang("msg_view_english");

基本上這就是您開始使用CodeIgniter語言文件所需要知道的全部內容。 但是,即使這很簡單,也不必在每個控制器中加載必要的語言文件,也無需進行重復的工作,尤其是在您的項目包含數百個類的情況下。 幸運的是,我們可以使用CodeIgniter掛鈎構建快速有效的解決方案,以自動為每個控制器加載語言文件。

為掛鈎分配語言加載職責CodeIgniter調用一些內置的掛鈎,作為其執行過程的一部分。 您可以在用戶指南中找到鈎子的完整列表。 我們將使用post_controller_constructor鈎子,該鈎子在實例化控制器之后且在任何其他方法調用之前立即被調用。

通過在主配置文件中設置enable_hooks參數,可以在應用程序中啟用掛鈎。

<?php
$config['enable_hooks'] = TRUE;

然后,我們可以打開config目錄中的hooks.php文件,並創建一個自定義鈎子,如以下代碼所示:

<?php
$hook['post_controller_constructor'] = array(
    'class' => 'LanguageLoader',
    'function' => 'initialize',
    'filename' => 'LanguageLoader.php',
    'filepath' => 'hooks'
);

這定義了鈎子,並提供了執行鈎子所需的信息。 實際的實現將在application / hooks目錄內的自定義類中創建。

<?php
class LanguageLoader
{
    function initialize() {
        $ci =& get_instance();
        $ci->load->helper('language');
        $ci->lang->load('message','english');
    }
}

在這里,我們無法使用$this->lang來訪問語言庫,因此我們需要使用get_instance()函數獲取CI對象實例,然后像之前一樣加載語言。 現在,該語言文件可用於我們應用程序的每個控制器,而無需在控制器內部手動加載它。

在不同語言之間切換

一旦我們建立了對多種語言的支持,通常可以在我們應用程序的菜單之一中向用戶提供每種語言的鏈接,用戶可以單擊並切換語言。 會話或cookie值可用於跟蹤活動語言。

讓我們看看如何使用我們之前生成的鈎子類來管理語言切換。 首先,我們需要創建一個類來切換語言。 我們將為此使用單獨的控制器,如下所示:

<?php
class LangSwitch extends CI_Controller
{
    public function __construct() {
        parent::__construct();
        $this->load->helper('url');
    }

    function switchLanguage($language = "") {
        $language = ($language != "") ? $language : "english";
        $this->session->set_userdata('site_lang', $language);
        redirect(base_url());
    }
}

然后,我們需要定義鏈接以切換每種可用語言。

<a href='<?php echo $base_url; ?>langswitch/switchLanguage/english'>English</a>
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/french'>French</a>

每當用戶選擇特定語言時,LangSwitch類的switchLanguage()方法都會將所選語言分配給會話,並將用戶重定向到主頁。

現在,活動語言將在會話中更改,但是在我們為活動語言加載特定語言文件之前,它不會受到影響。 我們還需要修改鈎子類以從會話中動態加載語言。

<?php
class LanguageLoader
{
    function initialize() {
        $ci =& get_instance();
        $ci->load->helper('language');

        $site_lang = $ci->session->userdata('site_lang');
        if ($site_lang) {
            $ci->lang->load('message',$ci->session->userdata('site_lang'));
        } else {
            $ci->lang->load('message','english');
        }
    }
}

在LanguageLoader類中,我們獲取活動語言並加載必要的語言文件,或者如果缺少會話密鑰,則加載默認語言。 我們可以在此類中加載單一語言的多個語言文件。

參考: http : //www.sitepoint.com/multi-language-support-in-codeigniter/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM