Support » Allgemeine Fragen » Chart wird nicht angezeigt

  • Gelöst Kai J.

    (@kjoussen)


    Hallo.

    Ich hatte ein ähnliches Thema erstellt, es wurde aber geschlossen.

    Ich möchte sicherheitshalber betonen, dass das folgende keine php-Frage ist, sondern ein WP-spezifisches Problem.

    Ich bekomme von Sensoren Messdaten in eine extra DB geschrieben, die ich in einer Unterseite über das wpdb-Objekt auch als Tabelle dargestellt bekomme.
    Dafür habe ich für eine Unterseite folgendes Template erstellt.

    <?php
    /*
    * Template Name: Show-Probe-Data
    * 
    *
    * @subpackage MyHamburg
    * @version 1.0
    * Only used for displaying environment values from "Server Room"
    *
    */
    get_header(); 
    global $wpdb;
    ?>
    <div class="wrap">
    	<div id="primary" class="content-area">
    		<main id="main" class="site-main" role="main">
    			<?php
    
    				while ( have_posts() ) :
    					the_post();
    					get_template_part( 'template-parts/page/content', 'page' );
    				endwhile;
    				$wpdb = new wpdb("probevalues", "ProbeValues.4711", "probevalues", "localhost");
    				$rows = $wpdb->get_results("SELECT * FROM probevalues");
    				?>
    				<table>
    					<tr>
    						<th>Datum / Uhrzeit</th>
    						<th>Temperatur</th>
    						<th>Humidity</th>
    					</tr>
    					<?php foreach ($rows as $obj) : ?>
    					<tr>
    						<td><?php echo (($obj->Temp > 30 and $obj->Hum > 50) ? "<font color='#FF0000'>" : "") . $obj->Date; ?></td>
    						<td><?php echo ($obj->Temp > 30 ? "<font color='#FF0000'>" : "") . $obj->Temp,"°"; ?></td>
    						<td><?php echo ($obj->Hum > 50 ? "<font color='#FF0000'>" : "") . $obj->Hum,"%";?></td>
    					</tr>
    					<?php endforeach ?>
    				</table>
    				
    		</main><!-- #main -->
    	</div><!-- #primary -->
    </div><!-- .wrap -->
    <a href="#" class="topbutton"></a>
    <?php get_footer();
    

    Soweit so gut, alles fehlerfrei.

    Wenn ich aber oben unterhalb von global $wpdb noch einfüge

    require('assets/libraries/phplot.php');
    

    und im Template unter der Tabelle

    <?php
    //Define some data
    $data = array(
         array('a',3),
         array('b',5),
         array('c',7),
         array('d',8),
         array('e',2),
         array('f',6),
         array('g',7)
    );
    
    $plot = new PHPlot(800,600);
    $plot->SetDataValues($data);
    $plot->SetTitle('First Test Plot');
    
    $plot->SetXTitle('X Data');
    $plot->SetYTitle('Y Data');
    
    //$plot->SetXTickLabelPos('none');
    //$plot->SetXTickPos('none');
    
    $plot->DrawGraph();	
    ?>
    

    kommt aber keine Grafik, sondern nur kryptische ASCII-Zeichen, als wenn man eine PNG-Datei mit einem Editor öffnen würde.
    Natürlich sind die Daten da oben nur zu Testzwecken…..

    Nehme ich den gleichen Code und rufe ihn sozusagen außerhalb WordPress auf (ich habe alles auf einem eigenen NAS, kann also virtuelle Hosts bauen, so viel ich will), geht es einwandfrei.
    Ergo: kein php-Problem, aber warum stellt WordPress den Chart nicht dar?

    Danke schon, vor allem fürs nicht gleich wieder schließen…. 😉

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Moderator Bego Mario Garde

    (@pixolin)

    Wieso dein Thread geschlossen wurde, habe ich begründet (reine PHP-Frage, off topic). Schade, dass du meinen Hinweise ignorierst, dass wir hier Anwendungs-Support leisten und Code nur beurteilen können, wenn er öffentlich zugänglich ist. Für Fragen zur Plugin- und Theme-Entwicklung bist du auf Stackexchange besser aufgehoben.

    Wir können nicht beurteilen, was die Datei assets/libraries/phplot.php beinhaltet und ich habe auch keinen Einblick in die Class PHPlot. Deshalb kann ich die geschilderten Probleme nicht nachvollziehen und deine Frage nicht beantworten.

    Grundsätzlich sollte eine Erweiterung der Funktionalität nicht in einem Theme-Template erfolgen, weil die Funktionalität sonst nach einem Theme-Wechsel verloren geht, die Trennung zwischen Layout und Funktion also nicht mehr gegeben ist. ich würde wahrscheinlich auch eher mit einem Shortcode arbeiten, um eine PHP-Funktion zu integrieren.

    Ich habe Deine Hinweise nicht ignoriert, verzeih.

    OK, um der Sache näher zu kommen:

    ich habe die Bibliothek phplot entfernt und meinen Test-Chartcode durch Standard-php-Grafikbefehle ersetzt, welcher außerhalb WP allein aufgerufen perfekt geht.

    Binde ich den Code

    header("Content-type: image/png");
    // erstellen eines leeren Bildes mit 400px Breite und 300px Höhe
    $bild = imagecreatetruecolor(400, 300);
    // Hintergrundfarbe erstellen
    imagecolorallocate($bild, 150, 150, 0);
    
    // Farben festlegen
    $farbe1 = imagecolorallocate($bild, 255, 255, 0);
    $farbe2 = imagecolorallocate($bild, 0, 255, 0);
    $farbe3 = imagecolorallocate($bild, 0, 0, 255);
    // Viereck zeichen
    // mit folgenden Kordinaten (x1, y1, x2, y2, Farbe);
    imagefilledrectangle ($bild, 20, 75, 350,250, $farbe1);
    imagefilledrectangle ($bild, 150, 100, 200, 280, $farbe2);
    imagefilledrectangle ($bild, 220, 150, 330, 190, $farbe3);
    // Ausgabe des Bildes
    imagepng($bild);
    

    aber in mein Template ein, welches bereits andere php-Befehle sauber ausführt, kommen wieder nur kryptische Zeichen.

    Also ist es irgendwas innerhalb WPs, welches es „verbietet“ Bilder per php zu malen, obwohl der php Code an sich richtig ist.

    Dein Hinweis bzgl. Desing und Funktion ist vollkommen richtig, aber da es sich um mein eigenes Theme handelt und um eine Intranet-Seite handelt, ist die „Gefahr“ zu vernachlässigen.

    Ich habe einen älteren Thread gefunden eigene-php-datein-in-childtheme-einbinden in dem Du empfiehlst:

    <?php include( get_stylesheet_directory() . '/includes/myfile.php'); ?>

    Das funktioniert auch, so lange der Code keine Grafik generiert.
    Das bringt wieder nur die komischen Zeichen.

    Also warum kann man in WP über eine Theme-Seite o.ä. keine Grafik erzeugen?
    Woran liegt das?

    Moderator Bego Mario Garde

    (@pixolin)

    Es tut mir leid, aber es sprengt den Rahmen unseres Support-Forums, hier Grundkenntnisse zu vermitteln.

    Bitte schau dir mal die PHP-Referenz an, insbesondere header:

    Beachten Sie, dass Sie die Funktion header() aufrufen müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken. Es handelt sich hier um einen typischen Fehler, der zum Beispiel auftritt, wenn Sie Code mittels include oder require oder einer anderen Dateizugriffs-Funktion einlesen, die Leerzeichen oder Leerzeilen enthalten, die ausgegeben werden, bevor header() aufgerufen wird. Das gleiche Problem kann auch auftreten, wenn Sie eine Datei verwenden, in der HTML und PHP vermischt wurden.

    Zu deiner Bemerkung „… da es sich um mein eigenes Theme handelt und um eine Intranet-Seite handelt, ist die „Gefahr“ zu vernachlässigen.“

    Du kannst WordPress nach Belieben nutzen und auch ändern, wie du magst. Wir versuchen hier allerdings, „good practice“ zu vermitteln und deshalb weise ich auf Fehler auch hin, ohne ausdrücklich danach gefragt zu werden. Wir möchten hier keinen kostenlosen Individual-Support leisten, sondern möglichst vielen AnwenderInnen helfen. Was du für dich anders entscheidest ist mir herzlich egal.

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)