2016-04-13 15 views
1

Ich habe ein Projekt, wo Menschen Orte auf Veranstaltungen buchen können. Es gibt Dutzende von Veranstaltungen. Ich wurde gebeten, einen Bericht zu erstellen, der die Teilnehmer auflistet, damit sie an der Tür eingecheckt werden können. Da es so viele Ereignisse gibt, möchte ich dem Bearbeitungsformular für jedes Ereignis (innerhalb des CMS) eine Schaltfläche "Teilnehmerbericht" hinzufügen. Ich habe den Button erstellt, und es funktioniert.Generieren von CSV aus CMS EditForm

ABER ... anstatt die Daten in einer CSV zu bekommen, bekomme ich die (korrekten) Daten im CMS angezeigt, als ob es echoed wäre.

Hier ist meine Funktion

public function getCustomersForEvent ($ data, $ form) {

$attendees = CustomerOrderLine::get()->filter(array("EventID" => $data["ID"])); 

    if(!$attendees){ 
     return false; 
    } 

    $fileName = "report.csv"; 

    $separator = ","; 
    $csvColumns = array("ID", "Description", "Customer"); 

    $fileData = ""; 

    foreach($attendees as $row){ 
     $fileData .= $row->Event()->EventName . $separator; 
     $fileData .= $row->CustomerOrder()->Customer()->FirstName . " " . $row->CustomerOrder()->Customer()->Surname . "\n"; 
    } 

    return SS_HTTPRequest::send_file($fileData, $fileName, 'text/csv'); 
} 

Ich habe in diesem http://www.silverstripe.org/community/forums/general-questions/show/15325 einen Blick hatte, aber die Daten hallte ohnehin in das CMS.

Kann mir bitte jemand sagen, was ich falsch mache? Wie gesagt, die Daten sind in Ordnung, aber ich bekomme den CSV-Öffnen- oder Speichern-Dialog nicht.

+0

Vielleicht müssen Sie einen Inhalt Disposition Header vor dem Senden der Ausgabe –

+0

setzen. . Nein, es wird immer noch als Text auf dem CMS ausgegeben. – user3769009

Antwort

2

Die Lösung wird darin sein, wie Sie dies nennen. Ich würde empfehlen, dass Sie einen kompletten neuen Controller machen oder ein Modul ändern wie ...

https://github.com/axyr/silverstripe-phpexcel

... wo Sie den PHP-Code kopieren und ändern es nur die Daten, die Sie von oben benötigen zurückzukehren.

Um einen Controller, die nur auf das Herunterladen einer Datei ...

class CustomersForEvent_Controller extends Page_Controller { 

    private static $allowed_actions = array (
     'downloadcsv', 
    ); 

    public function downloadcsv() { 
     return SS_HTTPRequest::send_file("my content",'myfile.csv','text/csv'); 
    } 

} 

und dass die Steuerung zu den Routen hinzufügen in _config/config.yml ...

Director: 
    rules: 
    'attendees': 'CustomersForEvent_Controller' 

konzentriert. ..und dann können Sie einfach auf yousite.com/attendees/downloadcsv verlinken

Dies wurde lokal getestet und bestätigt zu arbeiten

+0

Es wird innerhalb des CMS funktionieren? Ich werde mir das ansehen. In der Zwischenzeit habe ich das Problem irgendwie gelöst, indem ich Dinge in einer Datei gespeichert habe (eine pro Mitglied, die einen Bericht generiert) und dann einen Sprintf-Link an die Datei zurücksende. Aber es ist so hässlich wie Hausgemachte Sünde, also werde ich auf Ihre Antwort schauen. – user3769009

+0

ja beide Lösungen "arbeiten im CMS" aber auf andere Art und Weise - das Modul zeigt, wie man einen Knopf dafür anpasst/macht.Der benutzerdefinierte Controller ist so konzipiert, dass Sie einen Link (mit target = "_blank") zu ihm machen können und dass der Download für im Grunde die gleiche UX – Barry

0

Wird dieser Bericht vom CMS selbst generiert? Wenn ja, haben Sie eine ModelAdmin zum Verwalten von CustomerOrderLine Objekten? Wenn ja, können Sie die GridField-Schaltfläche "In CSV exportieren" nicht verwenden?

Um mehr als nur die vom GridField angezeigten Felder auszugeben, müssen Sie die $getExportFields() Methode Ihrer Modellklasse erstellen/ändern, um ein Array aller Felder in Ihrem Modell, in das Sie exportieren möchten, zurückzugeben diese Art und Weise.

+0

Ja, es ist in der CMS generiert werden und ja, ich habe eine Arbeit ModellAdmin. Der Grund, warum ich nicht glaube, dass ich den GridFieldExportButton verwenden kann, ist, weil ich versuche, eine Liste von Leuten zu erhalten, die an * einem * Ereignis teilnehmen, nicht die ganze Liste. So würde der Benutzer in ModelAdmin gehen, einen Datensatz auswählen, und die Schaltfläche befindet sich in der EditForm. Ich kann einen CSV-Bericht erstellen, aber ich kann nicht den üblichen "Öffnen oder Speichern" -Dialog erhalten. – user3769009

+0

Seltsam über das Nicht-Erscheinen des Speichern-Dialogs. Wenn Sie wissen wollten warum, schauen Sie sich die Browser-Header an, die Sie mit dem WebServer und Ihren Browser-Tools kaufen. Abgesehen davon, sehe ich, was Sie versuchen zu tun - Sie wollen eine Export-Taste für _jedes GridField row_ richtig? Es ist eine Frage der Erstellung einer neuen Implementierung von 'GridField_ActionProvider'. Sehen Sie sich einen an, den ich vor einigen Jahren für das Advanced Workflow Modul gemacht habe. Sieht aus, als müsste es genau das tun, was du brauchst? https://github.com/silverstripe-australia/advancedworkflow/blob/master/code/forms/gridfield/GridFieldExportAction.php – theruss

Verwandte Themen