Temat: no fucking way -> sfWidgetFormInputFileEditable
Michał Wujas:
Szybko i skutecznie:
przeładować save.
w środku:
zapisać obiekt.
zapisać plik.
Mało elegancko ale tak ludzie robią.
Ja nie używam tego widgetu z obiektami.
Elo, rozpykalem motyw! Wklejam ponizej kod, moze sie komus przyda
class AdvertisementForm extends BaseAdvertisementForm
{
protected $is_afford_to_upload = false;
protected $advertisement_file_name = array();
public function configure()
{
$this->widgetSchema['file_path'] = new sfWidgetFormInputFileEditable(array(
'label' => 'Image',
'file_src' => '/uploads/advertisement/'.$this->getObject()->getId().'/'.$this->getObject()->getFilePath(),
'is_image' => true,
'template' => (is_file(sfConfig::get('sf_upload_dir').'/advertisement/'.$this->getObject()->getId().'/'.$this->getObject()->getFilePath())?
'<br /> %file% %delete% usuń </div>':'%input%')
));
$this->widgetSchema['advertisement_has_advertisement_place_list'] = new sfWidgetFormPropelChoice(
array(
'model' => 'AdvertisementPlace',
'add_empty' => false,
'expanded' => true,
'multiple' => true));
$this->validatorSchema['file_path'] = new sfValidatorFile(array(
'required' => false,
'path' => sfConfig::get('sf_upload_dir').'/advertisement/'.$this->getObject()->getId()
));
$this->validatorSchema['file_path_delete'] = new sfValidatorPass();
}
/**
* Processes cleaned up values with user defined methods.
*
* To process a value before it is used by the updateObject() method,
* you need to define an updateXXXColumn() method where XXX is the PHP name
* of the column.
*
* The method must return the processed value or false to remove the value
* from the array of cleaned up values.
*
* @param array $values An array of values
*
* @return array An array of cleaned up values processed by the user defined methods
*/
public function processValues($values)
{
// see if the user has overridden some column setter
$valuesToProcess = $values;
foreach ($valuesToProcess as $field => $value)
{
try
{
$method = sprintf('update%sColumn', call_user_func(array(constant(get_class($this->object).'::PEER'), 'translateFieldName'), $field, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME));
}
catch (Exception $e)
{
// not a "real" column of this object
if (!method_exists($this, $method = sprintf('update%sColumn', self::camelize($field))))
{
continue;
}
}
if (method_exists($this, $method))
{
if (false === $ret = $this->$method($value))
{
unset($values[$field]);
}
else
{
$values[$field] = $ret;
}
}
else
{
// save files
//Ponizsze warunki zostaly przerobione na potrzeby zrealizowania zapisu pliku po zapisaniu formularza
//Opuszczam ten warunek w momencie, gdy formularz nie jest jeszcz zapisany
if ( true === $this->isAffordToUpload() && false !== ($this->validatorSchema[$field] instanceof sfValidatorFile) )
{
//Te instrukcje sa uruchamiane dopiero w momencie, gdy zezwoli na to metoda $this->isAffordToUpload()
//old: $values[$field] = $this->processUploadedFile($field, null, $valuesToProcess);
//nazwy plikow generowane są przez warunek if () ponizej
$values[$field] = $this->processUploadedFile($field, $this->getAdvertisementFileName($field), $valuesToProcess);
}
//Z uwagi na to, ze opuscilem powyższy warunek, muszę ustawic wartosci ktore wymagane są do poprawnego
// zapisu formularza. Wartosci te to nazwa pliku standardowo zwracana po wykonaniu $this->processUploadedFile()
else if ( false !== ($this->validatorSchema[$field] instanceof sfValidatorFile) )
{
$this->setAdvertisementFileName($valuesToProcess[$field], null, $field);
$values[$field] = $this->getAdvertisementFileName($field);
}
}
}
return $values;
}
/**
* Metoda generuje nazwe pliku zgodnie z zalozeniami w metodzie processUploadedFile
*
* @param $file sfValidatorFile
* @param $fileName Nazwa pliku
* @param $field identyfikator pola
*
* @return void
*/
protected function setAdvertisementFileName($file, $fileName, $field)
{
$column = call_user_func(array(constant(get_class($this->object).'::PEER'), 'translateFieldName'), $field, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME);
$method = sprintf('generate%sFilename', $column);
if ( false !== isset($this->advertisement_file_name[$field]) )
{
return true;
}
if (!is_null($fileName))
{
$this->advertisement_file_name[$field] = $fileName;
}
else if (method_exists($this->object, $method))
{
$this->advertisement_file_name[$field] = $this->object->$method($file);
}
else
{
$this->advertisement_file_name[$field] = $file->generateFilename();
}
}
/**
* Zwraca wygenerowaną nazwę pliku
*
* @param $field identyfikator pola
*
* @return string
*/
protected function getAdvertisementFileName($field)
{
return $this->advertisement_file_name[$field];
}
/**
* Czy istnieje zezwolenie na wykonanie processUploadedFile?
*
* @return boolean
*/
protected function isAffordToUpload()
{
return $this->is_afford_to_upload;
}
/**
* Ustawia zezwolenie na wykonanie processUploadedFile()
*
* @param bolean $i_Afford
* @return unknown_type
*/
protected function setAffordToUpload($i_Afford = true)
{
$this->is_afford_to_upload = $i_Afford;
}
/**
* @see lib/form/base/BaseAdvertisementForm#doSave()
*/
protected function doSave($con = null)
{
parent::doSave($con);
$this->configure();
//binduję ponownie skonfigurowane dane
$this->bind($this->taintedValues, $this->taintedFiles);
//ustawiam zezwolenie na wykonanie processUploadedFile()
$this->setAffordToUpload();
//ponowne wywolanie metody z zezwoleniem na wykonanie processUploadedFile()
$this->processValues($this->values);
//zapis miejsc wyswietlania reklamy
$this->saveAdvertisementHasAdvertisementPlaceList($con);
}
}