konto usunięte

Temat: embedded forms - sfWidgetFormInputFileEditable nie dzała

Posiadam dwa formularze: SpotForm (podstawowy) oraz SpotWeatherData(zagnieżdżony w relacji jeden do wielu).

W zagnieżdżonym formularzu mam 2 pola tekstowe, które zapisują się poprawnie.
Oraz pole typu 'file' (sfWidgetFormInputFileEditable), które z nie wyjaśnionej przyczyny nie chce dodawać zdjęć. (Jeżeli to pole zamienię na typ tekstowy, wartość zapisuje się poprawnie)

Widget sfWidgetFormInputFileEditable w formularzu zagnieżdżonym jest zdefiniowany poprawnie, ponieważ gdy wywołam sam formularz SpotWeatherData wszystko działa tak jak powinno.

Formularz główny ma ustawione 'enctype="multipart/form-data"'.

Brak mi już pomysłów, co jeszcze może być nie tak :(

Kody:


class SpotForm extends BaseSpotForm
{
public function configure()
{
$form = new WeatherDataCollectionForm(
null,
array('spot' => $this->getObject())
);
$this->embedForm('weatherdata', $form);

$weather_data_form = new SpotWeatherDataForm();
$this->embedForm('newweatherdata', $weather_data_form);
$this->widgetSchema['newweatherdata']->setLabel('Nowe dane pogodowe');
}
}



class SpotWeatherDataForm extends BaseSpotWeatherDataForm
{
public function configure()
{
unset($this['spot_id']);

$this->widgetSchema['name']->setLabel('Nazwa zakładki');
$this->widgetSchema['description']->setLabel('Opis');
$this->widgetSchema['description'] = ptWidgetCommon::createTinyWidget(rand());
$this->widgetSchema['image'] = new sfWidgetFormInputFileEditable(array(
'label' => '<nobr>Lub grafika</nobr>',
'file_src' => '/uploads/photos/'.$this->getObject()->getImage(),
'is_image' => true,
'template' => (strlen($this->getObject()->getImage())?
'<div>%input% %delete% usuń<br /> %file%</div>':'%input%')
));
$this->validatorSchema['image_delete'] = new sfValidatorPass();
$this->validatorSchema['image'] = new sfValidatorFile(array(
'required' => false,
'mime_types' => array ('image/jpeg'),
'path' => sfConfig::get('sf_upload_dir').'/photos/'
),
array('mime_types'=> 'Nieodpowiedni format pliku (tylko pliki jpg/jpeg)',
'required' => 'Element wymagany'));
$this->validatorSchema['image_delete'] = new sfValidatorPass();
$this->widgetSchema->setHelp('image', 'Wprowadzenie grafiki blokuje wyświetlanie pola Opis');
}
}



class WeatherDataCollectionForm extends sfForm {

public function configure() {

$spot = $this->getOption('spot');
if (!$spot->isNew()) {
foreach ($spot->getWeatherDataForSpot() as $weatherData) {
$weatherData_form = new SpotWeatherDataForm($weatherData);
$this->embedForm('wd'.$weatherData->getId(), $weatherData_form);
$this->widgetSchema['wd'.$weatherData->getId()]->setLabel('Dane:');

$this->widgetSchema['wd'.$weatherData->getId()]['name'] = new sfWidgetFormInputDelete(array(
'url' => 'category/deleteSubcategory', // required
'model_id' => $weatherData->getId(), // required
'confirm' => 'Sure???', // optional
));
}

}
}
}

konto usunięte

Temat: embedded forms - sfWidgetFormInputFileEditable nie dzała

Dobrze by było jakbyś napisała konkretny kod błędu validatora czy coś w tym stylu, stawiam, że problem jest z tym, że symfony ma problem z przetwarzaniem zagnieżdżonych formularzy jeśli wykonują dodatkowe akcję. W tym wypadku tak jest ponieważ hierarchia wywołań wygląda tak:


$form->save()
| $form->doSave() // aktualizacja i zapis
| $form->updateObject()
| $form->processValues() // ustalanie wartosci
| $form->processUploadedFile($field);
| $form->getValue($field)
| $form->saveFile($field)
| $form->object->fromArray(...);
| $form->object->save()


Oznacza to, że formularz potomny nigdy nie zwróci ci "czystych" wartości poprzez getValue() których wymaga funkcja processUploadedFile().

fix który ma na celu wypełnienie formularza zwalidowanymi wartościami. Umieść go sobie w klasie z której dziedziczą twoje formsy.



public function bind(array $taintedValues = null, array $taintedFiles = null)
{
$ret = parent::bind($taintedValues, $taintedFiles);
foreach ($this->embeddedForms as $name => $form) {
$this->embeddedForms[$name]->isBound = true;
$this->embeddedForms[$name]->values = $this->values[$name];
}

return $ret;
}



Mi to rozwiązanie kiedyś pomogło, nie mniej jednak wejdź na stronę:

http://stereointeractive.com/blog/2008/12/23/symfony-1...

gdzie gość opisuje podobny problem.

Następna dyskusja:

upload pliku - lokalnie dzi...




Wyślij zaproszenie do