如何在Symfony中存储Google Charts的数据?

时间:2014-08-03 12:14:56

标签: javascript symfony google-visualization

我已经坚持了一段时间了:

在我的Symfony应用程序中,我想从数据库中检索一些数据并使用它构建Google Chart。但在我看来,我无法以所需的格式生成JSON数据。

在第一步中,我想复制这个example provided by Google,但是有一些(非常基本的)我自己的数据。 (我想显示“制造商和物品数量而不是浇头和切片”)。

以下是我在TWIG模板中生成图表的代码:

<script type="text/javascript">
// Load the Visualization API and the piechart package.
google.load('visualization', '1.0', {'packages':['corechart']});

// Set a callback to run when the Google Visualization API is loaded.
google.setOnLoadCallback(drawChart);  

// Callback that creates and populates a data table,
// instantiates the pie chart, passes in the data and
// draws it.
function drawChart() {

/*    var jsonData = $.ajax({
        url: "{{ path('my_data_collector_service') }}",
        dataType:"json",
        async: false
    }).responseText;*/

    // Create the data table.
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Provider');
    data.addColumn('number', 'Items');
    data.addRows({{ jsonData|raw }});

    // Set chart options
    var options = {'title':'Products by Provider',
        'width':400,
        'height':300};

    // Instantiate and draw our chart, passing in some options.
    var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
    chart.draw(data, options);
}
</script>

这是JSON数据在生成页面的源代码中的样子:

data.addRows([{"name":"Apple","items":"2"},{"name":"LG Electronics","items":"1"}]);

与原始代码示例相比,我似乎有一个关联数组结构,以及围绕我所有元素名称和值的很多引号。

我需要更改哪些内容才能使Google Chart API能够处理我的数据?生成此类数据的最佳做法有哪些?

这是我用来生成JSON数据以供参考的代码:

class DataCollectorController extends Controller
{

    protected  $entityManager;

    public function __construct($entityManager) {
        $this->entityManager = $entityManager;
    }

    public function productsAction()
    {
        $encoders = array(new JsonEncoder());
        $normalizers = array(new GetSetMethodNormalizer());

        $serializer = new Serializer($normalizers, $encoders);

        $em = $this->entityManager;
        $query = $em->createQuery(
            'SELECT prov.name, count(prod.id) as items
            FROM MyBundle:Product prod
            JOIN prod.provider prov
            GROUP BY prov.name'
        );

        $data = $serializer->serialize($query->getResult(), 'json');

        $response = new Response();
        $response->setContent($data);
        $response->headers->set('Content-Type', 'application/json');

        return $response;

    }
}

1 个答案:

答案 0 :(得分:0)

所以我通过将这一点添加到我的Data CollectorController来完成工作:

$res = $query->getResult();

foreach ($res as $val)
{
   $data[] = array($val['name'], (int) $val['items']);
}

这几乎也可以通过简单地运行

来实现
foreach ($res as $val)
{
   $data[] = array_values($val);
}

但是这样就有一个问题,那就是数字值仍然用引号括起来。

全班现在看起来像这样:

class DataCollectorController extends Controller
{

    protected  $entityManager;

    public function __construct($entityManager) {
        $this->entityManager = $entityManager;
    }

    public function productsAction()
    {
        $encoders = array(new JsonEncoder());
        $normalizers = array(new GetSetMethodNormalizer());

        $serializer = new Serializer($normalizers, $encoders);

        $em = $this->entityManager;

        $query = $em->createQuery(
            'SELECT prov.name, count(prod.id) as items
            FROM VSJourneyroWebBundle:Product prod
            JOIN prod.provider prov
            GROUP BY prov.name'
        );

        $res = $query->getResult();

        foreach ($res as $val)
        {
            $data[] = array($val['name'], (int) $val['items']);
        }

        $data = $serializer->serialize($data, 'json');

        $response = new Response();
        $response->setContent($data);
        $response->headers->set('Content-Type', 'application/json');

        return $response;

    }
}

它正在工作,但它并不真正感觉“优雅”迭代结果对象的每一位。特别是关于铸造'物品'价值的一点点。 仍欢迎任何进一步改进的建议。