我已经设置了一个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 .= ']';
}
}
答案 0 :(得分:1)
你有几个问题:
{f:'My name'}
应为{"f":"My name"}
)userlist=eval('['+userlist+']')
,但使用的是eval
在您的Javascript中not always the best idea。最后,我不确定为什么你的价值需要额外的方括号。从我所看到的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()
。