Hi guys! I am encountering an issue with admin generator embedded form file upload, been strugling with it for 2 days, so i would like to ask for your help.The idea is this : I have to tables : GeneralArticle which will embed N General Image forms: The schema is as follows:
general_article: _attributes: { phpName: GeneralArticle, idMethod: native} id: ~ category_id: { type: integer, foreignTable: category, foreignReference: id, required: true } title: { type: varchar(255) } teaser: { type: varchar(255) } body: { type: longvarchar } slug: {type: varchar(255)} published: {type: tinyint} published_date: {type: timestamp} created_at: updated_at: general_image: _attributes: { phpName: GeneralImage, idMethod: native } id: ~ article_id: { type: integer, foreignTable: general_article, foreignReference: id, required: true } imagefile: { type: varchar(255) } title: { type: varchar(255) } published: { type: tinyint } created_at: updated_at: I have succesfully emebed the forms using the article found here: http://dev.markhaus.com/blog/2008/12/a-way-to-edit-n-1-relationships-in-one-form-with-symfony-12/ And everything worked well (imagefile field being a simple input widget, also after saving i observed that the values where not repopulated in the embeded forms), then i started to change the imagefile field to a file upload field, also used the scriplet from: http://stereointeractive.com/blog/2008/12/23/symfony-12-upload-a-file-inside-an-embedded-form/ to make the file upload work, But nothing, only get this error Fatal error: Call to a member function getExtension() on a non-object in /home/ispa/workspace/timnews/lib/form/GeneralImageForm.class.php on line 39 I attach also my 2 form classes: class GeneralImageForm extends BaseGeneralImageForm { protected static $publishOptions = array(0=>'NO', 1=>'YES'); protected function updateImagefileColumn($value) { // if the user has not submitted an image, // remove the value from the values as we want // to keep the old one if (!$value) { return false; } $oldPhoto = $this->getObject()->getImagefile(); $path = sfConfig::get('sf_upload_dir').'/general_articles/'; $thumbPath = sfConfig::get('sf_upload_dir').'/general_articles/ thumbs/'; // remove the old photo if(file_exists($path.$oldPhoto) && is_file($path.$oldPhoto)) { unlink($path.$oldPhoto); unlink($thumbPath.$oldPhoto); } $file = $value; // save the photo on the disk $filename = "article-".time().$file->getExtension($file- >getOriginalExtension()); $file->save($path.'/'.$filename); $thumbnail = new sfThumbnail(200, 200,true,false); $thumbnail->loadFile($path.$filename); $thumbnail->save($thumbPath.$filename, 'image/jpeg'); // change the value to the new file name return $filename; } protected function removeFields() { unset($this['created_at'], $this['updated_at'], $this ['article_id'], $this['id']); } public function configure() { self::removeFields(); $this->widgetSchema['title'] = new sfWidgetFormInput(); $this->widgetSchema['published'] = new sfWidgetFormSelect(array ('choices' => self::$publishOptions)); $this->widgetSchema['imagefile'] = new sfWidgetFormInputFile (); $this->setValidators(array( 'title'=> new sfValidatorString( array ('required'=>false, 'max_length'=>100, 'min_length'=>2 ), array( 'min_length' => 'The NAME "%value%" is too short. It must be of %min_length% characters at least.', 'max_length' => 'The NAME "%value%" is too long. It must be of %max_length% characters at most.', ) ), 'published' => new sfValidatorChoice(array('choices' => array_keys(self::$publishOptions))), 'imagefile'=> new sfValidatorString( array ('required'=>false, 'max_length'=>100, 'min_length'=>2 ), array( 'min_length' => 'The NAME "%value%" is too short. It must be of %min_length% characters at least.', 'max_length' => 'The NAME "%value%" is too long. It must be of %max_length% characters at most.', ) ),/* new sfFileImageValidator(array( 'min_height'=> 200, 'min_width'=> 200, 'max_height'=> 700, 'max_width'=> 480, 'path' => sfConfig::get ('sf_upload_dir').'/general_articles', 'required' => false, 'max_size' => '1024000', 'mime_types' => array ('image/jpeg') ), array( 'max_size' => 'The maximum file size is "%max_size%".', 'mime_types' => 'The accepted file types are JPG, JPEG', 'min_width' => 'The image width is too small, it must have minimum 200px', 'min_height' => 'The image height is too small, it must have minimum 200px', 'max_width' => 'The image width is too large, it must have maximum 700px', 'max_height' => 'The image height is too large, it must have maximum 480px', ) ),*/ )); $this->widgetSchema->setLabel('title', 'Titlul imagini'); $this->widgetSchema->setLabel('imagefile', 'Imagine'); $this->widgetSchema->setLabel('published', 'Publicat?'); } } class GeneralArticleForm extends BaseGeneralArticleForm { 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; } protected function processForm(sfWebRequest $request, sfForm $form) { $this->getUser()->setAttribute('N1added', 0); parent::processForm($request, $form); } protected function removeFields() { unset($this['created_at'], $this['updated_at'], $this['slug'], $this['id'], $this['published'], $this['published_date']); } public function configure() { self::removeFields(); $n = 0; foreach($this->object->getGeneralImages() as $image) { $n++; $this->embedForm('imageform_'.$n, new GeneralImageForm($image)); } if(sfContext::getInstance()->getUser()->hasAttribute('N1added')) { for($i=0; $i < sfContext::getInstance()->getUser()->getAttribute ('N1added'); $i++) { $generalImage = new GeneralImage(); $generalImage->setGeneralArticle($this->object); $n++; $this->embedForm('imageform_'.$n, new GeneralImageForm ($generalImage)); } } $this->widgetSchema['title'] = new sfWidgetFormInput(); $this->widgetSchema['body'] = new sfWidgetFormTextareaTinyMCE(array ( 'width' => 450, 'height' => 350, 'config' => ' plugins: "paste", theme_advanced_disable: "anchor,image,cleanup,help", theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword"', ), array('class'=>'tinyMCE')); $this->widgetSchema['teaser'] = new sfWidgetFormTextareaTinyMCE (array( 'width' => 450, 'height' => 350, 'config' => ' plugins: "paste", theme_advanced_disable: "anchor,image,cleanup,help", theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword"', ), array('class'=>'tinyMCE')); $this->setValidators(array( 'title'=> new sfValidatorString( array ('required'=>true, 'max_length'=>255, 'min_length'=>5 ), array( 'required' => 'The TITLE field is required.', 'min_length' => 'The TITLE "%value%" is too short. It must be of %min_length% characters at least.', 'max_length' => 'The TITLE "%value%" is too long. It must be of %max_length% characters at most.', ) ), 'teaser'=> new sfValidatorString( array ('required'=>false, 'max_length'=>255, 'min_length'=>5 ), array( 'min_length' => 'The TEASER "%value%" is too short. It must be of %min_length% characters at least.', 'max_length' => 'The TEASER "%value%" is too long. It must be of %max_length% characters at most.', ) ), 'body'=> new sfValidatorString( array ('required'=>false, 'max_length'=>2000, 'min_length'=>5 ), array( 'min_length' => 'The BODY "%value%" is too short. It must be of %min_length% characters at least.', 'max_length' => 'The BODY "%value%" is too long. It must be of %max_length% characters at most.', ) ), 'category_id' => new sfValidatorPropelChoice(array('model' => 'Category', 'column' => 'id', 'required' => false)), )); $this->validatorSchema->setOption('allow_extra_fields', true); $this->validatorSchema->setOption('filter_extra_fields', false); $this->widgetSchema->setHelp('title','Introduceti titlul articolului'); $this->widgetSchema->setHelp('teaser','Introduceti descrierea scurta a articolului'); $this->widgetSchema->setHelp('body','Introduceti corpul articolului'); $this->widgetSchema->setHelp('category_id','Alegeti categoria din care face parte acest articol'); } } Thank You! --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "symfony users" group. To post to this group, send email to symfony-users@googlegroups.com To unsubscribe from this group, send email to symfony-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/symfony-users?hl=en -~----------~----~----~----~------~----~------~--~---