- =head1 NAME
- LedgerSMB::Template::Elements: Template Utility Functions
- =head1 SYNOPSIS
- Provides utility functions for generating elements for the user interface
- templates
- =head1 METHODS
- =over
- =item LedgerSMB::Template::Elements->new()
- Returns a blessed hashref from this namespace.
- =back
- =cut
- package LedgerSMB::Template::Elements;
- use strict;
- sub new {
- my ($class) = @_;
- my $self = {};
- bless $self, $class;
- return $self;
- }
- =over
- =item $object->generate_hidden_elements([...]);
-
- Builds data structure for hidden form fields. Values from the
- $form object are run through $form->quote.
-
- Sample data structure added to $form->hidden_elements():
-
- $self->{form_elements}{hidden_elements} = [{ type => 'hidden', name => 'foo', value => 'bar'... } ...]
- A reference to this structure is returned as well.
- =back
- =cut
-
- sub generate_hidden_elements {
- my $self = shift;
-
- if (! $self->{form_elements}{hidden_elements} ) {
- $self->{form_elements}{hidden_elements} = [];
- }
-
- for (@_) {
- my $value = defined($self->{$_}) ? $self->quote( $self->{$_} ) : '';
- push @{$self->{form_elements}{hidden_elements}}, { type => 'hidden', name => $_, value => $value };
- }
- return $self->{form_elements}{hidden_elements};
- }
- =over
-
- =item $form->generate_radio_elements($radios);
-
- Roll out a single radios hash to an array of radio elements,
- using the values array as index.
-
- Sample data structure added to $form->generate_radio_elements($radios):
-
- my $radios = {
- name => 'radio_name',
- class => 'radio',
- attributes => { foo => 'bar' },
- values => [ '1', '2', '3'],
- labels => [ 'Label one', '', 'Label three'],
- default_value => '2',
- };
-
- =back
- =cut
- sub generate_radio_elements {
-
- my $self = shift;
- my $radios = shift;
-
- my $elements = [];
- my $i = 0;
-
- # One new radio element for each listed value.
- foreach my $radio_value ( @{$radios->{values}} ) {
- my $element = {};
- # copy all additional attributes
- while ( my ($key, $value) = each(%$radios) ) {
- if ( $key !~ /^(values|labels|id|(default_)?value)$/ ) {
- $element->{$key} = $value;
- }
- }
- $element->{id} = $radios->{name} .'-'. $radio_value;
- # id tags with only numbers, letters, and dashes -- nicer CSS.
- $element->{id} =~ s/[^\p{IsAlnum}]/-/g;
- $element->{value} = $radio_value;
- $element->{type} = 'radio';
- # Add label key if present for this element.
- if ( $radios->{labels}[$i] ) {
- $element->{label} = $radios->{labels}[$i];
- }
- # Add checked attribute if the default value applies to this element.
- if ( defined($radios->{default_value}) && $radios->{default_value} eq $radio_value) {
- $element->{checked} = 'checked';
- }
- push @$elements, $element;
- $i++;
- }
-
- return $elements;
- }
- =over
-
- =item $form->generate_checkbox_elements($checkboxes);
-
- Roll out a single checkboxes hash to an array of checkbox elements,
- using the names array as index. Note that if no 'values' array
- is passed, value for all checkboxes default to 1.
-
- Sample data structure added to $form->generate_checkbox_elements($checkboxes):
-
- my $checkboxes = {
- names => [
- 'checkbox_name1',
- 'checkbox_name2',
- 'checkbox_name3',
- ],
- class => 'checkbox',
- attributes => { foo => 'bar' },
- values => [ '4', '', '3'],
- labels => [ 'Label one', '', 'Label three'],
- default_values => [ 'checkbox_name1'],
-
- };
- =back
- =cut
-
- sub generate_checkbox_elements {
-
- my $self = shift;
- my $checkboxes = shift;
-
- my $elements = [];
- my $i = 0;
-
- # One new checkbox element for each listed name.
- foreach my $checkbox_name ( @{$checkboxes->{names}} ) {
- my $element = {};
- # Additional attributes
- while ( my ($key, $value) = each(%$checkboxes) ) {
- if ( $key !~ /^(names|(default_)?values|labels|id|value|name)$/ ) {
- $element->{$key} = $value;
- }
- }
- # Value defaults to 1 if not passed for this element.
- $element->{value} = defined($checkboxes->{values}[$i])
- ? $checkboxes->{values}[$i]
- : '1';
- $element->{name} = $checkbox_name;
- $element->{id} = $element->{name};
- # id tags with only numbers, letters, and dashes -- nicer CSS.
- $element->{id} =~ s/[^\p{IsAlnum}]/-/g;
- $element->{type} = 'checkbox';
- # Add label key if present for this element.
- if ( $checkboxes->{labels}[$i] ) {
- $element->{label} = $checkboxes->{labels}[$i];
- }
- # Add checked attribute if the default value applies to this element.
- if ( defined($checkboxes->{default_values}) &&
- grep {$_ eq $checkbox_name} @{$checkboxes->{default_values}}) {
- $element->{checked} = 'checked';
- }
- push @$elements, $element;
- $i++;
- }
-
- return $elements;
- }
- 1;
|