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