从php为chartjs构建javascript回调函数

从php为chartjs构建javascript回调函数,php,jquery,chart.js,Php,Jquery,Chart.js,我正在使用chartjs在模板上构建一个图形,效果很好,但标签存在舍入问题,可能需要显示货币符号,因此我发现我可以在工具提示中使用回调函数 现在,我正在使用php在数组中创建javascript,然后使用json_encode构建图表数据,当我运行代码时,内容被呈现,但现在工具提示消失了 阵列构建的简化版本如下所示: $dataSets = array(); $res = new stdClass(); $res->

我正在使用chartjs在模板上构建一个图形,效果很好,但标签存在舍入问题,可能需要显示货币符号,因此我发现我可以在工具提示中使用回调函数

现在,我正在使用php在数组中创建javascript,然后使用json_encode构建图表数据,当我运行代码时,内容被呈现,但现在工具提示消失了

阵列构建的简化版本如下所示:

$dataSets             = array();

    $res                  = new stdClass();
    $res->label           = 'Client (paid)';
    $res->backgroundColor = $palette[0]->background_color;
    $res->stack           = 'Stack 0';
    $res->data            = array_values( $pi['client'] );
    $dataSets[0]          = $res;

    $title                = new stdClass();
    $title->display       = true;
    $title->text          = 'Invoices Breakdown';

    $callbacks            = new stdClass();
    $label                = new stdClass();

    $callbacks->label     = "
    function(tooltipItem, data) {
        var label = data.datasets[tooltipItem.datasetIndex].label || '';

        if (label) {
            label += ': £';
        }
        label += Math.round(tooltipItem.yLabel * 100) / 100;
        return label;
    }";

    $tooltips             = new stdClass();
    $tooltips->mode       = 'index';
    $tooltips->intersect  = false;
    $tooltips->callbacks  = $callbacks;

    $scales               = new stdClass();

    $xAxes                = array();
    $x                    = new stdClass();
    $x->stacked           = true;
    $xAxes[]              = $x;
    $scales->xAxes        = $xAxes;

    $yAxes                = array();
    $y                    = new stdClass();
    $y->stacked           = true;
    $yAxes[]              = $y;
    $scales->yAxes        = $yAxes;

    $ds                   = new stdClass();
    $ds->type             = 'bar';

    $data                 = new stdClass();
    $data->labels         = $months;
    $data->datasets       = $dataSets;
    $ds->data             = $data;

    $options              = new stdClass();
    $options->title       = $title;
    $options->tooltips    = $tooltips;
    $options->responsive  = true;
    $options->scales      = $scales;
    $ds->options          = $options;

    return $ds;
可以看出,我将回调作为字符串插入(工作版本没有$callback对象)

输出此对象的代码如下:

$chart = json_encode( $dataset );
$html .= '
    <canvas id="invoiceChart" width="100" height="50"></canvas>
    <script>
        var ctx = document.getElementById("invoiceChart").getContext("2d");    
        var invoiceChart = new Chart(ctx, ' . $chart . ')
    </script>';
$chart=json\u encode($dataset);
$html.='
var ctx=document.getElementById(“invoiceChart”).getContext(“2d”);
var invoiceChart=新图表(ctx,“.$Chart.”)
';
那么如何以这种方式插入回调函数呢

呈现为$chart的代码示例如下:

<script>
        var ctx = document.getElementById("invoiceChart").getContext("2d");    
        var invoiceChart = new Chart(ctx, {"type":"bar","data":{"labels":["Sep","Oct","Nov","Dec","Jan","Feb"],"datasets":[{"label":"Client (paid)","backgroundColor":"#784187","stack":"Stack 0","data":[0,2,655,75,31.5,0]},{"label":"Client (auth)","backgroundColor":"#DDDDDD","stack":"Stack 0","data":[0,5.4,925,971.03,1227.703,402]},{"label":"Client (draft)","backgroundColor":"#003D51","stack":"Stack 0","data":[0,0,0,0,0,761.667]},{"label":"Contractor (paid)","backgroundColor":"#EA9A24","stack":"Stack 1","data":[0,166.505,9.99,0,81.93,0]},{"label":"Contractor (auth)","backgroundColor":"#E6194B","stack":"Stack 1","data":[0,0,261.451,0,2361.165,90.915]},{"label":"Contractor (draft)","backgroundColor":"#3CB44B","stack":"Stack 1","data":[0,5.4,0,0,239.71300000000002,252.77800000000002]}]},"options":{"title":{"display":true,"text":"Invoices Breakdown"},"tooltips":{"mode":"index","intersect":false,"callbacks":{"label":"\r\n    function(tooltipItem, data) {\r\n        var label = data.datasets[tooltipItem.datasetIndex].label || '';\r\n\r\n        if (label) {\r\n            label += ': \u00a3';\r\n        }\r\n        label += Math.round(tooltipItem.yLabel * 100) \/ 100;\r\n        return label;\r\n    }"}},"responsive":true,"scales":{"xAxes":[{"stacked":true}],"yAxes":[{"stacked":true}]}}})
    </script>

var ctx=document.getElementById(“invoiceChart”).getContext(“2d”);
var invoiceChart=新图表(ctx,{“类型”:“条形图”,“数据”:{“标签”:[“九月”,“十月”,“十一月”,“十二月”,“一月”,“二月],“数据集”:[{“标签”:“客户(付费)”,“背景色”:“#784187”,“堆栈”:“堆栈0”,“数据”:[0,2655,75,31.5,0]},{“标签”:“客户机(授权)”,“背景色”:“#DDDDDDDD”,“堆栈”:“堆栈0”,“数据”:[0 5.4925971.031227.703402],{,“背景色”:“#003D51”,“堆栈”:“堆栈0”,“数据”:[0,0,0,0761.667],{“标签”:“承包商(已付款)”,“背景色”:“#EA9A24”,“堆栈”:“堆栈1”,“数据”:[0166.505,9.99,0,81.93,0],{“标签”:“承包商(授权)”,“背景色”:“35E6194B”,“堆栈”:“堆栈1”,“数据”:[0 0261.451,02361.165,90.915],{“承包商(授权)”,“背景色”:“#3CB44B”,“stack”:“stack 1”,“data”:[0,5.4,0,0239.713000000000002252.7780000000002]},,“options”:{“title”:{“display”:true,“text”:“Invoices Breakdown”},“tooltiptem”:“index”,“intersect”:false,“callbacks”:{“label”:“\r\n函数(tooltipItem,data){\r\n var label=data.datasets[tooltiptem.datasets].label | |“”;\r\n\r\n如果(label){\r\n label+=':\u00a3';\r\n}\r\n label+=Math.round(tooltipItem.yLabel*100)\/100;\r\n返回label;\r\n}}},“响应”:true,“缩放”:{“xAxes”:[{“堆叠”:true}、“yAxes”:[{“堆叠”:true}})
正如您所看到的(毫不奇怪),回调函数被引号包围(好吧,它是一个字符串)

那么我如何才能正确地做到这一点呢

编辑:我想我可能可以使用占位符和搜索替换,但还有其他解决方案吗


谢谢

所以我最后用“,”替换了字符串,并用回调函数替换了它。没有解决方法可以这样做,并将回调放入社区提供的对象中