Hey,
ich habe derzeit ein kleines Problemchen.
Ich will mal versuchen, es so deutlich wie möglich zu beschreiben, auch wenn der Thread dadurch etwas länger werden könnte.
In meiner Komponente wird eine Übersichtsliste von Kunden angezeigt. Hier kann ich ganz gewöhnlich Neue Einträge anlegen, vorhandene bearbeiten, Freigeben, Sperren, nach oben oder unten schieben etc. Nichts besonderes.
Ich habe einen zusätzlichen Button in der view.html.php eingefügt:
Wie ersichtlich ist, handelt es sich um den Task "export_overview_pdf", welchen ich separat in meinem Controller angelegt habe.HTML-Code:JToolBarHelper::custom('export_overview_pdf', 'pdf_button.png', 'pdf_button.png', 'PDF Export', false);
Hier der zugehörige Controller:
Mit dem letzten Aufruf overview_pdf() rufe ich eine Funktion außerhalb meiner Controllerklasse auf.HTML-Code:// JController erweitern class MeinekomponenteControllerCustomers extends MeinekomponenteController { ... andere Funktionen ... // public function export_overview_pdf() { // Token Sicherheits-Überprüfung JRequest::checkToken() or JExit('Invalid Token'); // Model vorbereiten $model = $this->getModel('customers'); // $post = $model->getCustomers(); // Freigabe ermitteln und ins Array eintragen if ( $post[published] == 1 ) { $post[0]->published_text = 'Freigegeben'; } else { $post[0]->published_text = 'Gesperrt'; } overview_pdf($post); } }
Hier seht ihr vermutlich schon, weshalb ich die Funktion außerhalb der Controller-Klasse machen musste, da ich eben für meine Kopf- und Fußzeilen die FPDF Klasse class PDF extends FPDF benötige.HTML-Code:// Funktion für die PDF-Übersicht function overview_pdf($post) { /* * FPDF */ // Komponentenpfad für die FPDF Klassen $path = JPATH_COMPONENT_ADMINISTRATOR.DS.'assets/fpdf'; define('FPDF_INSTALLDIR', $path); // FPDF Klasse und Schriftordner einbinden if(!defined('FPDF_FONTPATH')) define('FPDF_FONTPATH', FPDF_INSTALLDIR.'/font/'); include(FPDF_INSTALLDIR.'/fpdf.php'); // Benutzedefinierte Klasse auf Basis von FPDF class PDF extends FPDF { // Kopfzeile function Header() { $this->Image(JPATH_COMPONENT_ADMINISTRATOR.DS.'assets/images/logo.jpg',260,8,25); $this->SetFont('Courier','B',7); $this->SetX(10); $this->Cell(40,10,'Kundennummer: '); ... weitere hier nicht relevante Angaben ... } // Fußzeile function Footer() { // Über dem unteren Seitenrand positionieren $this->SetY(-15); // Schriftart festlegen $this->SetFont('Courier','B',8); $this->Cell(0,10,'Seite '.$this->PageNo().'/{GesamtanzahlSeiten}',0,0,'C'); } } // Neue PDF Datei $pdf=new PDF('L'); $pdf->AddPage(); $pdf->SetFont('Courier','B',8); $pdf->AliasNbPages('{GesamtanzahlSeiten}'); $pdf->SetFont('Courier','',6); // Kunden zählen und ausgeben for ($c=0; $c < count($post); $c++) { $pdf->SetX(10); $pdf->Cell(40,10,$post[$c]->number); $pdf->Ln(4); ... weitere hier nicht relevante Angaben ... } // PDF Name $file = 'customers.pdf'; // PDF Datei Download $pdf->Output($file, 'D'); }
Der Quelltext funktioniert so wie er ist und mit der letzten Zeile: $pdf->Output($file, 'D'); weise ich den Browser an, einen Dialog zu öffnen, in welchem ich die Datei herunterladen kann bzw. gleich in einem Programm öffnen kann.
Der Haken an der Geschichte ist der, dass die Anweisung D in meinem Output wohl mit einem exit(); endet. Ich habe die Variante selbst schon durchgespielt und ohne die Exit Anweisung erscheint der Dialog nicht.
Der Fehler ist folgender.
Ich öffne meine Übersicht. Meine Pagination zeigt mir die ersten 20 Kunden an. Hier klicke ich auf die PDF-Funktion und mir wird das File mit den 20 Kunden erzeugt.
Nun stell ich "als dummer Anwender" fest, dass ich ja viel mehr drin habe. Desshalb will ich nun die Ansicht der Pagination auf ALLE stellen. Beim Change wird mir jedoch nicht die Übersicht auf ALLE aktualisiert, sondern der Download Dialog erscheint wieder um die PDF herunterzuladen. Gleiches Szenario gilt, wenn ich nun die Seite wechseln möchte in der Pagination.
Ich muss erst die komplette Ansicht erneut laden bzw. eine andere Funktion z.B. bearbeiten o.ä. wählen, damit ich die Pagination verändern kann. Wie gesagt das ganze ist nur dann, wenn ich schonmal die PDF-Funktion aufgerufen habe. Ist dem nicht so, kann ich normal mit der Pagination arbeiten.
Sofern ich im Controller nach dem Funktionsaufruf ein:
setze, aktualisiert mir der Browser die Ansicht natürlich wieder korrekt und ich kann wieder arbeiten, da aber die Adressleiste verändert wurde, funktioniert die PDF-Ausgabe nicht mehr. Das Thema kann in DIESEM Beitrag nachgelesen werden.HTML-Code:// Weiterleitung $this->setRedirect('index.php?option=com_meinekomponente&view=customers', $msg);
Ich würde mich über eine Lösung tierisch freuen.
MfG
5ky


LinkBack URL
About LinkBacks
Zitieren

Lesezeichen