2013-10-11 97 views
1

所以,我試圖建立一個基於我自己的類似MVC的PHP模型的網站。MVC模型中的外部CSS和JS文件

讓我們說,每一個視圖由至少2份:

讓那些是「的template.php」和「mypage.php」(第二部分取決於具體的頁上,所述第一部分是常見的) 。

的template.php具有下面的代碼(以簡化版本):

<html> 
<title>Sometitle</title> 
<link rel='stylesheet' href='/css/gen.css' type='text/css' /> 
<script type='text/javascript' src='/js/gen.js'></script> 
<?php echo $other_external_files; ?> 
</head> 
<body> 
<div class="some_header_and other stuff">...</div> 
<div class="workfield"> 
<?php include_once mypage.php; ?> 
</div> 
</body> 
</html> 

那mypage.php'(以及一些其他頁面)具有某些特定的CSS和.js問題應該包含的文件。

問題是:哪些是包含這些文件(如何和在哪裏)的最佳選擇?

這裏是我的想法:

  1. 我可以在模型中定義或控制變量$other_external_files,但真的不希望這樣做,因爲.css文件通常是視圖的一部分我可以在'mypage.php'中對它進行硬編碼,只要它不需要保留在<head>

  2. 我知道.css和.js文件可以動態地包含在JavaScript中,但是如果沒有強大的需求,我想避免使用這種解決方案。

  3. 我可以在相應的模型中定義所有這些變量。這裏的問題是,從一開始我一直試圖根據內容構建我的模型(因此,我有通用模型(文件和類),如'用戶','Shop_items'等,不一定對應每個視圖文件(這意味着我基本上沒有任何mypage_model.php,只是'items_model','users_model'等)。在模型中定義頁面的標題將迫使我添加大量的模型文件。

  4. 我可能自動定義的核心觀點類變量$other_external_files,就像這樣:

-

function __construct($action){ 
$this->action = $action.'.php'; 
$this->css_file = 'css/'.$action.'.css'; 
} 

function generate($view_lvl, $data = null){ 
$other_external_files = $this->css_file; 
require_once $action; 
} 

但是,這種方法似乎是有限的,因爲可能會出現這種情況,當我想要包含名稱完全不同的多個文件時。

我個人的選擇,現在是第三,因爲它不僅允許添加CSS和JS,也容易定義文檔和其他可能的變量冠軍......但我相乘文件之前,我如果它真的是正確的方式,那麼你喜歡諮詢有經驗的程序員。

非常感謝,很抱歉有很長的問題。很感謝任何形式的幫助!

+1

我會存儲文件以包含在每頁基於數據庫,幷包括他們取決於你在哪個頁面上。即讓CSS包含js包括等...並循環遍歷需要包含的文件,併爲每個頁面執行此操作。這樣每個頁面可以在每頁基礎上具有不同的/多個js或css。 – Bryan

+0

所以,你建議在db **中存儲類似** pairs_page_id => corresponding_external_files的東西?那麼,要走的路..但是,如果我有內聯的CSS/JS,那麼我可以簡單地寫在view.html文件中...在你的情況下,我開始依靠DB來完成這樣一個基本的任務。 –

+0

噢,每次我必須啓動一個新的.css文件時,我應該將它添加到數據庫中,並使用相應的路徑和ID?似乎有點煩人。或者這是一種常見的做法?你的方法也意味着**我將不得不連接到數據庫並且甚至在完全靜態的html頁面上進行查詢**,比如帶有外部.css的錯誤頁面? –

回答

3

我通常不會去做這種編隊。經驗證明,如果我將每個視圖/頁面作爲單個文件分開,它就會更有用。我總是將你的策略用於他們更喜歡模板的頁面,當涉及到頁面的獨特屬性(如標題)時,我會嚴格控制,以免混淆。例如,我從一個地方獲得這些屬性,如數據庫表pages

對於像JavaScript或CSS文件這樣的資源,我將它們完全包含在每個視圖中的正常頁面中。我認爲最好不要將它們填充到像$other_external_files;這樣的變量中,而是將它們以不同的方式放在每個分隔視圖中。

例如,這是我about.php觀點:

<html> 
<head> 
<title>About</title> 
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra.css' type='text/css' /> 
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra2.css' type='text/css' /> 
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra.js'></script> 
</head> 
<body> 
</body> 
</html> 

這是我contact.php觀點:

<html> 
<head> 
<title>Contact</title> 
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra3.css' type='text/css' /> 
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra.js'></script> 
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra2.js'></script> 
</head> 
<body> 
</body> 
</html> 

對於我非常動態頁面:

<html> 
<head> 
<title><?php echo $TITLE; ?></title> 
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra3.css' type='text/css' /> 
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra.js'></script> 
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra2.js'></script> 
</head> 
<body> 
</body> 
</html> 

如果你看看在我的動態頁面中,您會看到我將實際數據傳遞給它。這意味着我從我的控制器獲取相關數據,然後通過它。