cakephp 2.0 jpgraph - PullRequest
       22

cakephp 2.0 jpgraph

1 голос
/ 30 марта 2012

Мне было трудно заставить jpgraph работать с cakephp.У меня есть контроллер под названием «Графики», и все, что он делает, это отображает вид.View / Graphs / index.ctp очень прост:

echo "This is an image of my report";
echo "<img src='/<projectbase>/reports/index'></img>";

, который, как я считаю, пытается получить информацию из ReportsController, а затем его представление называется index.Затем у меня есть ReportsController:

<?php
class ReportsController extends AppController {
    var $name = 'Reports';
    function index() {
        $this->layout='ajax';
    }
}

, который просто вызывает представление индекса в отчетах и ​​возвращает информацию ajax.Затем у меня есть View / Reports / index.ctp:

App::import('Vendor', 'jpgraph/jpgraph');
App::import('Vendor', 'jpgraph/jpgraph_line');

// Some data
$ydata = array(11,3,8,12,5,1,9,13,5,7);

// Create the graph. These two calls are always required
$graph = new Graph(350,250);
$graph->SetScale('textlin');

// Create the linear plot
$lineplot=new LinePlot($ydata);
$lineplot->SetColor('blue');

// Add the plot to the graph
$graph->Add($lineplot);

// Display the graph
$graph->Stroke();

Теперь на основе эта ссылка View / Graphs / index.ctp имеет ссылку на изображение, которая вызывает View / Reports/index.ctp и говорит ему, чтобы вернуть jpgraph, который я хочу.Когда я запускаю этот код, я получаю сообщение об ошибке «Ресурс интерпретируется как изображение, но передается с MIME-типом text / html».Если я перейду к ссылке напрямую (localhost // reports / index), она выдаст много интересных символов, а PNG находится в начале.Я считаю, что это двоичный файл, который был сгенерирован из материала jpgraph, поэтому я считаю, что SOMETHING генерируется, но не отображается правильно и не переносится в View / Graps / index.ctp правильно.

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

Моя теория заключается в том, что есть нечто странное в том, как я собираю данные из представления, а также в том, как работает вызов App :: Vendor ().торт php.Когда я говорю изображению искать jpgraph вне структуры cakephp, он генерирует его без проблем:

echo "<img src='/jpgraph/Examples/example0.php'></img>";

, и когда я перехожу на эту страницу напрямую, он может без проблем генерировать график.

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Хорошо, я считаю, что нашел решение для использования jpgraph.Проблема в том, как это транслируется.То, что я делаю, у меня есть мой Graphs Controller ниже:

<?php
class GraphsController extends AppController {
var $name = 'Graphs';

function index() {
    // call Reports view to generate new graph
    //$var = ClassRegistry::init('Reports')->index();
    //$this->set(compact('var'));
    $this->generateGraph();
}

/*
 * This function generates the grph to be displayed.  It is a little bit of a hack:
 * I save the image to a file, then in the index.ctp I extract that image.  For now,
 * that is the only way I can get jpgraph to work.
 */
function generateGraph() {
    App::import('Vendor', 'jpgraph/jpgraph');
    App::import('Vendor', 'jpgraph/jpgraph_line');

    // Some data
    $ydata = array(11,3,8,12,5,1,9,13,5,7);

    // Create the graph. These two calls are always required
    $graph = new Graph(350,250);
    $graph->SetScale('textlin');

    // Create the linear plot
    $lineplot=new LinePlot($ydata);
    $lineplot->SetColor('blue');

    // Add the plot to the graph
    $graph->Add($lineplot);

    // Get the handler to prevent the library from sending the
    // image to the browser
    $gdImgHandler = $graph->Stroke(_IMG_HANDLER);

    // Stroke image to a file

    // Default is PNG so use ".png" as suffix
    $fileName = "imagefile.png";
    $graph->img->Stream($fileName);

    // Send it back to browser
    //$graph->img->Headers();
    //$graph->img->Stream();
}
}

Где я вызываю индексную функцию Graphs, которая затем вызывает View / Graphs / index.ctp.В вышеприведенном контроллере я вызываю функцию generateGraph (), которая делает именно это и сохраняет изображение в файл в app / webroot.Затем у меня есть View / Graphs / index.ctp ниже:

<?php
echo "<img src='imagefile.png'></img>";
?>

, который ищет в каталоге app / webroot изображение, которое я только что сгенерировал.Я знаю, что это взлом, и если кто-нибудь знает, как сделать это более изящно, я готов попробовать это, когда у меня будет дополнительное время!

0 голосов
/ 30 марта 2012

Вы должны использовать структуру Cake Vendor, подробно в Кулинарной книге .Это обеспечит вам доступ к различным функциям JpGraph.

Так, например, поместите ваши файлы в app/Vendor/jpgraph, и вы можете включить основной файл JpGraph (если он называется jpgrah.php) следующим образом:

App::import('Vendor', 'jpgraph/jpgraph');

Существуют некоторые учебные пособия для Cake 1.3, которые могут применяться к новой ситуации 2.0, эта статья и эта .Я не могу ручаться за качество обеих статей, но это должно дать вам направление.Вы можете обратиться к руководствам по миграции для 2.0 и 2.1 , если возникнут какие-либо проблемы.

РЕДАКТИРОВАТЬ:

Относительно неправильного типа контента;Вы можете установить тип контента , используя RequestHandler в Cake .Cake по умолчанию отображает содержимое как text / html, поэтому вам нужно явно указать тип содержимого.Используйте respondAs в вашем методе контроллера.

$this->RequestHandler->respondAs();
...