2012-01-31 55 views
1

我正在開發一個使用codeigniter的web應用程序,我想動態生成一個CSS和一個JS文件。Codeigniter - php到js和/ css

我的意思是,根據用戶在網站上使用哪個模塊,它應該包含不同的CSS和JS文件。像這樣的CSS:

foreach($modules as $module){ 
    include('path/to/module/css'); 
} 

我將保存這個名爲「模塊」類中和「()get_css」調用的函數內。所以codeigniter鏈接將是:http://somesite.com/modules/get_css

但我想服務器認爲這是一個CSS文件,我也想它不在我的應用程序(即:應用程序/控制器),因爲這可能是一個安全威脅。而是在根目錄中。

我想我必須做一些事情與htaccess,也許創建另一個文件,從該頁面獲取內容?實際上我不知道該怎麼做,或者如果這是正確的方法。

感謝您的幫助。

+1

我認爲創建*鏈接*到靜態(但現有的)CSS文件會容易得多。如果你處理的不止是幾行Javascript,你最好將它們分開並鏈接到它們。 (動態生成的JS可能是一個難以調試的問題) – Tim 2012-01-31 17:56:30

+0

但是用戶平均在一個頁面上有10個以上的模塊,所以我需要在每個頁面上爲模塊包含10個不同的CSS和10個不同的Js腳本。這將是20個腳本,這將減慢我的網站,不是嗎?謝謝您的幫助。 – denislexic 2012-01-31 18:07:09

+0

他們是否放慢你的網站取決於他們有多大......我很少看到一個CSS文件經過幾個kb,如果你使用像jQuery這樣的Javascript庫,你可能會削減你的腳本。 在我使用經典ASP的時候,我做了很多動態JS,並且我記得調試和維護時非常頭痛。 (雖然有次我們沒有選擇) – Tim 2012-01-31 18:48:51

回答

3

你可以讓你的get_css()方法檢索CSS文件的內容,將它們合併在一起,然後輸出一個緩存的 CSS文件到磁盤。使用散列命名文件會很有幫助,因此您只能爲每個獨特的模塊組合生成合並的CSS文件。所以,你會合並所有文件的內容,並將它命名爲:

$output_filename = md5($module_a_name . $module_b_name ...) . '.css' ; 

if (! file_exists($output_filename) { 
    //generate merged CSS file 
} 

// Call back to your template layer to include $output_file in the page header 

通過檢查該文件在服務器上已經存在,可以防止生成文件的重複工作,然後簡單地輸出樣式包含在您的模板中指向生成的文件。不需要.htaccess更改,只需讓文件以與其他靜態內容相同的方式提供即可。

我絕不是一個安全專家,但只要PHP被配置爲寫這些文件沒有一個不可執行的目錄,並且你不使用用戶輸入來抓取源CSS文件,你應該沒問題。更新源CSS文件時,您還需要清除緩存的CSS文件。