2010-01-11 43 views
3

大多數PHP MVC系統遵循一種模式,其中請求被路由到特定的控制器動作,然後控制器設置一堆變量供視圖使用。PHP MVC:在哪裏放置動態生成的Javascript

當你在使用了大量的UI元素的動態HTML的代理/服務的工作環境是,這種模式導致與視圖變量

<script type="text/javascript"> 
    jQuery(document).ready(function(){ 
     $('#ui-element).init(
      { 
       'param1':<?=$this->param1;?>, 
       'param2':<?=$this->param2;?>,     
      } 
     ); 
    }); 
</script> 

雖然這個作品產生了很多的javascript,我發現它帶來了HTML,PHP和Javascript可怕的意大利麪混合的觀點。它也冒犯了某些認爲所有javascript應該包含在外部文件中的前端開發人員。

那麼,你的模式/做法是什麼來解決這個問題?具體而言,當您想爲PHP MVC框架中的Javascript小部件提供默認數據集時,您如何在保持事物清潔和模塊化的同時做到這一點?難道僅僅是一門學科的事,或有沒有具體的設計模式,可以強制模塊化**這裏,同時還讓有才華的客戶端開發人員標記爲中心的環境中工作

回答

3

編輯: 好你不必詳細說明你是否可以簡單地擁有一個php類/函數,它只是代理ob_start/ob_get_clean,然後將js存儲在某個地方,然後在其他地方輸出js。你沒有一定要支持或通過整合PHP庫的功能...

如果可能的財產以後就這麼簡單的東西像下面這樣:

class UnobtrusiveJsHelper { 
    protected static $_instance; 
    protected $_js = array(); 
    protected $_ready = array(); 

    public static function getInstance() 
    { 
    } 

    public static function setInstance(UnobtrusiveJsHelper $instance) 
    { 
    } 

    public function captureStart($key = null) 
    { 
    if(null !== $key) 
    { 
     $this->_js[$key] = null; 
    } 
    ob_start(); 
    } 

    public function captureEnd($key = null) 
    { 
    if(null !== $key) 
    { 
     $this->_js[$key] = ob_get_clean(); 
     return; 
    } 
    $this->_js[] = ob_get_clean(); 

    public function __toString() 
    { 
     return $this->dumpJs() . $this->_dumpReady(); 
    } 

    public function dumpJs(array $attributes = null) 
    { 
     if(!empty($this->_js)) 
     { 
     return "<script type=\"text/javascript\">". implode("\n", $this->_js) . "</script>"; 
     } 

     return null; 
    } 

    public function dumpReady(array $attributes = null) 
    { 
     if(!empty($this->_js)) 
     { 
     return '<script type="text/javascript">$(document).ready(function(){'. implode("\n", $this->_js) . '});</script>'; 
     } 

     return null; 
    } 

} 

,然後在你的控制器:$js = UnobtrusiveJsHelper::getInstance();

,並在您的視圖:

<?php $js->captureStart(); ?> 
    var myjsvariable = 0; 
<?php $js->captureEnd(); 

,並在佈局(assumign兩步這裏查看): <?php echo isset($js) ? $js : null ?>


這就是你使用幫手的地方。例如在Zend_Framework中,所有這些小小的onLoad/Ready片段都被添加到堆棧中。然後,他們都立即在頭部的一個地方輸出。

我有一個特殊的助手,我使用jQ在Symfony下做了類似的操作。

這些讓喜歡的東西$jq->setVar('myjsvar', 1);然後當我傾倒這個我得到這樣的:在頭一個腳本標籤

var myjsvar = 1;

查看ZendX_Jquery和Zend_Dojo及其各自的視圖幫助器類,以獲得功能的一個很好的示例。

+0

我個人喜歡這種方法,如果每個人都在船上,這很棒,但我發現它最終會阻礙有才華的客戶端開發人員,因爲1.他們的視圖中包含這些非本地斑點2.有一個前端當您想要合併一些新的jQuery/Dojo /第三方元素時編寫幫助程序的代價。使用PHP生成HTML/Javascript(這是助手所做的)似乎需要比純粹的基於視圖的方法更多的開發時間。仍然有用的信息,謝謝! – 2010-01-11 22:35:16

0

很多討論都是關於最佳實踐的。老實說,如果< 100行,恕我直言,你在做什麼很好。不同的方法會只是爲了打電話從視圖功能,並有JS作爲單獨的文件,像這樣(在適當的默認值):

<script src='/js/widgets.js'></script> 

<script type="text/javascript"> 
    jQuery(document).ready(function(){ 
     showSomeWidget(<?=$this->name ?> , <?=$this->place ?>); 
    } 
</script> 

你也可以使用一些jQuery的模板插件,像道場,但往往我發現比它的價值更麻煩。