[html-formfu] Re: Adding a link to the output of a nested repeatable

Mario Minati mario.minati at googlemail.com
Wed Jun 3 21:49:44 GMT 2009


Am Mittwoch 03 Juni 2009 05:25:55 schrieb Mike South:
> On Tue, Jun 2, 2009 at 5:07 PM, Mike South <msouth at gmail.com> wrote:
> > On Tue, Jun 2, 2009 at 10:54 AM, Mike South <msouth at gmail.com> wrote:
> >> Hi,
> >>
> >> I have a form with a repeatable element (using
> >> HTML::FormFu::Model::DBIC) representing an interviewee that lets me
> >> edit the interviewee's firstname and lastname columns.  I also want a
> >> link to appear next to each one that lets you edit the rest of the
> >> details for an interviewee (like href="/interviewee/edit/[id]" ).
> >> What is the best way to generate that link?
> >>
> >> I was guessing plugin.  My thought was that I could attach the plugin
> >> to the Hidden field that gets the id.  Within the plugin, I would look
> >> at the id field, create the link, and add the link to the end of the
> >> HTML that generates the hidden form field.  (Kludgy, but I just wanted
> >> to get something working).  I don't even know if I can do that from a
> >> plugin, but here's what I tried so far:
> >>
> >> Using the code from StashValid, I tried to put a warning with the
> >> value of the field.  However, 'valid' never returned true and the
> >> param was always undefined (whether I asked for valid() or not).
> >>
> >> Here is the plugin:
> >>
> >> package HTML::FormFu::Plugin::Mike;
> >> use strict;
> >> use base 'HTML::FormFu::Plugin';
> >>
> >> sub post_process {
> >>
> >>    my ($self) = @_;
> >>
> >>    my $form = $self->form;
> >>    my $name = $self->parent->nested_name;
> >>    warn "name is [$name]";
> >>
> >>    if ( $form->valid($name) ) {
> >>        warn "val is ".  $form->param($name);
> >>    }
> >>    else {
> >>        warn "not valid!";
> >>    }
> >> }
> >> 1;
> >>
> >> Here is how I attached it to the field
> >>               elements:
> >>                  - type: Hidden
> >>                    name: interviewee_id
> >>                    plugins:
> >>                      - Mike
> >>
> >> The field is getting written out correctly with a value, like this:
> >>
> >> <input name="interviewees_1.interviewee_id" type="hidden" value="4" />
> >>
> >> The 'name' gets warned out correctly:
> >>
> >> name is [interviewees_1.interviewee_id]
> >>
> >> but it's followed by
> >>
> >> not valid!
> >>
> >> (or, if I take out the condition, an uninitialized value warning).
> >>
> >> I don't really know what to try next.
> >>
> >> Thanks in advance for any help anyone can give.
> >>
> >> mike
> >
> > I realize now (now that the implications of Carl's recent posted
> > plugin example have had a chance to cook in the ol' subconscious) that
> > a $self->parent->value call gives me the value of the data.  I think I
> > saw something that adds an element after a given element, so I'll see
> > if I can make a src element in my plugin using that data and add it in
> > there.  (Up to now my use of FormFu has been about 95%
> > configuration-only, which I think is a great testament to how much
> > "just works").
> >
> > Anyway, just wanted to let everyone know I think I've found my way on
> > this.
> >
> > mike
>
> Here's what I came up with:
>
>
> package HTML::FormFu::Plugin::IntervieweeEditLink;
> use strict;
> use base 'HTML::FormFu::Plugin';
>
> sub post_process {
>
>     my ($self) = @_;
>
>     my $form = $self->form;
>     my $attached_field = $self->parent;
>     # don't want to add a link to the extra 'add interviewee' row
>     return unless $attached_field->value;
>
>
>     my $position =
> $attached_field->parent->get_element({type=>'Hidden',
> name=>$attached_field->name});
>
>     my $formfu = $attached_field;
>     while ( not $formfu->isa('HTML::FormFu') ) {
>         $formfu->can('parent') or die "no luck on finding the formfu
> object"; $formfu = $formfu->parent;
>     }
>     my $uri =
> $formfu->stash->{context}->uri_for('/interviewee/edit/'.$attached_field->va
>lue); my $link =  qq{<a href="$uri">Edit Details</a>};
>     warn "trying to add $link";
>
>     $attached_field->parent->insert_after(
>         HTML::FormFu->new->element( {
>             type        => 'Src',
>             content_xml => $link,
>         }),
>         $position,
>     );
>
> }
> 1;
>
> Like this in the yml:
>
>              - type: Block
>                 tag: td
>                 elements:
>                   - type: Hidden
>                     name: interviewee_id
>                     plugins:
>                       - IntervieweeEditLink
>
>
> probably makes you want to gouge out your own eyes, but I'm working on
> a deadline and it did the job.


Hi Mike,

that's a nice solution, thanks for sharing.


Greets,

Mario



More information about the HTML-FormFu mailing list