2012-03-30 15 views
1

Ich hatte eine schwierige Zeit bekommen jpgraph mit cakephp arbeiten. Ich habe einen Controller namens "Graphs" und alles, was es tut, ist die Ansicht anzuzeigen. Ansicht/Graphs/index.ctp ist sehr einfach:cakephp 2.0 jpgraph

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

, die ich versucht glauben, dass die Informationen aus dem ReportsController zu bekommen und dann seine Ansicht Index bezeichnet. Ich habe dann einen ReportsController:

, die nur die Indexansicht in Berichte aufruft und dies Ajax-Informationen zurückgibt. Ich habe dann die View/Berichte/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(); 

nun basierend auf this link die Ansicht/Graphs/index.ctp hat ein Bild Link, der die View/Berichte/index.ctp ruft und sagt ihm zurückzukehren die JPG, die ich will. Wenn ich diesen Code ausführe, erhalte ich den Fehler "Ressource interpretiert als Bild, aber übertragen mit MIME-Typ text/html". Wenn ich direkt auf den Link gehe (localhost // reports/index), spuckt er eine Menge funky Zeichen aus, und PNG ist fast am Anfang. Ich glaube, das ist eine Binärdatei, die aus dem jpgraph-Zeug erzeugt wurde, daher glaube ich, dass etwas erzeugt wird, aber es wird nicht korrekt gerendert, noch korrekt in View/Graps/index.ctp gebracht.

Ich mag das Gefühl, es sei denn, ich etwas wirklich klein bin fehle, schlich ich diese im Wesentlichen wörtlich aus dem Link in der Frage so seine ärgerlich es war nicht arbeiten. Fehle ich etwas? Gibt es einen einfacheren Weg, in Cakephp zu plotten?

Meine Theorie ist, dass es etwas komisches darüber ist, wie ich die Daten aus der Ansicht ergreife und auch wie der App :: Vendor() - Aufruf in Cake php funktioniert. Wenn ich ein Bild sagen, außerhalb der cakephp Struktur für die jpgraph aussehen es erzeugt es kein Problem:

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

und wenn ich auf diese Seite gehen direkt ist es möglich, die grafische Darstellung ohne Probleme zu erzeugen.

Danke für die Hilfe!

Antwort

2

In Ordnung, ich glaube, ich bin zu einer Hack-Lösung für die Verwendung von jpgraph gekommen.Das Problem ist, wie es gestreamt wird. Was ich tue, ist ich meine Graphen-Controller haben unter:

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

Wo ich die Graphs Index-Funktion aufrufen, die dann ruft die Ansicht/Graphs/index.ctp. In der Steuerung oben rufe ich eine Funktion generateGraph() auf, die genau das tut und das Bild in einer Datei in app/webroot speichert. Dann habe ich die Ansicht/Graphs/index.ctp unter:

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

, die für das Bild in dem app/Webroot-Verzeichnis sucht ich gerade erzeugt. Ich weiß, dass dies ein Hack ist und wenn jemand es eleganter macht, bin ich bereit, das zu versuchen, wenn ich etwas mehr Zeit habe!

0

Sie den Kuchen Vendor Struktur verwendet werden soll, dann ist es detaillierte in the Cookbook. Dadurch haben Sie Zugriff auf die verschiedenen JpGraph-Funktionen.

So zum Beispiel, setzen Sie Ihre Dateien in app/Vendor/jpgraph und Sie können die Haupt JpGraph Datei enthalten (wenn es jpgrah.php genannt) wie folgt:

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

Es gibt einige Tutorials für Kuchen 1.3, die auf die Anwendung finden könnte neue 2.0 Situation, this article und this one. Ich kann nicht für die Qualität beider Artikel bürgen, aber es sollte dir eine Richtung geben. Wenn Probleme auftreten, können Sie die Migrationshandbücher für 2.0 und 2.1 konsultieren.

EDIT:

In Bezug auf den falschen Inhaltstyp; Sie können den Inhaltstyp using the RequestHandler in Cake festlegen. Cake zeigt Inhalt standardmäßig als Text/HTML an, daher müssen Sie den Inhaltstyp explizit festlegen. Verwenden Sie in Ihrer Controller-Methode respondAs.

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

Hallo Mensch, danke für deine schnelle Antwort. Ich habe die Links ausprobiert, die Sie vorgeschlagen haben, und ich habe immer noch Probleme damit. Ich habe die Frage selbst bearbeitet, um genauer auf die Dinge einzugehen, die ich probiert habe. Danke für die Hilfe! – JCR

+0

Ich denke, dass Ihr Update eine eigene Frage verdient, da es sich um ein anderes, wahrscheinlich nicht damit zusammenhängendes Problem handelt. – mensch

+0

Ich habe meine Antwort mit einigen zusätzlichen Zeigern aktualisiert. – mensch