PDFs mit dompdf und Codeigniter

Ich war etwas auf der Suche ehe ich mich für dompdf entschieden habe. Warum? Es scheint am häufigsten benutzt zu werden und sollte somit noch ne Weile aktuell bleiben. Ich werde es ja sehen.

Außerdem ist es sehr sehr einfach. Man kann mit dompdf schlicht ein html-Dokument übergeben und dompdf macht daraus ein PDF, welches abgelegt wird oder direkt heruntergeladen werden kann.

Nun verwende ich für mein aktuelles Projekt Codeigniter. Ich war auf der Suche, wie man das nun bequem integrieren kann und habe nach etwas probieren mich für einen sehr simplen weg entschieden. Man könnte dompdf sicher in eine Library packen oder vielleicht als Driver bezeichnen und entsprechend verwenden, es gibt aber auch den Folder third_party und der hats mit angetan 🙂

Download dompdf

Das ganze gibt es hier (https://github.com/dompdf/dompdf) und kommt in den /application/third_party/ Ordner von Codeigniter. Ich habe das Verzeichnis noch von dompdf-master/ auf dompdf/ umbenannt.

Download font-lib-php

Mir warf dompdf beim ersten Versuch einen Fehler:

Warning: require_once(/var/www/dompdf-master/lib/php-font-lib/classes/font.cls.php): failed to open stream: No such file or directory in /var/www/dompdf-master/dompdf_config.inc.php on line 335
Fatal error: require_once(): Failed opening required ‚/var/www/dompdf-master/lib/php-font-lib/classes/font.cls.php‘ (include_path=‘.:/usr/share/php:/usr/share/pear‘) in /var/www/dompdf-master/dompdf_config.inc.php on line 335

Auslöser ist das fehlende font-lib-php. Also herunterladen (https://github.com/PhenX/php-font-lib). Im Ordner /application/third/party/dompdf/lib/php-font-lib den Ordner classes/ erstellen und den Inhalt von src/FontLib reinkopieren.

Includen

Wie gesagt, ich habe es mir einfach gemacht. Ich include einfach dompdf in der Methode, in der ich es brauche.

class Abrechnung extends CI_Controller {

    public function pdf()
    {
        
        require_once APPPATH.'third_party/dompdf/dompdf_config.inc.php';
        
        $data = '';
        
        $dompdf = new DOMPDF();
        $html = $this->load->view('abrechnung/pdf', $data, TRUE);
        $dompdf->set_paper('a4','portrait');
        $dompdf->load_html($html);
        $dompdf->render();
        $dompdf->stream("name.pdf");

    }
    
}

Das war es im Grunde schon. In diesem Code fülle ich das PDF noch mit einer HTML-Datei. Die Formatierung sieht noch etwas verunglückt aus, aber der Code wird ausgeführt und mein HTML angezeigt. Hübschmachen kommt jetzt 🙂

Beim herumexperimentieren hatte ich den Fehler

Fatal error: Uncaught exception ‘DOMPDF_Exception’ with message ‘An input file is required (i.e. input_file _GET variable).

Das passiert, wenn man anstelle der config-datei dompdf.php includiert. Also besser nicht machen 😉

 

Quellen

https://kyokasuigetsu25.wordpress.com/2011/02/09/how-to-use-dompdf/
http://stackoverflow.com/questions/17999091/how-do-i-get-dompdf-to-display-my-codeigniter-view-correctly
http://stackoverflow.com/questions/15028250/dompdf-fails-to-load

ownCloud 8 auf QNAP HS-210

Hier und da liest man, das dies und jenes nicht ginge wenn man ownCloud 6 oder 7 auf dieser oder jener Qnap-Hardware zum laufen bringen möchte. Ein bisschen Zweifel hatte ich deshalb ja schon, hab es dann heute aber trotzdem mal angegangen. Und? Alles ohne Probleme! ownCloud 8 läuft jetzt auf meinem HS-210 und das ganz ohne Stress und recht flott.

Mein How-To:

  • Im Appcenter die Beta PHP Installation installieren
  • Im Appcenter phpMyAdmin installieren (nicht zwingend)
  • ownCloud herunterladen (komplett, nicht den Installer) – (https://download.owncloud.org/download/community/owncloud-latest.zip) und entpacken
  • Per FTP als admin auf die HS-210
  • Allen Kram hochladen (.htaccess nicht vergessen)
  • In der Zwischenzeit einen MySQL-User und -DB erstellen
  • Die Installation von ownCloud mit Admin- und DB-Daten anlegen vervollständigen
  • In der .htaccess noch ein „php_value default_charset UTF-8“ hinzufügen

Fertig. Sieht nach viel aus, ist aber in 20 Minuten erledigt. Es muss keine Systemdatei angefasst werden oder etwas in der Art. Viel Spaß 🙂

Formularfelder mit jQuery hinzufügen

Die Frage, die schon 1000 mal gestellt und beantwortet wurde 😀 Ich kann kein JS und musste selbst suchen und probieren bis es einigermaßen geklappt hat. Ausschlaggebend war das folgende, einfache und kleine Script.

http://jsfiddle.net/fkvBt/

Zur Anwendung in einem Bootstrap-Formular musste ich es etwas modifizieren. Hier sind ein paar mehr DIVs im Spiel.

<div class=“input form-group“>
<label for=“einheit“>Einheit <span class=“number“>1</span></label>
<div class=“row“>
<div class=“col-sm-8″>
<input type=“text“ class=“form-control“ id=“einheit“ name=“einheit[]“>
</div>
<div class=“col-sm-3″>
<input type=“text“ class=“form-control“ id=“einheit“ name=“text[]“>
</div>
<div class=“col-sm-1″>
<input type=“text“ class=“form-control“ id=“einheit“ name=“text[]“>
</div>
</div>
</div>

Im Script muss nun der Name des input-Divs angepasst werden, ich habe da noch form-group integriert, und beim onclick zum entfernen funktioniert parent() nicht, also suche ich mit closest()

<script language=“JavaScript“>
$(function(){
$(‚#add‘).on(‚click‘,function(){
var fields = $(‚#form‘).find(‚.input.form-group‘).length+1;
var html ='<div class=“input form-group“><label for=“einheit“>Einheit <span class=“number“>’+fields+'</span></label><div class=“row“><div class=“col-sm-7″><input type=“text“ class=“form-control“ id=“einheit“ name=“einheit[]“></div><div class=“col-sm-3″><input type=“text“ class=“form-control“ id=“einheit“ name=“qm[]“></div><div class=“col-sm-1″><a class=“btn btn-default“ id=“remove“ role=“button“>-</a></div></div></div>‘;
$(„#add“).before(html)
})

$(‚#form‘).on(‚click‘,’#remove‘,function(){
$(this).closest(‚.input.form-group‘).remove();
$(‚#form‘).find(‚.input.form-group‘).each(function(i){
$(this).find(‚.number‘).text(i+1);
})
})
})
</script>

Autoupload beim Speichern mit Aptana 3

Jedes mal das selbe: Wenn ich ein Projekt in Aptana anlege, finde ich den blöden Haken fürs Autoupload nicht. Die Funktion ist praktisch wenn man keinen Server lokal installieren mag. Beim Sichern einer Datei wird sie automatisch auf den Server übertragen und man kann die Änderung testen.

Also, hier meine Erinnerung an mich:

  • Projekt anlegen
  • Ggf. FTP-Verbindung anlegen
  • Auf jeden Fall Web-Deploy einrichten -> und zack, haken gefunden!

Bootstrap-Themes und andere UI-Kits for free

Mir jeder neuen Idee bin ich auf der Suche nach einem neuen Theme. Jedes mal dauert es ne Weile und nach kurzer Zeit laufen einem immer wieder die selben üblichen Verdächtigen Themes über den Weg. Und dann, irgendwann, findet man doch ne Hand voll neue. So auch bei den Bootstra-UI-Kits.

Damit die Auswahl etwas größer wird, hier ein paar Seiten:

http://www.designmaz.net/best-free-html-css3-ui-kits/

http://www.blacktie.co/

http://www.freshdesignweb.com/free-bootstrap-templates.html

http://www.fusionplate.com/2930/best-free-bootstrap-html5-website-templates/

http://shapebootstrap.net/item-category/html/

http://webdesigncone.com/2014/free-bootstrap-templates/

Und ein paar Themes:

http://pixelkit.github.io/PixelKit-Bootstrap-UI-Kits/ (Mit Geldverdienungsoption)

Lasttests mit jMeter

Nachdem wir über am letzten Wochenende bei uns im Projekt auf ein Problem mit den Datenbankconnections gestoßen sind und wir permantente Ausfälle einzelner Terminals hatten, mussten wir in den letzten Tagen die Ursache finden.

Wir haben die Connectens reduziert und wir haben versucht, das Problem zu simulieren. Dabei haben wir zunächst auf uBot gesetzt und viele Clients simuliert, die mit jedem Klick die Datenbank belastet haben. Ohne Ergebnis. Dann habe ich versucht, die Datenbank einfach mit einem Script zu überlasten. Ebenfalls ohne Ergebnis.

Dann haben wir jMeter eingesetzt und es geschafft, bei 100 simultanen Zugriffen die Datenbank irgendwie in die Knie zu zwingen. Im Grunde hatten wir 300 Connections pro Sekunde. Die Datenbank läuft stabil, bis die dann nach 4 Minuten sich für eine Minute verabschiedet. Seltsam.

So jedenfalls habe ich jMeter kennengelernt. jMeter ist in Java geschrieben und wird von der Apache Foundation bereitgestellt. Mit dem Programm kann man Zugriffe auf HTTP-Ebene simulieren und ziemlich viel Schweinereien machen 🙂 Wer also Lasttests machen will, der sollte sich in das echt komplizierte Programm einarbeiten. Es gibt kleine Tuts bei Youtube, die reichen für den Anfang. Im Grunde kann man damit aber auch Webshops testen und z.B. einkäufe tätigen, in dem man die POSTs simuliert. Man könnte auch hergehen und alle Links einer Seite sammeln, in eine CSV packen, randomisieren und aufrufen. Oder oder oder. Geniales teil jedenfalls, ich werde in Zukunft einige Tests damit automatisieren!

http://jmeter.apache.org/