Seit der Beta1 von TYPO3 4-5 gibt es mit dem Paginator ein tolles Fluid-Widget, mit dem ein Pagebrowser bei Extbase-Extensions möglich ist. Das Snippet ist einfach zu konfigurieren und funktioniert tadellos.
TYPO3 News, Development & Insider Infos
Seit der Beta1 von TYPO3 4-5 gibt es mit dem Paginator ein tolles Fluid-Widget, mit dem ein Pagebrowser bei Extbase-Extensions möglich ist. Das Snippet ist einfach zu konfigurieren und funktioniert tadellos.
Heute hat Sebastian bekannt gegeben, dass das Buch „Zukunftssichere TYPO3-Extensions mit Extbase und Fluid“ ins englische übersetzt werden soll und frei zugänglich sein wird. Das ist ein guter Schritt um TYPO3 und Extbase/Fluid (und somit auch FLOW3) in Ländern bekannt zu machen, welche nicht der deutschen Sprache mächtig sind. In dem News-Artikel erklärt er die Vorgehensweise und die Technik welche in dem Translation-Prozess benutzt wird.
Wenn Ihr helfen wollt oder weitere Infos braucht, schaut in die aktuellen News auf typo3.org.
In den letzten Tagen gab es erneut Updates von Phoenix und FLOW3. Bei Phoenix, TYPO3 Version 5.0, handelt es sich bei dem Update um den Code Sprint 4. Bei Phoenix dreht sich alles um Verbesserungen der Architektur und neue Funktionen in dem Benutzer Interface. Zudem gibt es die Präsentation, der T3CON10-Vorstellung des aktuellen Entwicklungsstandes, im News-Beitrag zu finden.
Bei der FLOW3 Version (1.0.0 alpha 13) gibt es Änderungen im QueryResult und neue Fluid Widgets. Bei den QueryResult geht es darum das die FLOW Persistenz Schicht nun nicht mehr Arrays zurück gibt, sondern Instanzen von QueryResultInterface. Neue Fluid Widgets wurden entwickelt, um Pagination- und Autocomplete-Funktionen in Templates zu integrieren.
In der letzten Woche hat Mittwald ein Aktualisierung für die Extbase-Dokumentation veröffentlicht. Das Dokument hat inzwischen 170 Seiten und kann kostenlos heruntergeladen werden. Weitere Informationen zu der Dokumentation gibt es im Mittwald Blog.
Neben der Dokumentation wurde auch die neue 16-seitige TYPO3-Informationsbroschüre veröffentlicht (Mehr Infos). Sie kann ab sofort über unsere Webseite bestellt werden, Einzelexemplare versenden wir kostenlos:
Vielen Dank an Kristina für die Info.
Den Zugriff auf bestimmt Aktionen einer Extension nur unter bestimmte Bedingungen zuzulassen, lässt sich mit ExtBase vglw. simpel umsetzen.
Vor dem Aufruf einer Controller Action wird in ExtBase jedesmall die „initializeAction“ des jeweiligen Controllers aufgerufen. Dies ist also eine gute Stelle für eine zentrale Zugriffsprüfung.
Um das ganze etwas flexibler zu gestallten, kann man den aktuellen „actionMethodName“ gegen einen regulären Ausdruck prüfen und bei „match“ entsprechenden Checks durchführen.
Dieses Regelnwerk hinterlegt man z.B. in einem Controller Property.
Zusammengesetzt könnte sowas dann etwa so aussehen:
Weiterlesen "ExtBase Access Rules"
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 🙂