2012-06-15 59 views
0

通过考虑下面的代码剪断:混合php和javascript - 我们应该在这里使用json吗?

if('<?= Yii::app()->controller->action->id?>' == 'create'){ 
$("#Event_name").focusout(function(){ 
    $.ajax({ 
    success: function(html) 
    { 
    type: 'get', 
    url: '<?php echo $this->createUrl('related'); ?>' 

这工作。但... 这是一个正确的方法吗?我宁愿在一边使用php,而在另一边使用JavaScript,这是否合理?

有人可以请我提供一个例子,说明如何做到这一点看起来像正确完成?

回答

1

我并不适合您使用的是框架经历,但它是更好,如果你通过来自控制器的变量视图:

控制器:

... 
$action_id = Yii::app()->controller->action->id; 
$created_url = $this->createUrl('related'); //$this might not be in context here 

$this->render('your_view_name', array('action_id'=>$action_id, 'created_url'=>$created_url)); 
... 

查看:

if('<?= $action_id ?>' == 'create'){ 
$("#Event_name").focusout(function(){ 
    $.ajax({ 
    success: function(html) 
    { 
    type: 'get', 
    url: '<?= $created_url ?>' 
+0

这仍然是js和php的混合体,并且与原始版本略有不同.. – madfriend

+0

“将控制器的变量传递给您的视图会更好” - 请问为什么?我已经阅读了很多,确实,在这里和那里,但我不知道为什么这是最佳做法。 (我接受任何链接去阅读它的文本;)) – MEM

+1

这可能是最接近你正在寻找。即使你使用JSON,你仍然需要PHP来设置你的js代码中的变量。防爆。 var params = <?= json_encode(array('action_id'=> $ action_id,'created_url'=> $ created_url))?>,那么在你的js中,你可以这样做:if(params.action_id =='create') ... –

1

是的,你应该使用JSON。这样,您不必担心引号或字符串中间的</script>

if(<?= json_encode(Yii::app()->controller->action->id) ?> == 'create'){ 
    ... 
    url: <?php echo json_encode($this->createUrl('related')); ?> 
+0

因此,我们在javascript中使用php标签的事实并不是我们应该避免的事情。这很自然吗? – MEM

+0

这是可以接受的。只要确保您使用JSON,以便发出JavaScript文字。 –

0

就我个人而言,我会建议将该条件移入您的控制器。它非常简单,可以通过PHP处理,无需在模板中检查该公式。

我不是很熟悉的Yii,但如下可能被改写:

$action_id = Yii::app()->controller->action->id; 
$params = array(); 
if ($action_id == 'action') { 
    $created_url = $this->createUrl('related'); //$this might not be in context here 
    $params['handler'] = $this->render('yourhandler.tpl.php', array('created_url'=>$created_url)); 
} 
$this->render('your_view_name', $params); 
0

CJavaScript::encode()是你的男人,这是传递变量和数组,甚至逃避字符串从PHP到一个伟大的方法JavaScript的。

相关问题