Javascript Google图表错误:给定的每一行必须为null或数组
我已经设置了一个GoogleCharts(OrgChart)实现,它接受行列表作为变量,最终来自PHP。如果我尝试使用该变量呈现组织结构图,我会得到错误“给定的每一行必须为null或数组”。如果我在执行Javascript Google图表错误:给定的每一行必须为null或数组,javascript,arrays,google-visualization,Javascript,Arrays,Google Visualization,我已经设置了一个GoogleCharts(OrgChart)实现,它接受行列表作为变量,最终来自PHP。如果我尝试使用该变量呈现组织结构图,我会得到错误“给定的每一行必须为null或数组”。如果我在执行addRows命令之前执行alert(userlist),复制该输出,并用输出替换该变量,一切正常,因此我知道它正确地接收了数据。以下是到目前为止我得到的信息: google.charts.load('current', {packages:["orgchart"]}); google.chart
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});
}
同样,如果我替换data.addRows([userlist])中的userlist
通过alert(userlist)
的输出,效果非常好
更新:以下是原始输出:
更新:添加创建my userlist变量的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 .= ']';
}
}
根据您添加的PHP,您试图将行添加为嵌套数组
您的PHP将生成一个数组,如var userlist=[[['bar',foo'],['foo',bar]]
,当您添加行时,它将是addRows([[[['bar',foo'],['foo',bar]]]
,成为一个[]
在调用addRows()
时,尝试删除[]
用户列表周围的
您遇到了几个问题:
- userlist的值是一个字符串,而不是一个对象
要添加行([userlist]),您将发送一个具有单个
元素,一个字符串
- 尝试将接收到的对象从字符串转换为字符串时
javascript、JSON.parse不起作用,因为属性名是
不带引号(
{f:'My name'}
应该是{f:'My name}
)
- 当然,它可以与
userlist=eval(“['+userlist+']')
一起使用,但是使用eval
在您的Javascript中是
- 您正在将名称声明为字符串,但正在发送
如果你不发送对象,你也可以摆脱Javascript/JSON解析的情况
最后,我不确定为什么您的值需要额外的方括号。从我看到的PHP代码来看,它应该已经有了数组数组的方括号
结论:更改返回值的格式,使其成为有效的JSON,然后使用读取。我不是Drupal用户,但我找到了关于如何将复杂的PHP变量传递给Javascript的答案:
下面是一个正在工作的(?)jsfiddle:将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", ""]
]
啊,抱歉——我是故意这么做的。我更新了原始帖子。如果我正确读取了样本数据,它似乎包含了所有必要的内容。变量userlist是如何定义的?按默认值,它将是一个数组数组,var userlist=[[foo,bar],[bar,foo]]
,如果是这种情况,那么您将尝试在数组的数组上调用addRows
(addRows([['foo',bar',['bar',foo']])
);我的第二个猜测是,您在drupal.settings.orgchart.userlist中没有正确格式化所有内容。是否可以在此时共享您格式化输出的方式?所有内容都按照我的预期工作……我尝试了几个选项:var userlist=drupal.settings.orgchart.userlist;
,var userlist=new Array(Drupal.settings.orgchart.userlist;
。如果我像你在JS小提琴中做的那样(静态地将数据添加到var userlist),它可以工作——但如果我只是按原样使用变量,它就不能工作。我将添加呈现userlist变量的PHP。@SeanCunningham是userlist
string?或数组的类型?请尝试:alert(typeof userlist);
并告诉我们输出是什么?我认为它应该是string
。它确实有响应“string”。啊,将输出更改为使用双引号,然后使用JSON.parse。谢谢!