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 <fis...@gmail.com>

>
> 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 <alexandre.sal...@gmail.com>
> 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 <fis...@gmail.com>
> >
> >
> >
> >
> >
> > > 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é -- alexandre.sal...@gmail.com
> >
>


-- 
Alexandre Salomé -- alexandre.sal...@gmail.com

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to