Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: no fucking way -> sfWidgetFormInputFileEditable

Elo.
Mam maly problem (patrz ponizej):

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%')
));



Sytuacja wyglada nastepujaco:
powyzsze rozwiazanie dziala swietnie o ile nie chcesz dzielic zdjec dynamicznie wedlug identyfikatorow nowego obiektu. W momencie gdy uzalezniasz sciezke od $this->getObject()->getId() wszystko dziala poprawnie tylko w momencie edycji zapisanego wczesniej formularza. W momencie gdy zapisujesz formularz z pozycji "new" identyfikator dla sciezki niejest jeszcze utworzony i plik zapisywany jest pietro wyzej w sciezce.

Moze mial ktos podobny problem i udalo mu sie go rozwiazac?

PozdrawiamRoman Piekarski edytował(a) ten post dnia 12.07.09 o godzinie 20:30

konto usunięte

Temat: no fucking way -> sfWidgetFormInputFileEditable

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.
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

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);
}
}

Następna dyskusja:

embedded forms - sfWidgetFo...




Wyślij zaproszenie do