1

jpgraph を cakephp で動作させるのに苦労しました。「Graphs」というコントローラーがあり、ビューを表示するだけです。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のものから生成されたバイナリだと思うので、何かが生成されていると思いますが、正しくレンダリングされておらず、View/Graps/index.ctpに正しく取り込まれていません。

本当に小さなものを見逃していない限り、質問のリンクからこれを本質的に逐語的に盗んだので、面倒なことは機能していません。何か不足していますか?Cakephp でプロットする簡単な方法はありますか?

これに関する私の理論は、ビューからデータを取得する方法と、ケーキ php で App::Vendor() 呼び出しがどのように機能するかについて、何か奇妙なことがあるということです。jpgraphのcakephp構造の外を見るように画像に指示すると、問題なく生成されます。

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

このページに直接アクセスすると、問題なくグラフを生成できます。

助けてくれてありがとう!

4

2 に答える 2

2

さて、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();
}
}

ここで、View/Graphs/index.ctp を呼び出す Graphs インデックス関数を呼び出します。上記のコントローラーで、generateGraph() 関数を呼び出します。この関数はまさにそれを行い、画像を app/webroot のファイルに保存します。次に、View/Graphs/index.ctp を以下に示します。

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

app/webroot ディレクトリで生成した画像を探します。私はこれがハックであることを知っています。誰かがこれをより適切に行う方法を知っていれば、時間があれば喜んでそれを試してみます!

于 2012-04-02T18:51:30.923 に答える
0

CakeVendor構造を使用する必要があります。これについては、Cookbookで詳しく説明されています。これにより、さまざまなJpGraph関数にアクセスできるようになります。

したがって、たとえば、ファイルを入れて、app/Vendor/jpgraph次のようにメインのJpGraphファイル(呼び出されている場合jpgrah.php)を含めることができます。

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

新しい2.0の状況、この記事、およびこれに適用される可能性のあるCake1.3のチュートリアルがいくつかあります。両方の記事の品質を保証することはできませんが、それはあなたにいくつかの方向性を与えるはずです。問題が発生した場合は、 2.0および2.1の移行ガイドを参照してください。

編集:

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

$this->RequestHandler->respondAs();
于 2012-03-30T08:58:57.540 に答える