編輯: 好你不必詳細說明你是否可以簡單地擁有一個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及其各自的視圖幫助器類,以獲得功能的一個很好的示例。
我個人喜歡這種方法,如果每個人都在船上,這很棒,但我發現它最終會阻礙有才華的客戶端開發人員,因爲1.他們的視圖中包含這些非本地斑點2.有一個前端當您想要合併一些新的jQuery/Dojo /第三方元素時編寫幫助程序的代價。使用PHP生成HTML/Javascript(這是助手所做的)似乎需要比純粹的基於視圖的方法更多的開發時間。仍然有用的信息,謝謝! – 2010-01-11 22:35:16