1

我有一個控制器以下代碼:如何最好地保持我的控制器視圖不可知?

$this->viewdata->scripts = array(
    'http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js', 
    'jstree/jquery.jstree-1.0-rc2.js', 
    'jquery.hotkeys-0.8.js', 
    'tags/index.js' 
); 

$this->viewdata->styles = array(
    'reset.css', 
    'tags.css' 
); 

我認爲我有foreach到每個列出的javascript/CSS文件的包裝到相應的HTML標籤。我正在使用主模板/佈局方法;我只填充主模板中的任何/所有字段,然後結束我的網頁。所以,對我來說,在控制器中設置我的javascript/css是很好的,這樣我的<script><link>就可以在他們所屬的<head>中。

然而,最近我恍然大悟了JavaScript和CSS不要在控制器屬於因爲這是渲染的觀點如有更改,並且可能有非常不同的JavaScript/CSS的要求。

我基本上要保持只有一個主模板可維護性而且還刪除所有與從控制器查看/的JavaScript/CSS。有什麼可以幫助我做到這一點?

謝謝。

回答

2

我不使用CI,但我經常使用Zend和Symfony。在這兩個框架中,都可以從視圖中調用某種資產助手來將CSS或js文件添加到堆棧中。然後,您可以撥打類似的助手來輸出這些文件。例如在symfony中:

查看:

<?php use_stylesheet('/css/mycss.css'); ?> 
<?php use_stylesheet('/css/components.css'); ?> 
<?php use_javascript('/js/site.js'); ?> 

佈局:

<head> 
    <?php include_javascripts(); ?> 
    <?php include_stylesheets(); ?> 
</head> 

我認爲這樣的事情會相對容易CI實現如果沒有呈現開箱.. 。

0

您的項目或團隊實際上是否足夠大,讓SoC成爲關注點?或者至少,值得問這個問題並等待答案的時間?你期望你的觀點和CSS/JS文件稍後改變嗎?

如果你的回答這些是肯定的,這是值得修改您的設計,那麼你可以讓你的意見包括CSS和JS自己。將會有很多共同之處,因此請製作只包含常用css和js文件的視圖,並將該視圖文件包含在其他視圖中。這裏你不需要任何複雜的東西。或者至少,我不會。

1

我有一個項目,我做同樣的事情,儘管不那麼雄辯。我認爲我會通過「動態」加載js和css來減少發送給客戶端的信息量。我使用控制器在我的視圖中定義文件名和循環的數組,以包含它們。

我記得只有一個js文件我最終沒有包括所有的時間。

你必須決定哪些你認爲比其他的更下面。

  1. JS/CSS不要在控制器
  2. PHP不視圖

這是你必須通過剛剛找到自己的方式凌亂的決定屬於歸屬。

1

我意識到你可能沒有使用CakePHP從代碼示例,但!他們有一個很好的方法來處理這個問題。它是「內聯」樣式,腳本等參數...

在你的標籤,你有什麼事情,如:

<?= $scripts_for_layout ?> 
<?= $styles_for_layout ?> 

並在視圖文件本身,你有這樣的代碼:

<?php $this->Html->script('jquery', array('inline' => true)); ?> 

因此,實際的視圖文件呈現,將所有腳本存儲到某個數組的某處,然後呈現佈局文件(頁眉,頁腳,你有什麼)。

佈局文件將存儲並呈現的數組放入$ scripts_for_layout變量中。

漂亮的天才和偉大的作品。我建議做這樣的事情。

參考:http://book.cakephp.org/view/1589/script

+0

我沒有這樣做,但原理是一樣的 - 謝謝! – Matthew 2011-04-13 15:11:57

0

你有你希望你所有的全局腳本和樣式位於一個控制器內正確的方法。並且您認爲您希望能夠將特定腳本和樣式包含到特定頁面的靈活性處於正確的道路上。

要實現這一點,您可以創建一個基礎控制器和擴展控制器。您的基礎控制器將包含您的全部腳本和樣式。您的擴展控制器將包含僅針對特定頁面(或一組頁面)的腳本和樣式。

退房創造一個基本的控制器以下鏈接:
http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

注意,在CI2該基地控制器應設在/應用/核心/目錄。

相關問題