2016-03-30 20 views
1

我已經設置了一個Google圖表(組織圖)實現,它接受行列表作爲變量,最終來自PHP。如果我嘗試使用該變量呈現組織結構圖,則會收到錯誤「給出的每一行都必須爲null或數組」。如果在addRows命令之前輸入alert(userlist),則複製該輸出,並將該變量替換爲輸出,一切正常,因此我知道它正在正確接收數據。下面是我到目前爲止有:谷歌圖表錯誤:給出的每一行必須爲空或數組

google.charts.load('current', {packages:["orgchart"]}); 
google.charts.setOnLoadCallback(drawChart); 

function drawChart() { 
    var data = new google.visualization.DataTable(); 
    data.addColumn('string', 'Name'); 
    data.addColumn('string', 'Manager'); 
    data.addColumn('string', 'ToolTip'); 

    // Pull user information from Drupal 
    var userlist = Drupal.settings.orgchart.userlist; 

    // For each orgchart box, provide the name, manager, and tooltip to show. 
    alert(userlist); 
    data.addRows([userlist]); 

    // Create the chart. 
    var chart = new google.visualization.OrgChart(document.getElementById('org-chart')); 
    // Draw the chart, setting the allowHtml option to true for the tooltips. 
    chart.draw(data, {allowHtml:true}); 
} 

同樣地,如果我從alert(userlist)它的偉大工程的輸出代替用戶列表中data.addRows([userlist]);

UPDATE:這裏是原始輸出:
[{v:'CN=My Name,OU=IT,OU=Fesslers,DC=hpsi,DC=local', f:'My Name'}, 'CN=Supervisor Name,OU=Sr. Management,OU=Fesslers,DC=hpsi,DC=local', ''], [{v:'', f:'Another Name'}, '', ''], [{v:'CN=Yet Another,OU=IT,OU=Fesslers,DC=hpsi,DC=local', f:'Yet Another'}, 'CN=My Name,OU=IT,OU=Fesslers,DC=hpsi,DC=local', '']

UPDATE:在PHP中加入創建我的用戶名單變量:

$allusers = entity_load('user'); 
$userlist = ''; 
if ($allusers) { 
    foreach ($allusers as $useritem) { 
    $dn = ''; 
    $manager = ''; 
    $fullname = ''; 
    if ($useritem->uid > 1) { // Skip user 0 and 1 
     if (isset($useritem->field_distinguished_name['und']['0']['value'])) { 
     $dn = $useritem->field_distinguished_name['und']['0']['value']; 
     } 
     if (isset($useritem->field_manager_dn['und']['0']['value'])) { 
     $manager = $useritem->field_manager_dn['und']['0']['value']; 
     } 
     if (isset($useritem->field_full_name['und']['0']['value'])) { 
     $fullname = $useritem->field_full_name['und']['0']['value']; 
     } 
     ($userlist == '') ? $userlist = '[[{v:\'' . $dn . '\', f:\'' . $fullname . '\'}, \'' . $manager . '\', \'\']' : $userlist .= ', [{v:\'' . $dn . '\', f:\'' . $fullname . '\'}, \'' . $manager . '\', \'\']'; 
    } 
    } 
    if ($userlist != '') { 
    $userlist .= ']'; 
    } 
} 
+0

啊,對不起 - 意味着這樣做。我更新了原始帖子。如果我正確讀取示例數據,它似乎包含了所有必要的內容。 –

+0

你的變量用戶列表是如何定義的?可能它是一個數組數組,'var userlist = [[foo,bar],[bar,foo]]',如果是這種情況,那麼你會試圖在一個數組數組上調用'addRows'數組('addRows([['foo','bar'],['bar','foo']]])'); 我的第二個猜測是你沒有在drupal.settings.orgchart.userlist中正確格式化所有東西。在這一點上可以分享如何格式化輸出嗎? 一切都按預期對我工作... https://jsfiddle.net/heennkkee/6q1qto0a/2/1/ –

+0

我已經嘗試了幾個選擇:'var userlist = Drupal.settings.orgchart.userlist;','' var userlist = new Array(Drupal.settings.orgchart.userlist;'。如果我在你的JS小提琴中做了你所做的事情(靜態地將數據添加到var userlist),它可以工作 - 但是如果我只是按原樣使用變量,它不會,我會在PHP中添加用戶列表變量。 –

回答

1

你有幾個問題:

  • 用戶列表的值是一個字符串,而不是一個對象。當您嘗試使用 添加行([userlist])時,您發送的數組有單個 元素,即一個字符串。
  • 試圖改變你收到來自STRING到 的JavaScript對象時,JSON.parse不起作用,因爲屬性名稱 沒有引號({f:'My name'}應該{"f":"My name"}
  • 肯定的是,它與userlist=eval('['+userlist+']'),但在您的Javascript中使用評估 是not always the best idea
  • 您聲明名稱爲字符串,但您發送的是 對象。那是怎麼回事?如果你不發送對象,你也擺脫了Javascript/JSON解析的情況

最後,我不知道爲什麼你的價值需要額外的方括號。從我看到的PHP代碼中,應該已經有數組數組的括號。

結論:更改返回值的格式,以便它是有效的JSON並用JSON.parse(value)讀取它。我不是一個Drupal用戶,但我發現這個答案如何複雜的PHP變量傳遞爲Javascript:https://drupal.stackexchange.com/questions/21566/how-to-pass-php-variables-to-javascript-jquery

這裏是工作的jsfiddle(?):https://jsfiddle.net/pxjhffj9/使用eval與您最初提供的字符串。

這裏是一個有效的JSON:

[ 
    [{ 
      "v" : "CN=My Name,OU=IT,OU=Fesslers,DC=hpsi,DC=local", 
      "f" : "My Name" 
     }, "CN=Supervisor Name,OU=Sr. Management,OU=Fesslers,DC=hpsi,DC=local", ""], 
    [{ 
      "v" : "", 
      "f" : "Another Name" 
     }, "", ""], 
    [{ 
      "v" : "CN=Yet Another,OU=IT,OU=Fesslers,DC=hpsi,DC=local", 
      "f" : "Yet Another" 
     }, "CN=My Name,OU=IT,OU=Fesslers,DC=hpsi,DC=local", ""] 
] 
+0

啊,將輸出更改爲使用雙引號,然後使用JSON.parse做到了。謝謝一堆! –

0

基於你添加你」的PHP重新嘗試將addRows作爲嵌套數組。

您的PHP將生成一個像var userlist = [['bar', 'foo'], ['foo', 'bar]]這樣的數組,當您添加行時,它將成爲addRows([ [['bar', 'foo'], ['foo', 'bar]] ],成爲一個[ ]

嘗試在您撥打addRows()的電話中刪除[ ]左右userlist

+0

不幸的是,我已經嘗試過,錯誤仍然存​​在。 –

相關問題