This is clearly too obscure. You should begin with a refactoring, isolate every process to identify which one fails.
I can't understand your code, no details about JustdrinkImporter, don't know the value of the drinkdb_id or id parameters, etc. Step by step, refactor it. Keep one thing in mind : simple is better. $di->measurement_id = $measurements[$i];// isn't it an array of names ? Trash your code, write proper code, because this one is too ... i can't understand it, until I haven't read all your code (Importer, Model, etc..). And I don't want you to send me a ZIP file. Have fun, Alex 2009/10/23 phil0 <[email protected]> > > Not a problem. Here goes - sorry for the long mail then ;-) > > Controller code: > <?php > public function executeEdit(sfWebRequest $request) > { > if($request->hasParameter('drinkdb_id')) > { > $im = new JustdrinkImporter(); > $this->drink = $im->loadDrink($request->getParameter('drinkdb_id')); > } else { > $this->drink = > Doctrine::getTable('Drink')->findOneById($request->getParameter('id')); > if(!$this->drink) > { > $this->drink = new Drink(); > } > } > > > $ingredient_options = array(); > foreach(Doctrine::getTable('Ingredient')->findAllOrderByName() as > $ingredient) > { > $ingredient_options[$ingredient->getId()] = $ingredient->getName > (); > } > $this->ingredient_options = $ingredient_options; > > $measurements = array(); > foreach(Doctrine::getTable('Measurement')->findAll() as $m) > { > $measurements[$m->getId()] = $m->getName(); > } > $this->measurements = $measurements; > if($request->isMethod('post')) > { > $i = 0; > $measurements = $request->getParameter('measurements'); > $amounts = $request->getParameter('amounts'); > #unset($this->drink->DrinkIngredient); > // $this->drink->DrinkIngredient = new Doctrine_Collection; > > if(!$this->drink->isNew()) > { > Doctrine_Query::create()->from('DrinkIngredient')->where > ('drink_id = ?', $this->drink->getId())->delete()->execute(); > } > > if(is_array($request->getParameter('ingredients'))) > { > foreach($request->getParameter('ingredients') as $ing) > { > $di = new DrinkIngredient(); > $di->ingredient_id = $ing; > $di->measurement_id = $measurements[$i]; > $di->amount = $amounts[$i]; > $this->drink->DrinkIngredient[] = $di; > $i++; > } > } > } > > $this->form = new BackendDrinkForm($this->drink); > if ($request->isMethod('post')) > { > $this->form->bind($request->getParameter('drink')); > if ($this->form->isValid()) > { > $this->form->save(); > $this->getUser()->setFlash('success', 'Drinken > blev gemt.'); > $this->redirect('drink/edit?id=' . > $this->form->getObject()->getId > ()); > } > } > } > ?> > > The editsuccess is just a simple implementation of a form - no > biggies. The form is generated, but I have made some smaller changes: > > <?php > class BackendDrinkForm extends DrinkForm > { > public function configure() > { > parent::configure(); > unset($this['slug'],$this['created_at'],$this['deleted_at']); > > $this->widgetSchema->setLabel('lang', 'Sprog'); > > sfProjectConfiguration::getActive()->loadHelpers('I18N'); > $langs = array(); > foreach(JustdrinkTools::getAvailableLanguages() as $lang) > { > $langs[$lang] = format_language($lang); > } > > $this->widgetSchema['lang'] = new sfWidgetFormSelect(array > ('choices' => $langs)); > $this->validatorSchema['name'] = new sfValidatorString(array > ('required' => true)); > $this->validatorSchema['description'] = new sfValidatorString(array > ('required' => true)); > } > } > ?> > > The relevant model parts are these: > DrinkCategory: > columns: > id: > type: integer > primary: true > autoincrement: true > name: string(255) > description: string(255) > lang: { type: char(2), default: da, notnull: true } > actAs: > Sluggable: { fields: [name], uniqueBy: [lang,name] } > DrinkIngredient: > columns: > drink_id: > type: integer > primary: true > ingredient_id: > type: integer > primary: true > measurement_id: > type: integer > amount: > type: string(50) > relations: > Drink: > type: one > local: drink_id > foreign: id > Ingredient: > type: one > local: ingredient_id > foreign: id > Measurement: > type: one > local: measurement_id > foreign: id > DrinkIngredient: > type: many > local: drink_id > foreign: drink_id > > Ingredient: > columns: > id: > type: integer > primary: true > autoincrement: true > name: string(255) > description: string(255) > lang: { type: char(2), default: da, notnull: true } > indexes: > slug: > fields: [slug] > actAs: > Sluggable: > unique: true > fields: [name] > canUpdate: true > SoftDelete: > Timestampable: > relations: > DrinkIngredient: > type: many > local: id > foreign: ingredient_id > Drink: > columns: > id: > type: integer > primary: true > autoincrement: true > name: > type: string(255) > notnull: true > description: string > user_id: integer > category_id: > type: integer > notnull: true > rating: > notnull: true > type: float > default: 0 > votes: > type: integer > default: 0 > views: > type: integer > default: 0 > image_id: integer > glass_id: integer > lang: { type: char(2), default: da, notnull: true } > actAs: > Sluggable: > unique: true > fields: [name] > canUpdate: true > SoftDelete: > Timestampable: > updated: > disabled: true > indexes: > slug: > fields: [slug] > relations: > User: > local: user_id > foreign: id > type: one > DrinkCategory: > local: category_id > foreign: id > type: one > DrinkIngredient: > type: many > local: id > foreign: drink_id > onDelete: CASCADE > DrinkComment: > foreignAlias: Comments > local: id > foreign: drink_id > onDelete: CASCADE > type: many > Image: > local: image_id > foreign: id > type: one > DrinkGlass: > foreignAlias: glass > local: glass_id > foreign: id > type: one > foreignType: many > > Don't worry about the mess, it will be fixed later - first it has to > work :) > > On Oct 23, 8:39 am, Alexandre SALOME <[email protected]> > wrote: > > Hello, > > > > Is it the generated form or did you add some code ? (copy/paste it if > yes) > > > > Can you give us the POST variables too ? > > > > Can you give us the form names, the schema ? > > > > Thanks, > > > > Alexandre > > > > 2009/10/22 phil0 <[email protected]> > > > > > > > > > > > > > I am importing some data from an external data source. For that I > > > decided to load the data into a model object, and then pass that to a > > > form (generated by Doctrine). > > > > > The object that I am editing is has a many-to-many relation, so it > > > seems that Doctrine saves the data temporarily and then deletes it > > > again. This is not a problem as performance is not an issue for this > > > backend functionality. > > > > > The problem arises when the form is submitted. The "id" of the object > > > is - because it was temporarily saved - set to an integer, but this no > > > longer exists because Doctrine deleted it. This makes the form > > > validation fail because the "id" is not empty and it doesn't exist in > > > the database. This results in an "Id: Invalid." error on the id field. > > > > > I would prefer not to save the object before editing it using the > > > form, as the user might regret the import and therefore just go back. > > > This would result in unedited data in the database. > > > > > I hope that I clarified my problem enough - if you need sample code > > > just tell me. > > > I use symfony 1.3 and the Doctrine version that is in the 1.3 svn. > > > > -- > > Alexandre Salomé -- [email protected] > > > -- Alexandre Salomé -- [email protected] --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "symfony users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/symfony-users?hl=en -~----------~----~----~----~------~----~------~--~---
