2009-09-22 52 views
0

我正在使用MVC設置,我試圖注入JavaScript到我的意見(.php),但允許JavaScript訪問所有的視圖有權訪問的變量至。我的最終目標是能夠從我的JavaScript訪問PHP變量(例如,所以我可以alert()產品的名稱)。問題與使用要求內功能和變量範圍

這裏是我的申請流程:

  1. 開始輸出緩衝
  2. 呼叫提取物()相聯繫的數組上(這包含的數據對我的看法)
  3. 呼叫需要在視圖文件
  4. 返回輸出緩衝區的內容,並清除緩衝區
  5. 回顯緩衝區

我有一個函數injectJS(),主要內容如下:

function injectJS($jsFile) { 
require APP_DIR . $jsFile; 
} 

下面是使用Javascript(alert.js)的示例中,我要注入:

<script type="text/javascript"> 
    alert("product name: <?php echo $product['name']; ?>"); 
</script> 

所以,我認爲文件中,我打電話給injectJS('alert.js');。它注入了javascript,但是當我渲染視圖時,我得到了一個PHP通知,其中有一個未定義的變量$product。但是,如果我手寫require聲明,一切正常。我試圖通過使用injectJS()來實現嗎?

編輯
我忘了提,我也嘗試明確傳遞變量injectJS(),和它的工作,但我不希望有永遠傳遞變量。如果視圖需要將許多變量傳遞給JS,它可能會變得混亂&繁瑣。有沒有一種方法可以(在函數內)獲取腳本範圍內的變量,負責調用injectJS()

編輯2
關於第二個想法,傳遞變量又是一個現實的問題,我想我只是貪婪/懶惰)。我會在需要時將這些變量傳遞給injectJS()。感謝您的答覆

+0

難道你不能傳遞一個包含$ products的所有東西的大數組嗎?或者你認爲這仍然是一團糟? – 2009-09-22 04:07:54

回答

2

通行證$產品給你的函數,這將是在函數體中可見,或內部定義它:

function globalJs($filename, $product) { 
    include $filename; 
} 

globalJs('foo.js', array('name' => 'test')); 
2

在PHP中,變量是不可見的內部功能,除非作爲參數傳遞,或宣佈爲global

您似乎遇到的問題是$ product變量不存在於injectJS函數中;如果它就是這樣的功能之外創建一個全局變量,你要麼把它作爲一個參數,或在函數的開頭聲明它作爲全球:

function injectJS($jsFile) { 
    global $product; 
    require APP_DIR . $jsFile; 
} 

欲瞭解更多信息,你可以去看看部分Variable scope在手冊,更具體地說,小節約The global keyword

1

這將工作得很好,但您的範圍問題是由於您的函數中不存在的變量。試試這個:

function injectJS($jsFile) { 
    $product = array('name' => 'test'); 
    require APP_DIR . $jsFile; 
} 

在某些時候你必須在函數的作用域中定義變量。如果變量全局存在,PHP global關鍵字將允許您執行此操作。儘管如此,儘量避免使用全局變量,因爲這會導致問題出現。