+ Antworten
Ergebnis 1 bis 2 von 2

Thema: FPDF in Komponenten

  1. #1
    5ky
    5ky ist offline
    Neu an Board
    Registriert seit
    26.07.2010
    Beiträge
    48
    Bedankte sich
    5
    Erhielt 3 Danksagungen
    in 3 Beiträgen

    Standard FPDF in Komponenten

    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:
    HTML-Code:
    JToolBarHelper::custom('export_overview_pdf', 'pdf_button.png', 'pdf_button.png', 'PDF Export', false);
    Wie ersichtlich ist, handelt es sich um den Task "export_overview_pdf", welchen ich separat in meinem Controller angelegt habe.

    Hier der zugehörige Controller:
    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);
    
        }
    
    }
    Mit dem letzten Aufruf overview_pdf() rufe ich eine Funktion außerhalb meiner Controllerklasse auf.

    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');
    
    }
    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.

    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:
    HTML-Code:
    // Weiterleitung
    $this->setRedirect('index.php?option=com_meinekomponente&view=customers', $msg);
    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.

    Ich würde mich über eine Lösung tierisch freuen.

    MfG
    5ky

  2. Erhielt Danksagungen von:


  3. #2
    Neu an Board Avatar von Medialekt
    Registriert seit
    05.11.2010
    Ort
    Saal a.d. Donau
    Beiträge
    26
    Bedankte sich
    8
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Hat jemand ne Lösung? Habe auch dieses Problem.
    Geändert von Medialekt (02.01.2011 um 08:25 Uhr)
    MfG Roland
    www.medialekt.de - Webdesign, Web-Anwendungen, Webhosting, Mediendesign, IT Hardware & Software
    www.webdesign-facts.de - Blog-Seite rund um Webdesign

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein