Google图表错误:给定的每一行必须为null或数组

时间:2016-03-30 21:12:24

标签: javascript arrays google-visualization

我已经设置了一个Google图表(组织结构图)实现,它接受行列表作为变量,最终来自PHP。如果我尝试使用该变量渲染组织结构图,我会收到错误"给定的每一行必须为null或数组。"如果我在alert(userlist)命令之前addRows,复制该输出,并将变量替换为输出,一切都很好,所以我知道它正确地接收了数据。这是我到目前为止所得到的:

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});
}

同样,如果我将data.addRows([userlist]);中的用户列表替换为alert(userlist)的输出,则效果很好。

更新:这是原始输出:
[{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', '']

更新:添加创建用户列表变量的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 .= ']';
  }
}

2 个答案:

答案 0 :(得分:1)

你有几个问题:

  • userlist的值是一个字符串,而不是一个对象。当你尝试 addRows([userlist])你发送一个单一的数组 元素,一个字符串。
  • 尝试将您从字符串接收的对象转换为 javascript,JSON.parse不起作用,因为属性名称是 不在引号中({f:'My name'}应为{"f":"My name"}
  • 当然,它适用于userlist=eval('['+userlist+']'),但使用的是eval 在您的Javascript中not always the best idea
  • 您将Name声明为字符串,但是您正在发送 宾语。那是怎么回事?如果您没有发送对象,那么您也可以摆脱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", ""]
]

答案 1 :(得分:0)

根据您添加的PHP,您尝试将addRows作为嵌套数组。

您的PHP将生成一个类似var userlist = [['bar', 'foo'], ['foo', 'bar]]的数组,当您添加行时,它将为addRows([ [['bar', 'foo'], ['foo', 'bar]] ],成为一个[ ]

尝试删除[ ]来电中userlist周围的addRows()