Ich habe mich im Rahmen eines aktuellen Projektes mit dem Layouting eines HTML File-Feldes beschäftigt und hierbei einige Zeit verbracht. Vielleicht kann der eine oder andere hiervon etwas gebrauchen, auch wenn es sich nicht primär um TYPO3 handelt.
TYPO3 News, Development & Insider Infos
Ich habe mich im Rahmen eines aktuellen Projektes mit dem Layouting eines HTML File-Feldes beschäftigt und hierbei einige Zeit verbracht. Vielleicht kann der eine oder andere hiervon etwas gebrauchen, auch wenn es sich nicht primär um TYPO3 handelt.
In dem aktuellen Podcast stellen Patrick Lobacher und Jens Hoffmann Funktionen von ExtBase vor. Gestartet bei der bereits verfügbaren Dokumentation von Forge, geht es weiter in die Details. Als Basis Extension kann die efempty-Extension benutzt werden. Hier sind die Basis-Implementierungen von ExtBase (Controller, Model, ViewHelpers etc.) enthalten, mit denen man „rumspielen“ kann. An einigen Beispielen und Fragen wird einem dann ExtBase „schmackhaft“ gemacht 🙂
Den Podcast gibt es wie immer auf der Podcast-Seite oder hinter diesem Direktlink.
Fakten:
Buchtitel: Das TYPO3 Profihandbuch: Der Leitfaden für Entwickler und Administratoren zu Version 4.3
Verlag: Addison-Wesley
Ausgabe: 1. Auflage
Erscheinungsjahr: 2010
ISBN: 978-3827328342
Umfang: Ca. 680 Seiten
Preis: 49,95 €
Momentan unterstützt ExtBase noch keine file upload magie. Daher ist man gezwungen das ganze händisch zu machen. Der Aufwand dafür hält sich allerdings in Grenzen.
Grundsätzlich muß man in der entsprechenden Controller Action manuell $_FILES auswerten, das temporäre Upload File an die richtige Stelle verschieden und das betreffende Model Property setzen.
In Code sieht das dann etwa so aus:
public function createAction(Tx_Example_Domain_Model_Article $newArticle) { if ($_FILES['tx_example_article']) { $basicFileFunctions = t3lib_div::makeInstance('t3lib_basicFileFunctions'); $fileName = $basicFileFunctions->getUniqueName( $_FILES['tx_example_article']['name']['newArticle']['image'], t3lib_div::getFileAbsFileName('uploads/tx_example/')); t3lib_div::upload_copy_move( $_FILES['tx_example_article']['tmp_name']['newArticle']['image'], $fileName); $newArticle->setImage(basename($fileName)); } ... ... } |
public function createAction(Tx_Example_Domain_Model_Article $newArticle) { if ($_FILES['tx_example_article']) { $basicFileFunctions = t3lib_div::makeInstance('t3lib_basicFileFunctions'); $fileName = $basicFileFunctions->getUniqueName( $_FILES['tx_example_article']['name']['newArticle']['image'], t3lib_div::getFileAbsFileName('uploads/tx_example/')); t3lib_div::upload_copy_move( $_FILES['tx_example_article']['tmp_name']['newArticle']['image'], $fileName); $newArticle->setImage(basename($fileName)); } ... ... }
Natürlich kann man das ganze noch in eine seperate Controller Funktion oder einen FileUpload Service abstrahieren und mit entsprechenden Exceptions sichern, aber das Beispiel hier dient ja nur dazu den grundsätlichen Ansatz zu verdeutlichen.
Der passend view code fuer das Beispiel oben sieht so aus:
<f:form enctype="multipart/form-data" method="post" controller="Article" action="create" name="newArticle" object="{newArticle}"> <f:form.upload property="image" /> ... ... </f:form> |
<f:form enctype="multipart/form-data" method="post" controller="Article" action="create" name="newArticle" object="{newArticle}"> <f:form.upload property="image" /> ... ... </f:form>
Update 20.10.2011
Es gibt einige Besonderheiten im Hinblick auf die PHP Einstellungen post_max_size und upload_max_filesize zu beachten:
Liegt man mit dem Upload über post_max_size so ist sowohl $_FILES als auch $_POST leer, weil PHP die Daten „wegschmeisst“. Das führt natürlich dazu, dass der Controller sich darüber mit
„Required property ‘whatever’ does not exist“ beschwert.
Man kann sich hier spontan behelfen indem man:
A. Den Wert von post_max_size erhöht und upload_max_filesize beibehält. Oder
B. Die Annotation des Properties auf NULL|Tx_Whatever und den default Wert auf NULL setzt und dann im Controller eine detailierte Fehler Auswertung macht.
Die 2te Variante wirft allerdings das Problem auf, dass man nicht wirklich Rückschlüße auf den aufgetretten Fehler ziehen kann.
So kann $whatever === NULL bedeuten, dass der Upload zu gross war oder aber der entsprechende Parameter im Request gar nicht enhalten war.
Als Notlösung kann man hier die CONTENT_LENGTH herranziehen:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&; $_SERVER['CONTENT_LENGTH'] > 0) |
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&; $_SERVER['CONTENT_LENGTH'] > 0)
Möglicherweise ist das etwas, das das Framework intern handhaben sollte.
Im Zweifelsfall kann man auch den Upload auf einem weiteren Formular oder Schritt unterbringen und hat damit diese Probleme nicht.
Lieg man nur über upload_max_filesize so erhält man den entsprechenden Fehler gemäss:
http://www.php.net/manual/de/features.file-upload.errors.php in dem $_FILES array.
Die ursprügliche Prüfung auf „if ($_FILES[‚tx_example_article‘]) “ ist übrigens unzureichend. Empfehlenswerter ist es hier auf den error code zu prüfen bevor man mit der eigentlichen Dateibearbeitung beginnt.
Vielen Dank für die Kommentare zu dem Thema 🙂
Wer im TYPO3-Repository schon mal öfters unterwegs ist, wird evtl. festgestellt haben, dass es für Spalten als Contentelement nur 3 Extensions gibt. Eine Extension, die beliebig viele Spalten anlegen kann gibt es nicht. Ohne nun eine neue Extension zu erstellen für 4-Spaltigkeit und mehr erkläre ich Euch wie man sowas z.B. mit FCEs aus dem Paket TemplaVoila lösen könnte.
Die folgende Anleitung ist nur ein Beispiel. Es bleibt Euch überlassen dieses entsprechend zu erweitern oder als Grundlage für eigene Projekte zu kopieren.
Weiterlesen "flexible Spalten als FCE"
Ich habe in den letzten 4 Tagen eine sehr detaillierte Dokumentation zum Thema WAMP-Server geschrieben. Als Anziehungspunkt für Fehlermeldungen habe ich alles an Fehlern in Internet nachrecherchiert und in diese Dokumentation aufgenommen. Dabei waren mir folgende Punkte wichtig: