[html-formfu] HTML::FormFu::Model::DBIC problem?

Alex Povolotsky tarkhil at over.ru
Tue Apr 7 17:33:53 GMT 2009


Hello!

I'm trying to figure out an EXTREMLY strange behaviour of HTML::FormFu, 
and understand nothing at all.

Quite simple example, two tables linked with foreign key, absolutely 
basic editor using Catalyst:

sub edit: Local FormConfig {
    my ($self, $c, $uid) = @_;
    my $user = $c->model('Main::Users')->find($uid);
    my $form : Stashed;
    if ($form->submitted_and_valid()) {
        $form->model->update($user);
        $c->response->redirect($c->uri_for('/users/'));
        $c->detach();
    } else {
        $form->model->default_values($user);
    }
}

Form is simple as well

---
auto_fieldset: 1
elements:
  - type: Hidden
    name: uid

  - type: Text
    label: "User's name"
    name: name
    constraints:
        - Required
        - type: Length
          max: 30
          min: 3

  - type: Repeatable
    nested_name: phones
    counter_name: pcount
    model_config:
      new_empty_row: number

    elements:
      - type: Hidden
        name: phid

      - type: Text
        name: number
        label: Phone

      - type: Checkbox
        name: delete
        label: (delete)
        value: 1
        model_config:
          delete_if_true: 1

  - type: Hidden
    name: pcount

  - type: Submit
    name: submit

Adding first phone works as expected, but second call to editor results 
in unexplainable commands

(showing DBIC trace)

First edit:

SELECT me.uid, me.name FROM users me WHERE ( ( me.uid = ? OR me.uid = ? 
) ): '2', '2'
SELECT me.phid, me.uref, me.number FROM phones me WHERE ( me.uref = ? ): '2'

(posted some data)

SELECT me.uid, me.name FROM users me WHERE ( ( me.uid = ? OR me.uid = ? 
) ): '2', '2'
SELECT me.phid, me.uref, me.number FROM phones me WHERE ( me.uref = ? ): '2'
SELECT me.uid, me.name FROM users me WHERE ( ( me.uid = ? OR me.uid = ? 
) ): '2', '2'
INSERT INTO phones ( number, uref) VALUES ( ?, ? ): '12345', '2'
SELECT me.uid, me.name FROM users me:

(just called edit/2)

SELECT me.uid, me.name FROM users me WHERE ( ( me.uid = ? OR me.uid = ? 
) ): '2', '2'
SELECT me.phid, me.uref, me.number FROM phones me WHERE ( me.uref = ? ): '2'
DELETE FROM phones WHERE ( phid = ? ): '6'
SELECT me.uid, me.name FROM users me WHERE ( ( me.uid = ? OR me.uid = ? 
) ): '2', '2'
SELECT me.phid, me.uref, me.number FROM phones me WHERE ( me.uref = ? ): '2'

Why existing record gets deleted?

In schema, has_many/belongs_to are in place.

package One2Many::Schema::Result::Users;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__->load_components("InflateColumn::DateTime", "Core");
__PACKAGE__->table("users");
__PACKAGE__->add_columns(
  "uid",
  {
    data_type => "integer",
    default_value => "nextval('users_uid_seq'::regclass)",
    is_nullable => 0,
    size => 4,
  },
  "name",
  {
    data_type => "character varying",
    default_value => undef,
    is_nullable => 0,
    size => 255,
  },
);
__PACKAGE__->set_primary_key("uid");
__PACKAGE__->add_unique_constraint("users_pkey", ["uid"]);
__PACKAGE__->has_many(
  "phones",
  "One2Many::Schema::Result::Phones",
  { "foreign.uref" => "self.uid" },
);


# Created by DBIx::Class::Schema::Loader v0.04005 @ 2009-04-07 12:06:32
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:yWW9U7Dvtljn4WWmFjloAA


# You can replace this text with custom content, and it will be 
preserved on regeneration
1;


package One2Many::Schema::Result::Phones;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__->load_components("InflateColumn::DateTime", "Core");
__PACKAGE__->table("phones");
__PACKAGE__->add_columns(
  "phid",
  {
    data_type => "integer",
    default_value => "nextval('phones_phid_seq'::regclass)",
    is_nullable => 0,
    size => 4,
  },
  "uref",
  { data_type => "integer", default_value => undef, is_nullable => 0, 
size => 4 },
  "number",
  {
    data_type => "character varying",
    default_value => undef,
    is_nullable => 0,
    size => 32,
  },
);
__PACKAGE__->set_primary_key("phid");
__PACKAGE__->add_unique_constraint("phones_idx", ["number"]);
__PACKAGE__->add_unique_constraint("phones_pkey", ["phid"]);
__PACKAGE__->belongs_to("uref", "One2Many::Schema::Result::Users", { uid 
=> "uref" });


# Created by DBIx::Class::Schema::Loader v0.04005 @ 2009-04-07 12:06:32
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nXV1VcahcQ57DWcfO3LDBg


# You can replace this text with custom content, and it will be 
preserved on regeneration
1;


What am I doing wrong?...

Alex





More information about the HTML-FormFu mailing list