1package HTML::FormHandler::Widget::Form::Simple; 2# ABSTRACT: widget to render a form with divs 3$HTML::FormHandler::Widget::Form::Simple::VERSION = '0.40068'; 4use Moose::Role; 5use HTML::FormHandler::Render::Util ('process_attrs'); 6 7with 'HTML::FormHandler::Widget::Form::Role::HTMLAttributes'; 8 9 10sub renderx { 11 my ($self, %args) = @_; 12 13 if ( keys %args > 0 ) { 14 while ( my ( $key, $value ) = each %args ) { 15 confess "invalid attribute '$key' passed to renderx" 16 unless $self->can($key); 17 $self->$key($value); 18 } 19 } 20 $self->render; 21} 22 23 24sub render { 25 my ($self) = @_; 26 27 my $result; 28 my $form; 29 # NOTE: do not use $self in this method; use $result or $form 30 if ( $self->DOES('HTML::FormHandler::Result') ) { 31 $result = $self; 32 $form = $self->form; 33 } 34 else { 35 $result = $self->result; 36 $form = $self; 37 } 38 my $output = $form->render_start($result); 39 $output .= $form->render_form_messages($result); 40 41 if ( $form->has_render_list ) { 42 foreach my $fb ( @{ $form->render_list } ) { 43 # it's a Field 44 if ( $form->field_in_index($fb) ) { 45 # find field result and use that 46 my $fld_result = $result->get_result($fb); 47 # if no result, then we shouldn't be rendering this field 48 next unless $fld_result; 49 $output .= $fld_result->render; 50 } 51 # it's a Block 52 else { 53 # always use form level result for blocks 54 my $block = $form->block($fb); 55 die "found no form field or block named '$fb'\n" unless $block; 56 $output .= $block->render($result); 57 } 58 } 59 } 60 else { 61 foreach my $fld_result ( $result->results ) { 62 $output .= $fld_result->render; 63 } 64 } 65 66 $output .= $form->render_end($result); 67 return $output; 68} 69 70sub render_start { 71 my ( $self, $result ) = @_; 72 $result ||= $self->result; 73 74 my $output = ''; 75 $output = $self->get_tag('before'); 76 77 my $wtag = $self->get_tag('wrapper_tag') || 'fieldset'; 78 79 # render wrapper start if not fieldset 80 $output .= $self->render_wrapper_start($wtag, $result) 81 if $wtag ne 'fieldset'; 82 # render form tag 83 my $attrs = process_attrs($self->attributes($result)); 84 $output .= qq{<form$attrs>}; 85 # render wrapper start if fieldset (not legal outside form tag) 86 $output .= $self->render_wrapper_start($wtag) 87 if $wtag eq 'fieldset'; 88 $output .= $self->get_tag('after_start'); 89 90 return $output 91} 92 93sub render_wrapper_start { 94 my ( $self, $wrapper_tag, $result ) = @_; 95 return '' unless $self->do_form_wrapper; 96 $result ||= $self->result; 97 my $attrs = process_attrs($self->form_wrapper_attributes($result)); 98 return qq{<$wrapper_tag$attrs>}; 99} 100 101sub render_form_errors { shift->render_form_messages(@_) } 102sub render_form_messages { 103 my ( $self, $result ) = @_; 104 $result ||= $self->result; 105 106 return '' if $self->get_tag('no_form_message_div'); 107 my $messages_wrapper_class = $self->get_tag('messages_wrapper_class') || 'form_messages'; 108 my $output = qq{\n<div class="$messages_wrapper_class">}; 109 my $error_class = $self->get_tag('error_class') || 'error_message'; 110 if( $self->has_error_message && ( $result->has_errors || $result->has_form_errors ) ) { 111 my $msg = $self->error_message; 112 $msg = $self->_localize($msg); 113 $output .= qq{\n<span class="$error_class">$msg</span>}; 114 } 115 if ( $result->has_form_errors ) { 116 $output .= qq{\n<span class="$error_class">$_</span>} 117 for $result->all_form_errors; 118 } 119 if( $self->has_success_message && $result->validated ) { 120 my $msg = $self->success_message; 121 $msg = $self->_localize($msg); 122 my $success_class = $self->get_tag('success_class') || 'success_message'; 123 $output .= qq{\n<span class="$success_class">$msg</span>}; 124 } 125 if( $self->has_info_message && $self->info_message ) { 126 my $msg = $self->info_message; 127 $msg = $self->_localize($msg); 128 my $info_class = $self->get_tag('info_class') || 'info_message'; 129 $output .= qq{\n<span class="$info_class">$msg</span>}; 130 } 131 $output .= "\n</div>"; 132 return $output; 133} 134 135sub render_end { 136 my $self = shift; 137 138 my $output = $self->get_tag('before_end'); 139 my $wtag = $self->get_tag('wrapper_tag') || 'fieldset'; 140 $output .= $self->render_wrapper_end($wtag) if $wtag eq 'fieldset'; 141 $output .= "\n</form>"; 142 $output .= $self->render_wrapper_end($wtag) if $wtag ne 'fieldset'; 143 $output .= $self->get_tag('after'); 144 $output .= "\n"; 145 return $output; 146} 147 148sub render_wrapper_end { 149 my ( $self, $wrapper_tag ) = @_; 150 return '' unless $self->do_form_wrapper; 151 return qq{\n</$wrapper_tag>}; 152} 153use namespace::autoclean; 1541; 155 156__END__ 157 158=pod 159 160=encoding UTF-8 161 162=head1 NAME 163 164HTML::FormHandler::Widget::Form::Simple - widget to render a form with divs 165 166=head1 VERSION 167 168version 0.40068 169 170=head1 SYNOPSIS 171 172Role to apply to form objects to allow rendering. This rendering 173role is applied to HTML::FormHandler by default. It supports block 174rendering. (L<HTML::FormHandler::Blocks>, L<HTML::FormHandler::Widget::Block>) 175 176Relevant flags: 177 178 do_form_wrapper - put a wrapper around the form 179 180If the wrapper_tag is a 'fieldset' (default if not specified) the 181wrapper goes inside the form tags (because it's not valid to put it 182outside of them). If the wrapper_tag is something else, it will go 183around the form tags. If you're doing one kind of wrapper and want 184another one, you can achieve that result by using the 'before'/'after' 185tags or the 'after_start'/'before_end' tags. 186 187Supported tags: 188 189 wrapper_tag -- tag for form wrapper; default 'fieldset' 190 before 191 after 192 after_start 193 before_end 194 195 messages_wrapper_class -- default 'form_messages' 196 error_class -- default 'error_message' 197 error_message -- message to issue when form contains errors 198 success_class -- default 'success_message' 199 success_message -- message to issue when form was submitted successfully 200 201=head1 AUTHOR 202 203FormHandler Contributors - see HTML::FormHandler 204 205=head1 COPYRIGHT AND LICENSE 206 207This software is copyright (c) 2017 by Gerda Shank. 208 209This is free software; you can redistribute it and/or modify it under 210the same terms as the Perl 5 programming language system itself. 211 212=cut 213