Графики Zend и Flot

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

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

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

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


person emeraldjava    schedule 19.09.2009    source источник


Ответы (1)


Я немного использовал 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( '[email protected]' );
        $p1->SetCSIMTargets( array_fill( 0, count( $csimLabels ), '#' ), $csimLabels );
        $graph->Add($p1);
        $graph->xaxis->SetTickLabels( $label );
        $graph->Stroke( SITE_VAR_PATH . $this->fileName );
    }
}

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

person Steve    schedule 20.09.2009
comment
Эй, Стив, мне интересно, не могли бы вы опубликовать код? из вашего помощника по действию просмотра, так как мне было бы интересно увидеть вашу реализацию. - person emeraldjava; 05.11.2009