2012-06-15 86 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的。

相關問題