package HTML::FormHandler::Render::Simple;
# ABSTRACT: simple rendering role
$HTML::FormHandler::Render::Simple::VERSION = '0.40068';
use Moose::Role;
requires( 'sorted_fields', 'field' );
use HTML::FormHandler::Render::Util ('process_attrs', 'ucc_widget');
sub render {
my $self = shift;
my $output = $self->render_start;
$output .= $self->render_form_errors;
foreach my $field ( $self->sorted_fields ) {
$output .= $self->render_field($field);
}
$output .= $self->render_end;
return $output;
}
sub render_form_errors {
my $self = shift;
return '' unless $self->has_form_errors;
my $output = "\n
";
$output .= qq{\n$_}
for $self->all_form_errors;
$output .= "\n
";
return $output;
}
sub render_field {
my ( $self, $field ) = @_;
if ( ref( \$field ) eq 'SCALAR' ) {
$field = $self->field($field);
}
die "must pass field to render_field"
unless ( defined $field && $field->isa('HTML::FormHandler::Field') );
# widgets should be in camel case, since they are Perl package names
my $widget = ucc_widget($field->widget);
return '' if $widget eq 'no_render';
my $rendered_field;
my $form_render = 'render_' . $widget;
if ( $self->can($form_render) ) {
$rendered_field = $self->$form_render($field);
}
elsif ( $field->can('render') ) {
$rendered_field = $field->render;
}
else {
die "No widget method found for '$widget' in H::F::Render::Simple";
}
return $self->wrap_field( $field, $rendered_field );
}
sub wrap_field {
my ( $self, $field, $rendered_field ) = @_;
return "\n$rendered_field" if $field->uwrapper eq 'none';
return "\n$rendered_field" if ! $field->do_wrapper;
my $output = "\n";
my $wrapper_tag = $field->get_tag('wrapper_tag');
$wrapper_tag ||= $field->has_flag('is_repeatable') ? 'fieldset' : 'div';
my $attrs = process_attrs($field->wrapper_attributes);
$output .= qq{<$wrapper_tag$attrs>};
if( $wrapper_tag eq 'fieldset' ) {
$output .= '';
}
elsif ( ! $field->get_tag('label_none') && $field->do_label && length( $field->label ) > 0 ) {
$output .= "\n" . $self->render_label($field);
}
$output .= "\n$rendered_field";
$output .= qq{\n$_}
for $field->all_errors;
$output .= "\n$wrapper_tag>";
return "$output";
}
sub render_text {
my ( $self, $field ) = @_;
my $output = 'id . '"';
$output .= ' size="' . $field->size . '"' if $field->size;
$output .= ' maxlength="' . $field->maxlength . '"' if $field->maxlength;
$output .= ' value="' . $field->html_filter($field->fif) . '"';
$output .= process_attrs($field->element_attributes);
$output .= ' />';
return $output;
}
sub render_password {
my ( $self, $field ) = @_;
my $output = 'id . '"';
$output .= ' size="' . $field->size . '"' if $field->size;
$output .= ' maxlength="' . $field->maxlength . '"' if $field->maxlength;
$output .= ' value="' . $field->html_filter($field->fif) . '"';
$output .= process_attrs($field->element_attributes);
$output .= ' />';
return $output;
}
sub render_hidden {
my ( $self, $field ) = @_;
my $output = 'id . '"';
$output .= ' value="' . $field->html_filter($field->fif) . '"';
$output .= process_attrs($field->element_attributes);
$output .= ' />';
return $output;
}
sub render_select {
my ( $self, $field ) = @_;
my $multiple = $field->multiple;
my $id = $field->id;
my $output = '';
return $output;
}
sub render_checkbox {
my ( $self, $field ) = @_;
my $output = 'id . '"';
$output .= ' value="' . $field->html_filter($field->checkbox_value) . '"';
$output .= ' checked="checked"' if $field->fif eq $field->checkbox_value;
$output .= process_attrs($field->element_attributes);
$output .= ' />';
return $output;
}
sub render_radio_group {
my ( $self, $field ) = @_;
my $output = " ";
my $index = 0;
foreach my $option ( @{ $field->options } ) {
my $id = $field->id . ".$index";
$output .= qq{ ';
$index++;
}
return $output;
}
sub render_textarea {
my ( $self, $field ) = @_;
my $fif = $field->fif || '';
my $id = $field->id;
my $cols = $field->cols || 10;
my $rows = $field->rows || 5;
my $name = $field->html_name;
my $output =
qq();
return $output;
}
sub render_upload {
my ( $self, $field ) = @_;
my $output;
$output = 'id . '"';
$output .= process_attrs($field->element_attributes);
$output .= ' />';
return $output;
}
sub render_label {
my ( $self, $field ) = @_;
my $attrs = process_attrs( $field->label_attributes );
my $label = $field->html_filter($field->loc_label);
$label .= $field->get_tag('label_after')
if( $field->tag_exists('label_after') );
my $label_tag = $field->tag_exists('label_tag') ? $field->get_tag('label_tag') : 'label';
return qq{<$label_tag$attrs for="} . $field->id . qq{">$label$label_tag>};
}
sub render_compound {
my ( $self, $field ) = @_;
my $output = '';
foreach my $subfield ( $field->sorted_fields ) {
$output .= $self->render_field($subfield);
}
return $output;
}
sub render_submit {
my ( $self, $field ) = @_;
my $output = 'id . '"';
$output .= process_attrs($field->element_attributes);
$output .= ' value="' . $field->html_filter($field->_localize($field->value)) . '" />';
return $output;
}
sub render_reset {
my ( $self, $field ) = @_;
my $output = 'id . '"';
$output .= process_attrs($field->element_attributes);
$output .= ' value="' . $field->html_filter($field->value) . '" />';
return $output;
}
sub render_captcha {
my ( $self, $field ) = @_;
my $output .= '';
$output .= '';
return $output;
}
use namespace::autoclean;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::FormHandler::Render::Simple - simple rendering role
=head1 VERSION
version 0.40068
=head1 SYNOPSIS
This is a Moose role that is an example of a simple rendering
routine for L. It's here as an example of
how to write a custom renderer in one package, if you prefer
that to using the widgets. It won't always be updated with
improvements by default, because it was becoming a lot of work to update
the rendering in multiple places.
For a 'MyApp::Form::Renderer' which you've created and modified,
in your Form class:
package MyApp::Form::Silly;
use Moose;
extends 'HTML::FormHandler::Model::DBIC';
with 'MyApp::Form::Renderers';
In a template:
[% form.render %]
The widgets are rendered with C<< $field->render >>; rendering
routines from a class like this use C<< $form->render_field('field_name') >>
to render individual fields:
[% form.render_field( 'title' ) %]
=head1 DESCRIPTION
This role provides HTML output routines for the 'widget' types
defined in the provided FormHandler fields. Each 'widget' name
has a 'widget_$name' method here.
These widget routines output strings with HTML suitable for displaying
form fields.
The widget for a particular field can be defined in the form. You can
create additional widget routines in your form for custom widgets.
The fill-in-form values ('fif') are cleaned with the 'render_filter'
method of the base field class. You can change the filter to suit
your own needs: see L
=head2 render
To render all the fields in a form in sorted order (using
'sorted_fields' method).
=head2 render_start, render_end
These use the methods in L now. If
you want to customize them, copy them to your own package.
Will render the beginning and ending