Symfony HowTo: Fileupload mit sfWidgetFormInputFileEditable

symfony

Für Formulare mit Dateiupload bietet Symfony ja das praktische Widget [cci]sfWidgetFormInputFileEditable[/cci] an. Besagtes Widget (und der dazugehörige Validator [cci]sfValidatorFile[/cci]) überprüft die Datei, speichert sie am angegebenen Ort mit einem einmaligen Dateinamen, und hinterlegt diesen in der Datenbank.

Zuerst also das Widget anlegen:
[cc lang="php"]// lib/form/doctrine/DeinForm.class.php
$this->widgetSchema['img_normal'] = new sfWidgetFormInputFileEditable(array(
‘label’ => ‘Mitgliederportrait’,
‘file_src’ => ‘/uploads/mitglieder/’.$this->getObject()->getImgNormal(),
‘is_image’ => true,
‘edit_mode’ => !$this->isNew(),
‘template’ => ‘%file% %input% %delete% %delete_label%’
));[/cc]
[cci]file_src[/cci] und [cci]template[/cci] werden für die Anzeige im Formular benötigt. Der in [cci]file_src[/cci] definierte Pfad wird dann zur Anzeige im Browser verwendet.
Der Rest sollte eigentlich selbsterklärend sein.

Als Nächstes ist der Validator dran:
[cc lang="php"]$this->validatorSchema['img_normal'] = new sfValidatorFile(array(
‘required’ => false,
‘path’ => sfConfig::get(‘sf_upload_dir’).’/mitglieder’,
‘mime_categories’ => ‘web_images’
));[/cc]
Und für die Option, die bestehende Datei zu löschen:
[cc lang="php"]$this->validatorSchema['img_normal_delete'] = new sfValidatorPass();[/cc]
Soweit, sogut.

Nun haben wir aber noch ein Problem. Wir können zwar Dateien hochladen, die werden von Symfony auch schön brav am richtigen Ort abgelegt, und in der DB sind immer die richtigen Dateinamen. ABER: Mit der Zeit werdet ihr feststellen, dass sich im angegebenen Uploadordner (hier: /uploads/mitglieder/) jede menge Dateileichen ansammeln. Symfony löscht zwar den Dateinamen aus der DB, versäumt es aber, veraltete Dateien zu löschen (das trifft auch zu wenn die Datei nur ersetzt wird).

Dazu müssen wir die funktion doSave() unserer Formularklasse anpassen:
[cc lang="php"]// lib/form/doctrine/DeinForm.class.php
public function doSave($con = null)
{
if ($this->getValue(‘img_normal’) || $this->getValue(‘img_normal_delete’))
{
$p = sfConfig::get(‘sf_upload_dir’).’/mitglieder/’.$this->getObject()->getImgNormal();
if (file_exists($p))
unlink($p);
}
return parent::doSave($con);
}[/cc]
Eh Voila!

Shoppingtour

Habe gestern und heute endlich endlich die Hardware für mein Projekt Homeserver bestellt.

Wesentlich wollte ich ein kleines Case, in das aber trozdem mindestens 3 Festplatten reinpassen (Raid 5), mit günstiger ( != billiger) “Innenausstattung”. Nun, daraus geworden ist das hier: Homeserver @ Digitec

Zu meinen genauen Plänen gibts an dieser Stelle später mehr! Ich sag nur mal: DNS, DHCP, HTTP+PHP, FTP, SSH, SVN, WebDAV?, ETC…. :P

Desweiteren versuche ich, hier in nächster Zeit wieder regelmässiger zu posten :S