2012-03-30 16 views
1

jpgraphがcakephpで動作するのに苦労しました。私は "グラフ"と呼ばれるコントローラを持って、それはすべてのビューを表示します。ビュー/グラフ/ index.ctpは非常に簡単です:私は試みを信じcakephp 2.0 jpgraph

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

がReportsControllerから情報を取得すると、そのビューは、インデックスと呼ばれます。私はその後、ReportsControllerを持っています:

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

これは単にReportsでインデックスビューを呼び出し、これはajax情報を返します。私は、[表示/レポート/ 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(); 

this linkに基づく表示/グラフ/ index.ctpは、表示/レポート/ index.ctpを呼び出し、返すために、それを伝える画像リンクを持っています私が望むjpgraph。私はこのコードを実行すると、 "リソースとして解釈されたリソースがMIMEタイプのテキスト/ htmlで転送されました"というエラーが表示されます。私が直接リンク(localhost // reports/index)に行くと、たくさんのファンキーな文字が吐き出され、PNGは始まりに近づいています。私はこれがjpgraphのものから生成されたバイナリだと思うので、SOMETHINGは生成されていますが、正しくレンダリングされず、View/Graps/index.ctpに正しく取り込まれません。私は、私は本当に小さな何かが欠けていない限り、同じように感じる

は、私はそれが働いてイマイチので、その厄介な問題のリンクから、この基本的にそのままを盗みました。何か不足していますか? cakephpにプロットする簡単な方法はありますか?この上

私の理論は、私がアプリケーション::ベンダー()呼び出しはケーキのPHPで動作しているか、ビューからデータをつかんでいます方法について奇妙な何かがあるということです。私はそれが何の問題もなく、それを生成jpgraphのためのCakePHPの構造の外に見えるようにイメージを伝えるとき:

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

と私は、直接このページに移動するときには問題なく、グラフを生成することができます。

ありがとうございました!

答えて

2

いいえ私はjpgraphを使用するためのハックソリューションになったと思います。問題はそれがどのようにストリーミングされるかである。私は、[表示/グラフ/ index.ctpを呼び出し、グラフの指数関数を呼び出す

<?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(); 
} 
} 

:私は何をやっていることは、私は以下の私のグラフのコントローラを持っています。上のコントローラでは、私は関数generateGraph()を呼び出して、それを正確に実行してapp/webrootのファイルに画像を保存します。

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

私は、生成された画像のためのアプリ/ webrootディレクトリになります。そして、私は、以下のビュー/グラフ/ index.ctpを持っています。私はこれがハックであることを知っています。誰かがこれをより優雅にやる方法を知っていれば、私は余分な時間を取るとそれを試して喜んでいます!

0

あなたはケーキVendor構造を使用する必要があり、それはin the Cookbook詳細です。これにより、さまざまなJpGraph関数にアクセスできるようになります。

(それはjpgrah.phpと呼ばれていた場合)ので、例えば、そのようapp/Vendor/jpgraphでファイルを入れて、あなたがメインのJpGraphのファイルを含めることができます。

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

に適用される場合がありますケーキ1.3のためのいくつかのチュートリアルがあります。新しい2.0状況、this articleおよびthis one。私は両方の記事の品質を保証することはできませんが、それはあなたにいくつかの方向を与える必要があります。問題が発生した場合は、2.02.1の移行ガイドを参照してください。

EDIT:間違ったコンテンツタイプについて

。コンテンツタイプusing the RequestHandler in Cakeを設定できます。 Cakeはデフォルトでcontentをtext/htmlとしてレンダリングしているので、content-typeを明示的に設定する必要があります。コントローラーメソッドでrespondAsを使用してください。

$this->RequestHandler->respondAs(); 
+0

こんにちはMensch、あなたの迅速な対応に感謝します。あなたが提案したリンクを試してみましたが、まだ問題があるようです。私は試したことをより具体的にするために質問自体を編集しました。助けてくれてありがとう! – JCR

+0

あなたのアップデートは別の、恐らく無関係の問題に関係しているので、あなた自身の質問にはメリットがあるかもしれません。 – mensch

+0

私はいくつかの追加のポインタで私の答えを更新しました。 – mensch