我正在尝试对一个字符串进行 html 编码,该字符串将用作谷歌地图中的工具提示。
$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 中不起作用。
- 我甚至需要对将呈现给浏览器的javascript字符串数据进行html编码吗?
- 如何让 CHtml::encode 在 heredoc 中工作?
- 您确实需要对数据进行编码,但不需要使用
CHtml::encode
。你必须使用CJSON::encode
或CJavaScript::encode
(任何一个都可以),因为你正在将值注入到JavaScript中,而不是HTML中。 - 你不能让它工作。只需事先计算您需要的值,将其存储在变量中并注入变量的内容即可。
所以例如:
$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
);
这不是插值的正确用例,请参阅此 http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex。只需在之前编码模型名称,然后在title:"$encodedName"
中插入,1行不是很大的内存消耗:)