2012-12-05 59 views
3

我正在構建一個codeigniter/php web應用程序。 我想通過一個JSON對象從控制器傳遞到視圖加載時的視圖,以便可以通過javascript訪問。Codeigniter - 如何將JSON作爲參數傳遞給視圖

的JSON看起來如下:

{ 
    "event": { 
     "id": "1", 
     "name": "Some name", 
     "description": "Some description", 
     "address": "1 Main st." 
    }, 
    "members": { 
     "others": [ 
      { 
       "id": "26", 
       "name": "Brad Black" 
      }, 
      { 
       "id": "27", 
       "name": "Bill Blue" 
      } 
     ], 
     "current": { 
      "id": "1", 
      "name": "Jill White" 
     } 
    } 
} 

控制器代碼如下所示:

public function index() 
{ 
    $some_data = $this->Some_model->get_some_data(); 

    $some_data = json_encode($some_data); 

    $data = array (
      'some_data' => $some_data 
    ); 

    $this->load->view('some_view',$data); 
} 

的視圖(some_view)代碼如下所示:

<script src="path/to/scripts/some_script.js" type="text/javascript"></script> 

<script type="text/javascript"> 

    some_data = "<?php echo $some_data?>"; 

</script> 

<div class="main"> 
</div> 

javascript(some_script)代碼如下所示:

var some_data; 

$(document).ready(function(){ 

    some_data = $.parseJSON(some_data); 
}); 

所面臨的挑戰是,由於JSON對象作爲字符串發送(json_encode後),它具有字符,如{和報價作爲它的一部分,這時候我將其分配到的JavaScript不喜歡var(some_data =「」;)。我也嘗試過使用,但它不工作。

我試着做了一堆東西,沒有工作,爲了取得進展,我暫時結束了更換「控制器 $數據[‘some_data’] = str_replace函數(''」的,‘"’ $ some_data);

public function index() 
{ 
    $some_data = $this->Some_model->get_some_data(); 

    $some_data = json_encode($some_data); 

    $data = array (
      'some_data' => str_replace('"', "&quot;", $some_data); 
    ); 

    $this->load->view('some_view',$data); 
} 

和更換"回 「的JavaScript some_data = some_data.replace內側(/ " /克,「」');

var some_data; 

$(document).ready(function(){ 

    event_data = event_data.replace(/&quot;/g, '"'); 
    some_data = $.parseJSON(some_data); 
}); 

這是一種醜陋的,我正在尋找更好的解決方案。

任何指針將不勝感激。

更新! 問題解決了,看起來像多餘的引號打破了事情。

的解決方案是內嵌mohan.gade的回答是:

控制器:

public function index() 
{ 
    $some_data = $this->Some_model->get_some_data(); 

    $some_data = json_encode($some_data); 

    $data = array (
      'some_data' => $some_data; 
    ); 

    $this->load->view('some_view',$data); 
} 

查看:

some_data = <?php echo $some_data?>; 

</script> 

回答

2

您的JSON值沒有得到傳遞給視圖更新了你,下面的代碼嘗試糾正。

public function index() 
{ 
    $some_data = $this->Some_model->get_some_data(); 
    $some_data = json_encode($some_data); 
    $data = array (
      'some_data' => $some_data 
    ); 
     $this->load->view('some_view',$data); 

} 



//in view file 
    <script type="text/javascript"> 
    var jsonData = <?php echo $some_data; ?> 
    </script> 
+0

感謝mohan,我實際上是按照你正確的順序建議的,當我寫下我按照錯誤順序剪切和粘貼這些行的問題時。 JSON創建正確,我的問題是如何將它分配給客戶端的JavaScript var(view/javascript)。我已經更新了這個問題來反映它。 – user898836

+0

希望它能工作! –

+0

您的代碼運行良好!它看起來像我有(出於某種原因)圍繞標籤額外的報價...標記你的答案是正確的 – user898836

0

json_encode將返回null如果空變量傳遞,所以你沒必要轉義"它在你查看代碼。相反,你必須檢查變量是數組還是要傳入的對象來生成不同的代碼。

爲您例如:

if(is_array($_var_value) || is_object($_var_value)){ 
    echo 'var ' . $_var_name . ' = ' . json_encode($_var_value) . ";"; 
}else{ // if(is_string($_var_value)){ 
    echo 'var ' . $_var_name . ' = "' . $_var_value . '";'; 
} 

區分

<script type="text/javascript"> 
    <?php if(is_array($_var_value) || is_object($_var_value)){ ?> 
    var some_data = <?php echo json_encode($some_data); ?>; 
    <?php }else{ ?> 
    var some_data = "<?php echo $some_data; ?>"; 
    <?php } ?> 
</script> 
+0

謝謝皮革。你是在暗示我應該使用,而不是我的內部代碼<腳本類型= 「文/ JavaScript的」> some_data = 「」; – user898836

+0

不,它可以在視圖文件難看,但我認爲這是很容易閱讀和維護,然後在JavaScript也不錯手柄。 – Cauliturtle

2

這可以在沒有很多代碼的情況下安全地完成,只要您在模型中有一定的理智。你發佈的JSON讓我相信你有一個包含事件的數據庫,並且事件存在或事件不存在。

如果$this->Some_model->get_some_data()返回一個類型FALSENULL可以與如果沒有結果存在平等的運營商進行驗證,你可以放心地表示這在,你可以傳達JSON相同的方式查看您的JS。

E.g:

$some_data = $this->Some_model->get_some_data(); 
if ($some_data === NULL) { 
    $data['somedata'] = 'null'; 
} else { 
    // We trust our model, pass it along. 
    $data['somedata'] = json_encode($some_data); 
} 
$this->load->view('some_view', $data); 

然後,在你的JS,只需驗證,這將包含原始JSON字符串變量實際上是在操作它不是空之前。您也可以將其設置爲整數,這點很容易區分。

從外觀上來看,如果活動事件的實際存在,你至少有事件數據和創建它作爲一個成員的人。您可能需要做更多的理智檢查,我不確定您的模型中有什麼。

只需確保PHP變量在語法正確的方式你的JS中的擴展,或者選擇改變JS完全如果不存在數據給它。

+0

感謝蒂姆,確實我處理事件。正如您所懷疑的那樣,JSON永遠不會爲空或空白。 JSON在控制器端是可以的。我的挑戰是如何將它分配給客戶端的JavaScript var(view/javascript),因爲它具有{或引號(我得到未捕獲的異常)等字符。我已經更新了這個問題來反映它。 – user898836

+0

@ user898836'var my_json = <?php echo $ data ['somedata'];?>; some_data = $ .parseJSON(my_json);'不工作? –

+0

它的工作稍作修改,在必須是,我沒有需要使用parseJSON。再次感謝! – user898836