Zend и Flot Charts - PullRequest
       19

Zend и Flot Charts

0 голосов
/ 19 сентября 2009

Я планирую добавить на свой сайт несколько диаграмм flot , и мне интересно, есть ли какие-нибудь рекомендации по наилучшему подходу для этого. У меня есть существующие классы моделей и контроллеров, которые запрашивают БД, и простой .phtml для отображения этих данных в виде таблицы.

Один из подходов состоит в добавлении нового файла flot.phtml, и этот класс должен обрабатывать создание данных в соответствии с требованиями API-интерфейса flot. Затем контроллер будет обновлен для передачи запрашиваемых данных БД в файлы представления «index.phtml» и «flot.pthml». Это быстро и просто, но я не уверен, что получу многократное использование из логики в файле flot.phtml.

Второй вариант - написать некоторый класс, в котором будут методы для установки оси x / y, типов линий и добавления различных наборов данных. Это в основном вывело бы содержимое элемента скрипта 'source', а конечный phtml-файл просто присмотрит размер диаграммы и расположение на странице. Должен ли этот компонент быть контроллером, должен ли он быть actionhelper? Поскольку он создаст исходный код, который будет включен в окончательный HTML-файл, существуют ли в Zend компоненты, которые я должен расширить или использовать повторно?

По сути, я ищу любые моменты, которые люди могут захотеть предложить. Если я получу что-то работающее, я опубликую это здесь позже?

1 Ответ

1 голос
/ 21 сентября 2009

Я справедливо использовал jpGraph (генерирует графики на стороне сервера из php) и разработал несколько помощников вида действий, которые выполняют всю тяжелую работу за меня. Поэтому я вызываю помощников с несколькими базовыми параметрами (например, заголовок, ширина, высота) и массивом данных (передаваемых из контроллера), а помощник делает все остальное. Это делает хороший чистый читаемый файл .phtml, особенно когда на странице несколько графиков.

Я не видел ни одного компонента Zend_, который бы сделал для вас многое из этого.

[обновлено 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 );
    }
}

Вышеприведенная версия является сокращенной версией: полная версия проверяет временную метку в файле и восстанавливается только в том случае, если данные старше одного дня.

...