PDF Erstellung

Morgen, wie funktioniert im Backend die PDF Belegerstellung. Ich meine nicht die Anweder-Seite, sonder von der Programmierung her? Was wird verwendet? Ich würde gerne eine eigene PDF Erstellung erstellen. Aber bevor ich auf PDFlib etc. zurückgreife, was ich evtl. erst auf dem Server installieren/konfigurieren muss, wollte ich wissen, wie ihr das macht? Danke

Wir machen das mit mpdf - schau dir mal shopware/components/Document.php an - dort speziell die Render-Funktionen.

Okay. Danke. Hat mir schon weiter geholfen. Nun noch was. Ich mache z.B. auf der Detail-Seite einen Button PDF. Nun möchte ich, dass mit dem Klicke meine PHP Seite aufgerufen wird und die Template Datei /detail/index_pdf.tpl geladen wird bzw. in einer Variable der PHP Datei geladen wird. So dass ich die PDF erstellen kann: [code]<?php $html = ‘gepaster Inhalt der index_pdf.tpl Datei’;

include(“engine/Enlight/Vendor/mpdf/mpdf.php”);
$mpdf=new mPDF(‘c’);
$mpdf->mirrorMargins = true; $mpdf->SetDisplayMode(‘fullpage’,‘two’); $mpdf->WriteHTML($html); $mpdf->Output(); exit; ?> [/code]

Hey Stefan, ich bin ein Schritt weiter, aber es klappt nicht ganz: $data = $this-\>\_template-\>fetch("templates/\_default/documents/index\_test.tpl",$this-\>\_view); include("engine/Enlight/Vendor/mpdf/mpdf.php"); $mpdf = new mPDF("win-1252","A4","","","","","",""); $mpdf-\>WriteHTML(utf8\_encode($data)); $mpdf-\>Output(); exit; So erhalte ich eine weiße Seite und es passiert nichts. Verzichte ich auf $data und versuch es einfach mit $mpdf->WriteHTML(utf8_encode(„Test Text“)); so habe ich eine PDF mit dem Text. Wo liegt mein Fehler bei dem Fetch?

Ich komme hier nicht weiter. Sobald ich mit $this-\>\_template-\>fetch("templates/\_default/documents/index\_test.tpl",$this-\>\_view); arbeite, erhalte ich nur eine weiße Seite. Was stimmt an dem Syntax nicht? Ein echo $data gibt bei mir auch nichts aus! In der shopware/components/Document.php wird dies ja auch so verwendet: $mpdf = new mPDF("win-1252","A4","","",$this-\>\_document["left"],$this-\>\_document["right"],$this-\>\_document["top"],$this-\>\_document["bottom"]); $mpdf-\>WriteHTML(utf8\_encode($data)); $mpdf-\>Output(); exit;

1 Like

Moin avenger, daran liegt es auch nicht. Das Beisiel welches ich gepostet habe liegt im Template Ordner, daher ist der Pfad anderst. Meine Datei liegt direkt im Shopwareordner. Der PFad sollte eig. stimmen :frowning: @Stefan Habt ihr noch einen Tipp?

Wie sieht dein Code aktuell aus und WO genau führst du den aus - also in welcher Datei? Existiert $this->_template beid ir überhaupt? Das ist doch ein spezifisches Property der Dokument-Komponente, das kannst du ja nicht einfach 1 zu 1 so in einen Controller übernehmen…

Meine Datei liegt zum Test direkt im Shopware-Hauptordner und ich rufe diese im Moment mit einem direkten Aufruf auf. Inhalt: [code]<?php $data = fetch(“templates/_default/documents/index_test.tpl”);

include(“engine/Enlight/Vendor/mpdf/mpdf.php”);
$mpdf = new mPDF(“win-1252”,“A4”,"","","","","","");
$mpdf->WriteHTML(utf8_encode($data)); $mpdf->Output(); exit; ?> [/code] Hier sollte doch nun in der PDF einfach der Inhalt aus index_test.tpl sein. 1:1 ohne Werte aus der DB natürlich.

Aber das fetch kann doch nicht gehen - du hast doch in der Datei so gar keinen Zugriff auf Smarty oder eine Fetch-Methode?! Du könntest die Datei direkt auslesen - also z.B. $data = file_get_contents(„templates/_default/documents/index_test.tpl“); Dann sollte die PDF-Erzeugung als solches klappen - alles dynamische erfordert an der Stelle weitere Eingriffe!

[quote=“Stefan Hamann”]Aber das fetch kann doch nicht gehen - du hast doch in der Datei so gar keinen Zugriff auf Smarty oder eine Fetch-Methode?! Du könntest die Datei direkt auslesen - also z.B. $data = file_get_contents(“templates/_default/documents/index_test.tpl”); Dann sollte die PDF-Erzeugung als solches klappen - alles dynamische erfordert an der Stelle weitere Eingriffe![/quote] Aber er braucht doch ein gerendertes tpl (=HTML), und nicht das tpl selbst, oder sehe ich das falsch?

