2012-09-27 31 views
0

我想HTML編碼將用作谷歌地圖工具提示的字符串。在Yii中使用PHP heredoc函數調用的返回值?

$cs = Yii::app()->getClientScript(); 
$cs->registerScript('someID', <<<EOD 
    function mapsetup() { 
     //...   
     var marker = new google.maps.Marker({ 
      position: myLatlng, 
      map: map, 
      // works: 
      title: '$model->name' 
      // doesn't work: 
      title: '{${CHtml::encode($model->name)}}' 
      }); 
     // ... 
    } 
    mapsetup(); 
EOD 
, CClientScript::POS_LOAD 
); 

如果我用線title: '$model->name',它會導致以下擴展:

title: 'Some Name' 

如果我改用線title: '{${CHtml::encode($model->name)}}',它會導致以下擴展:

title: '' 

CHtml::encode在同一頁面的其他地方工作正常,但它似乎並沒有在PHP heredoc中工作。

  1. 我甚至需要將HTML編碼的javascript字符串數據呈現給瀏覽器嗎?
  2. 如何獲得CHtml :: encode在heredoc中工作?

回答

1
  1. 你需要對數據進行編碼,但與CHtml::encode。您必須改用CJSON::encodeCJavaScript::encode(任何人都會這樣做),因爲您正在向JavaScript注入值,而不是HTML。
  2. 你不能得到它的工作。只需事先計算您需要的值,將其存儲在變量中,然後注入變量的內容。

因此,例如:

$title = CJSON::encode($model->name); 
$cs = Yii::app()->getClientScript(); 
$cs->registerScript('someID', <<<EOD 
    function mapsetup() { 
     //...   
     var marker = new google.maps.Marker({ 
      position: myLatlng, 
      map: map, 
      title: $title // no quotes! CJSON::encode added them already 
      }); 
     // ... 
    } 
    mapsetup(); 
EOD 
, CClientScript::POS_LOAD 
); 
1

這不是正確的插值用法,請參閱此http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex。 之前剛剛編碼的型號名稱,然後在title:"$encodedName"插入,1排是不是一個大的內存使用:)

+0

關於變量在前面的語句只是編碼名字好一點。 – User

+0

我之前讀過參考文獻,好像可以調用函數,例如'echo「這是通過getName()的返回值命名的var的值:{$ {getName()}}」;'I不知道問題是否在我的情況下,我的函數有一個參數,我需要在調用函數之前展開函數參數。 – User

+0

是的,這是因爲CHtml :: method使用輸入參數,這就是爲什麼插值是錯誤的。所以之前只需將其轉義出來,如果需要的話,它會自動從js中逃脫出來。 (不確定只是看到registerScript的更多信息)。 – Elkan

相關問題