0

サイトにいくつかのフロートチャートを追加することを計画していますが、これを処理するための最善の方法に関する推奨事項があるかどうか疑問に思っています。DB にクエリを実行する既存のモデル クラスとコントローラー クラス、およびこのデータをテーブルとしてレンダリングする単純な .phtml があります。

1 つの方法として、新しい flot.phtml ファイルを追加し、flot チャート API の要求に応じてこのクラスでデータの作成を処理する方法があります。次に、コントローラーが更新され、照会された DB データが「index.phtml」および「flot.pthml」ビュー ファイルに渡されます。すばやく簡単ですが、flot.phtml ファイル内のロジックを再利用できるかどうかはわかりません。

2 番目のオプションは、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 );
    }
}

上記は縮小版です。完全版はファイルのタイムスタンプをチェックし、データが1日以上前のものである場合にのみ再生成します。

于 2009-09-20T21:24:05.400 に答える