use warnings;
use strict;
package Jifty::Web::Form::Link;
=head1 NAME
Jifty::Web::Form::Link - Creates a state-preserving HTML link
=head1 DESCRIPTION
Describes an HTML link that may be AJAX-enabled. Most of the
computation of this comes from L<Jifty::Web::Form::Clickable>, which
generates L<Jifty::Web::Form::Link>s.
=cut
use base 'Jifty::Web::Form::Element';
# Since we don't inherit from Form::Field, we don't otherwise stringify.
# We need the anonymous sub because otherwise the method of the base class is
# always called, instead of the appropriate overridden method in a possible
# child class.
use overload '""' => sub { shift->render }, bool => sub { 1 };
=head2 accessors
Link adds C<url> and C<escape_label> to the list of possible accessors
and mutators, in addition to those offered by
L<Jifty::Web::Form::Element/accessors>.
=cut
sub accessors { shift->SUPER::accessors(), qw(url escape_label tooltip target rel); }
__PACKAGE__->mk_accessors(qw(url escape_label tooltip target rel));
=head2 new PARAMHASH
Creates a new L<Jifty::Web::Form::Link> object. Possible arguments to
the C<PARAMHASH> are:
=over
=item url (optional)
The URL of the link; defaults to the current URL.
=item tooltip
Additional information about the link.
=item target
Target of the link. Mostly useful when specified as "_blank" to open
a new window or as the name of a already existing window.
=item escape_label
HTML escape the label and tooltip? Defaults to true
=item anything from L<Jifty::Web::Form::Element>
Any parameter which L<Jifty::Web::Form::Element/new> can take.
=back
=cut
sub new {
my $class = shift;
my $args = ref($_[0]) ? $_[0] : {@_};
my $self = $class->SUPER::new(
{ url => Jifty->web->request->top_request->path,
label => "Click me!",
tooltip => undef,
escape_label => 1,
class => '',
rel => '',
target => '' }, $args );
return $self;
}
=head2 url [URL]
Gets or sets the URL that the link links to.
=cut
=head2 as_string
Returns the string of the link, including any necessary javascript.
=cut
sub as_string {
my $self = shift;
my $label = $self->label;
my $web = Jifty->web;
$label = $web->escape( $label )
if ( $self->escape_label );
my $tooltip = $self->tooltip;
$tooltip = $web->escape( $tooltip )
if ( defined $tooltip and $self->escape_label );
my $output = '';
$output .= (qq(<a));
$output .= (qq( id="@{[$self->id]}")) if $self->id;
$output .= (qq( class="@{[$self->class]}")) if $self->class;
$output .= (qq( title="@{[$tooltip]}")) if defined $tooltip;
$output .= (qq( target="@{[$self->target]}")) if $self->target;
$output .= (qq( accesskey="@{[$self->key_binding]}")) if $self->key_binding;
$output .= (qq( rel="@{[$self->rel]}")) if $self->rel;
$output .= (qq( href="@{[$web->escape($self->url)]}"));
$output .= ( $self->javascript() );
$output .= (qq(>$label</a>));
$output .= (
'<script type="text/javascript">' .
$self->key_binding_javascript.
"</script>") if $self->key_binding;
return $output;
}
=head2 render
Render the string of the link, including any necessary javascript.
=cut
sub render {
my $self = shift;
Jifty->web->out($self->as_string);
return ('');
}
1;