@avanger Das war nur ein kleiner Versuch. Jetzt habe ich in meiner PDF nur den Quellcode. Okay, jetzt ging es. Wenn ich es jetzt in der natürlichen Shopware-Umgebung nutzen wollte müsse ich das Script z.B. als Plugin schreiben. Dann würde meine PHP Datei (mit der mpdf anweisung) z.B. unter community/frontend/MeinPlugin liegen. Nun würde ich über das Templates z.B. einen Button auf der Artikeldetailseite einfügen und dieser verweist dann auf die PHP Datei im Plugin. Oder muss ich das dann über einen Controller machen?

Das sollte man über einen Controller lösen - ist sauberer!

[quote=„Stefan Hamann“]Das sollte man über einen Controller lösen - ist sauberer![/quote] Danke für deine AW. Bin ich blind oder gibt es noch kein Tutorial über Controller? Kannst du mir hier einen Tipp geben?

$event = $this-\>createEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_Test', 'onGetControllerPath'); $this-\>subscribeEvent($event); public static function onGetControllerPath(Enlight\_Event\_EventArgs $args) { return dirname(\_\_FILE\_\_) . '/Test.php'; } <?php class Shopware_Controllers_Frontend_Test extends Enlight_Controller_Action { public function indexAction(){ $this->View()-\>setTemplate(); die("Hello World"); } } Aufruf: http://www.deinshop.de/Test/index

Vielen Dank. Und der Aufruf bzw. Link würde ich dann nicht auf htt://www.meinshop.de/test/index machen sondern so? {url module=frontend controller=test action=indexAction}

Ja - nur dsa Action hinter index weglassen

[quote=“Stefan Hamann”]Ja - nur dsa Action hinter index weglassen[/quote] Hallo Stefan, also das mit dem Controller etc. hat alles bestens funktioniert. Danke dir :slight_smile: Nun habe ich mal versucht aus deinem Code für mich was abzuleiten. Aus deinem public function indexAction(){ $this-\>View()-\>setTemplate(); die("Hello World"); } Habe ich folgendes gemacht $this-\>View()-\>setTemplate(); public $\_order; public $\_template; public $\_view; public $\_config; protected $\_compatibilityMode = false; protected $\_renderer = "html"; protected $\_valuesAssigend = false; public $\_subshop; public $\_defaultPath = "templates/\_default"; protected $\_preview = false; protected $\_typID; protected $\_document; protected $\_documentID; protected $\_documentRowID; protected $\_documentHash; protected $\_documentBid; $data = $this-\>\_template-\>fetch("documents/index\_test.tpl",$this-\>\_view); include\_once(Shopware()-\>OldPath()."engine/Enlight/Vendor/mpdf/mpdf.php"); //include("engine/Enlight/Vendor/mpdf/mpdf.php"); $mpdf = new mPDF("win-1252","A4","","","","","",""); $mpdf-\>WriteHTML(utf8\_encode($data)); $mpdf-\>Output(); exit; Geht natürlich nicht. Aber dachte ich mir schon. Wenn ich aber nun das ganze oben mit $DATA weglasse und einfach versuche einen TextString in PDF zu erstellen, habe ich auch kein Erfolg. Woran liegt das bzw. warum wird mein Code nicht ausgeführt, aber die(“Test”) wird ausgeführt? Danke

Moin Stefan, da ich weiß, dass du/ihr morgens eher aktiv seid, hier noch mal meine Anliegen :wink: Wo liegt mein Denkfehler bzw. warum wird der Code nicht ausgeführt?

Möchte dir ja nicht zu nahe treten, aber da fehlen echt noch ein paar grundsätzliche Dinge im Verständnis des OOP-Models von PHP. $this-\>View()-\>setTemplate(); public $\_order; public $\_template; public $\_view; public $\_config; protected $\_compatibilityMode = false; protected $\_renderer = "html"; protected $\_valuesAssigend = false; public $\_subshop; public $\_defaultPath = "templates/\_default"; protected $\_preview = false; protected $\_typID; protected $\_document; protected $\_documentID; protected $\_documentRowID; protected $\_documentHash; protected $\_documentBid; $data = $this-\>\_template-\>fetch("documents/index\_test.tpl",$this-\>\_view); include\_once(Shopware()-\>OldPath()."engine/Enlight/Vendor/mpdf/mpdf.php"); //include("engine/Enlight/Vendor/mpdf/mpdf.php"); $mpdf = new mPDF("win-1252","A4","","","","","",""); $mpdf-\>WriteHTML(utf8\_encode($data)); $mpdf-\>Output(); exit; Du kannst ja nihct einfach Objekt-Variablen innerhalb von Methoden deklarieren - genauso wenig kannst du erwarten, dass durch eine einfache Variablen-Definition, die Variable automatisch mit einem Inhalt bestückt wird. Also wenn du $this->_template aufrufst oder auch $this->_view - woher sollen diese Werte kommen? Du hast die maximal (falsch) definiert - einen Wert haben die aber so oder so nicht? Also meiner Meinung nach, solltest du dir zunächst noch mal ein paar Grundlagen-Tutorials im Bereich Objektorientierung und PHP ansehen - also es lässt sich natürlich nicht alles von A nach B per Copy & Paste funktionsfähig kopieren :slight_smile: Da muss man verstehen, was die Logik dahinter ist und wie man diese ggf. migrieren kann. Bzw. wenn Copy & Paste dann vollständig - sprich die Klassen-Variablen an der >richtigen< Stelle deklarieren und dann im Original prüfen, wo und wie diese gesetzt werden. In deinem Fall speziell _template und _view.