【问题标题】:Error while adding google charts to vtiger将谷歌图表添加到 vtiger 时出错
【发布时间】:2016-04-06 12:12:23
【问题描述】:

Vtiger 有自己的 js 文件,所以我认为可能存在一些冲突。无论如何,这就是我在浏览器控制台中得到的:

主线程上的同步 XMLHttpRequest 已被弃用,因为 其对最终用户体验的不利影响。如需更多帮助 http://xhr.spec.whatwg.org/

错误:Google Charts loader.js 只能加载一次。

后者可能是因为 vtiger 两次调用 .tpl 文件,但我不知道为什么。

至于第一个警告:如果 jquery 附加外部 js 文件,这显然会发生。我还读到,如果 async 设置为 false,它应该可以工作,但我不知道如何在 vtiger 中做到这一点

如果我刷新页面一切都很好。

.tpl:

{strip}
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script>
    var rawdata = {$SALES|@json_encode};
    var scatterdata = [];
    var mydata = [];

    var count = 0;
    var sum = 0;
    var num = 0;

    for(var i = 0 ; i < rawdata.length; i++){
        for(var j = 0 ; j < rawdata[i][1]; j++){
            scatterdata[count] = [];
            scatterdata[count][0] = rawdata[i][0];
            scatterdata[count][1] = rawdata[i][2];
            count++;
        }
    } 

    count = 0;
    for(i = 0; i < scatterdata.length; i++){
        sum = 0;
        num = 0;

        for(j = 0; j < scatterdata.length; j++){
            if(scatterdata[i][0] == scatterdata[j][0]){
                sum += scatterdata[j][1];
                num++;
            }                   

        }

        mydata[count] = [];

        var tmpdate = scatterdata[i][0].split("-");
        mydata[count][0] = [];
        mydata[count][0][0] = tmpdate[0];
        mydata[count][0][1] = tmpdate[1];
        mydata[count][0][2] = tmpdate[2];

        mydata[count][1] = scatterdata[i][1];
        mydata[count][2] = sum / num;
        count++;
    }
</script>
<script type="text/javascript" src="resources/PFGraph.js"></script>

<pre>
{$SALES|@debug_print_var} 
</pre>

<form>
    <table class="table table-bordered equalSplit detailview-table">
        <thead>
            <tr>
                <th class="blockHeader" colspan="4">
                    <img class="cursorPointer alignMiddle blockToggle  hide" src="layouts/vlayout/skins/alphagrey/images/arrowRight.png" data-mode="hide" data-id="31">
                    <img style="display: inline;" class="cursorPointer alignMiddle blockToggle" src="layouts/vlayout/skins/alphagrey/images/arrowDown.png" data-mode="show" data-id="31">
                    Details
                </th>    
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Product</label>
                </td>
                <td class="fieldValue medium">{$PRODUCT[0]}</td>

                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Min Amount</label>
                </td>
                <td class="fieldValue medium"><input type="text" name="minAmount"></td>
            </tr>
            <tr>
                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">List Price</label>
                </td>
                <td class="fieldValue medium">{$PRODUCT[1]}</td>

                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Max Amount</label>
                </td>
                <td class="fieldValue medium"><input type="text" name="maxAmount"></td>
            </tr>
            <tr>
                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Lowest Price</label>
                </td>
                <td class="fieldValue medium"></td>

                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Min Price</label>
                </td>
                <td class="fieldValue medium"><input type="text" name="minPrice"></td>
            </tr>
            <tr>
                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Average Price</label>
                </td>
                <td class="fieldValue medium"></td>

                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Max Price</label>
                </td>
                <td class="fieldValue medium"><input type="text" name="maxPrice"></td>
            </tr>
            <tr>
                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">Highest Price</label>
                </td>
                <td class="fieldValue medium"></td>

                <td class="fieldLabel medium">
                    <label class="muted pull-right marginRight10px">test</label>
                </td>
                <td class="fieldValue medium"><button>filter</button></td>
            </rt>
        </tbody>
    </table>
</form>

<style>
    #chart_div{
        margin: 20px 0px;
        padding: 25px;
        background-color: white;
        width: 96%;
        -webkit-box-shadow: 4px 4px 15px 0px rgba(50, 50, 50, 0.3);
        -moz-box-shadow:    4px 4px 15px 0px rgba(50, 50, 50, 0.3);
        box-shadow:         4px 4px 15px 0px rgba(50, 50, 50, 0.3);
    }

</style>

<div id="chart_div" ></div>

{/strip}

.js:

   google.charts.load('current', {
'packages': ['corechart']
});

google.charts.setOnLoadCallback(drawChart);

function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('datetime', 'Date');
data.addColumn('number', 'Price');
data.addColumn('number', 'Price (Average)');

var maxval =  0;

for(var i = 0; i < mydata.length; i++ ){
    data.addRow([new Date(mydata[i][0][0], mydata[i][0][1], mydata[i][0][2]), mydata[i][1], mydata[i][2]]);
    //Get highest price
    if (mydata[i][1] > maxval){
    maxval = mydata[i][1];
    }
}

var options = {
    hAxis: {
    title: 'Date',
    viewWindow: {
        min: new Date(mydata[0][0][0], mydata[0][0][1], mydata[0][0][2]),
        max: new Date(mydata[mydata.length-1][0][0], mydata[mydata.length-1][0][1], mydata[mydata.length-1][0][2])
    },
    gridlines: {
        count: -1,
        units: {
        days: {
            format: ['MMM dd']
        },
        }
    },

    },
    vAxis: {
    title: 'Price',
    minValue: 0,
    maxValue: maxval
    },
    legend: 'none',
    series: {
    0: {
    pointSize: 8,
    dataOpacity: 0.6,
    pointShape: 'diamond'
    },
    1: {
        lineWidth: 2,
        color: '#509C49',
        pointSize: 0
    }
    }
};

var chart = new google.visualization.ScatterChart(document.getElementById('chart_div'));

chart.draw(data, options);
}

【问题讨论】:

    标签: javascript jquery google-visualization vtiger


    【解决方案1】:

    尝试在modules/(YOUR_MODULE)/views/Edit.php 中使用getHeaderScripts 添加您的js 文件。

        function getHeaderScripts(VtigerCrm_Request $request) {
                $headerScriptInstances = parent::getHeaderScripts($request);
    
                $jsFileNames = array(
                    'libraries.jquery.multiplefileupload.jquery_MultiFile' 
                );
                // Add your js path like i did for jquery_MultiFile
                $jsScriptInstances = $this->checkAndConvertJsScripts($jsFileNames);
                $headerScriptInstances = array_merge($headerScriptInstances, $jsScriptInstances);
                return $headerScriptInstances;
        }
    

    【讨论】:

    • 感谢您的回答。控制台消息消失了,但我的图表也消失了。我添加了从 vtiger 根目录到 js 文件的路径。而不是 / 并以文件名结束。
    • 如果我将小部件的功能添加到模块Vtiger会不会有问题?谷歌图表库链接在数据库中,所以我认为我不需要在数组中添加它。如果您有更多建议,请告诉我。
    • 我只使用这种方式实现了与第三方应用程序相关的类似功能。所以我没有得到你以这种方式面临的确切问题。
    • 我可以得出结论,如果我将文件添加到数组中,我的 js 文件没有被加载,但如果我将它添加到模板中,它会运行两次。
    • 伙计谢谢我让它有点工作。问题是文件。 modules/(YOUR_MODULE)/views/Detail.php 是应该编辑的地方,因为它是详细视图而不是编辑视图。
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多