0

我计划在我的网站上添加一些浮动图表,我想知道是否有任何关于处理此问题的最佳方法的建议。我有查询数据库的现有模型和控制器类,以及一个简单的 .phtml 来将此数据呈现为表。

一种方法是添加一个新的 flot.phtml 文件,并让这个类按照 flot 图表 API 的要求处理数据的创建。然后将更新控制器以将查询的 DB 数据传递给“index.phtml”和“flot.pthml”视图文件。它快速简单,但我不确定我是否会从 flot.phtml 文件中的逻辑中得到很多重用。

第二种选择是编写一些类,它具有设置 x/y 轴、线型和添加各种数据集的方法。这基本上会转储“源”脚本元素的内容,最终的 phtml 文件将只关注图表大小和页面上的位置。这个组件应该是一个控制器,它应该是一个动作助手吗?由于它将创建将包含在最终 html 文件中的源代码,Zend 中是否存在我应该扩展或重用的现有组件?

基本上,我正在寻找人们可能想要提出的任何观点。如果我得到一些工作,我稍后会在这里发布吗?

4

1 回答 1

1

我已经使用了 jpGraph(从 php 在服务器端生成图表),并开发了一些视图操作助手来为我完成所有艰苦的工作。所以我用一些基本参数(例如标题、宽度、高度)和一组数据(从控制器传入)调用助手,助手完成其余的工作。它是一个干净可读的 .phtml 文件,尤其是当每页有多个图形时。

我还没有看到任何 Zend_ 组件可以为您完成大部分工作。

[11 月 12 日更新:在下面添加了示例代码]

class Zend_View_Helper_RenderAverageDollarSaleGraph
{
    protected $fileName = 'averageDollarSale.jpg';

    //-------------------------------------------------------------------------
    /*! \brief
        \param
        \return
    */
    function renderAverageDollarSaleGraph( $monthSales ) 
    {
        $labels = array( '', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' );
        $startDate = date( 'Ym', mktime( 0, 0, 0, date( 'm' ) - 1, 1, date( 'Y' ) - 2 ));
        $result = $label = $csimLabels = array();
        foreach ($monthSales as $row)
        {
            $date = sprintf( '%d%02d', $row['paid_year'], $row['paid_month'] );
            if ($date < $startDate) continue;
            $label[]= $labels[ $row['paid_month'] ] . "\n" . substr( $row['paid_year'], -2 );
            $monthName = $row['paid_month'] == 1 ? substr( $row['paid_year'], -2 ) : $labels[ $row['paid_month' ] ];
            $result[] = $row['transactions'] <= 0 ? NULL : ($row['total'] / $row['transactions']);
            $csimLabels[]= $labels[ $row['paid_month'] ] . ' $%0.2f';
        }
        $graph = $this->createGraph();
        $graph->SetScale("intint");
        $graph->title->Set( 'Average Dollar Sale' );
        $graph->xgrid->Show( true );
        $graph->ygrid->Show( true );
        $p1 = new LinePlot(array_values( $result ));
        $p1->mark->SetType(MARK_CIRCLE);
        $p1->mark->SetColor( 'black@0.9' );
        $p1->SetCSIMTargets( array_fill( 0, count( $csimLabels ), '#' ), $csimLabels );
        $graph->Add($p1);
        $graph->xaxis->SetTickLabels( $label );
        $graph->Stroke( SITE_VAR_PATH . $this->fileName );
    }
}

以上是精简版:完整版会检查文件上的时间戳,并且仅在数据超过一天的情况下才会重新生成。

于 2009-09-20T21:24:05.400 回答