CGI::Lazy::Template::Boilerplate - CGI::Lazy::Template::Boilerplate documentation


CGI-Lazy documentation Contained in the CGI-Lazy distribution.

Index


Code Index:

LEGAL

Top

NAME

Top

CGI::Lazy::Template::BoilerPlate

SYNOPSIS

Top

	use CGI::Lazy;

	my $q = CGI::Lazy->new({...});

	my $widget = $q->ajax->dataset({...});

	my $b = $q->template->boilerplate($widget);

	$b->buildTemplates;




DESCRIPTION

Top

CGI::Lazy::Template::Boilerplate is a module to generate boilerplate template examples for Lazy widgets. The templates generated can then be customized to do whatever you want, and look like whatever you want. Some pieces of template syntax might be confusing to users of Lazy, so this will generate a nice starting point for you.

The template directory must be writeable by whatever user Apache is configured to run as, at least for as long as you're generating boilerplate templates.

METHODS

Top

buildTemplates ()

Builds a set of templates appropriate for widget given.


CGI-Lazy documentation Contained in the CGI-Lazy distribution.

package CGI::Lazy::Template::Boilerplate;

use strict;

use CGI::Lazy::Globals;

our $datasetMultipleStartBegin = <<END;
<table id="__WIDGETID__Table">
	<caption> <tmpl_var name="CAPTION"> </caption> 
	<tr> <!-- even if you don't use this row, leave it here, or pushRow will break -->
END

our $datasetMultipleHDR = <<END;
		<th> 
			<tmpl_var name='HEADING.ITEM.__FIELDNAME__'> 
		</th> 

END

our $datasetMultipleStartEnd = <<END;
	</tr> 
	<tmpl_loop name='ROW.LOOP'> 
		<tr id="<tmpl_var name="ROW">"> 

END

our $tdPrototypeMultiText = <<END;
				<td> 
					<input 
						type="text"  
						name="<tmpl_var name='NAME.__FIELDNAME__'>" 
						value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
						id="<tmpl_var name='ID.__FIELDNAME__'>" 
						onchange="__WIDGETID__Controller.unflag(this);__WIDGETID__Controller.pushRow(this);" 
					/> 
				</td> 
END

our $tdPrototypeMultiSelect = <<END;
				<td> 
					<select 
						name="<tmpl_var name='NAME.__FIELDNAME__'>" 
						id="<tmpl_var name='ID.__FIELDNAME__'>" 
						onchange="__WIDGETID__Controller.unflag(this);__WIDGETID__Controller.pushRow(this);" 
					/> 
						<tmpl_loop name="LOOP.__FIELDNAME__"> 
							 <option value="<tmpl_var name="ITEM.VALUE">" <tmpl_var name="ITEM.SELECTED">> <tmpl_var name="ITEM.LABEL"> </option> 
						</tmpl_loop> 
					</select> 
				</td> 
END

our $tdPrototypeMultiCheckbox = <<END;
				<td> 
					<input 
						type="checkbox" 
						<tmpl_var name='CHECKED.__FIELDNAME__'> 
						name="<tmpl_var name='NAME.__FIELDNAME__'>" 
						value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
						id="<tmpl_var name='ID.__FIELDNAME__'>" 
						onchange="__WIDGETID__Controller.unflag(this); __WIDGETID__Controller.pushRow(this);" 
					/> 
				</td> 
END

our $tdPrototypeMultiRadio = <<END;
				<td> 
					<tmpl_loop name="LOOP.__FIELDNAME__"> 
						<tmpl_var name='VALUELABEL.__FIELDNAME__'> 
						<input 
							type="radio" 
							<tmpl_var name='CHECKED.__FIELDNAME__'> 
							name="<tmpl_var name='NAME.__FIELDNAME__'>" 
							value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
							id="<tmpl_var name='ID.__FIELDNAME__'>" 
							onchange="__WIDGETID__Controller.unflag(this);__WIDGETID__Controller.pushRow(this);" 
						/> 
					</tmpl_loop> 
				</td>

END

our $tdPrototypeMultiRO = <<END;
				<td> 
					<tmpl_var name='VALUE.__FIELDNAME__'> 
				</td> 
END

our $tdPrototypeSingleMulti = <<END;
				<td> 
					<tmpl_var name='VALUE.__FIELDNAME__'> 
				</td> 
END

our $tdPrototypeSingleText = <<END;
		<td> 
			<input  
				type="text" 
				name="<tmpl_var name='NAME.__FIELDNAME__'>" 
				value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
				id="<tmpl_var name='ID.__FIELDNAME__'>" 
				onchange="__WIDGETID__Controller.unflag(this);"  
			/> 
		</td> 
END

our $tdPrototypeSingleRadio = <<END;
 		<td> 
                        <tmpl_loop name="LOOP.__FIELDNAME__"> 
                                <tmpl_var name='VALUELABEL.__FIELDNAME__'> 
                                <input 
                                        type="radio" 
                                        <tmpl_var name='CHECKED.__FIELDNAME__'> 
                                        name="<tmpl_var name='NAME.__FIELDNAME__'>" 
                                        value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
                                        id="<tmpl_var name='ID.__FIELDNAME__'>" 
                                        onchange="__WIDGETID__Controller.unflag(this);" 
                                /> 
                        </tmpl_loop> 
                </td> 

END

our $tdPrototypeSingleCheckbox = <<END;
		<td> 
			<input 
				type="checkbox" 
				<tmpl_var name="CHECKED.__FIELDNAME__"> 
				name="<tmpl_var name='NAME.__FIELDNAME__'>"  
				value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
				id="<tmpl_var name='ID.__FIELDNAME__'>" 
				onchange="__WIDGETID__Controller.unflag(this);" 
			/> 
		</td> 
END

our $tdPrototypeSingleSelect = <<END;
		<td> 
			<select 
				name="<tmpl_var name='NAME.__FIELDNAME__'>" 
				id="<tmpl_var name='ID.__FIELDNAME__'>" 
				onchange="__WIDGETID__Controller.unflag(this);" 
			> 
				<tmpl_loop name="LOOP.__FIELDNAME__"> 
					<option value="<tmpl_var name="ITEM.VALUE">" <tmpl_var name="ITEM.SELECTED"> > <tmpl_var name="ITEM.LABEL"> </option> 
				</tmpl_loop> 

			</select> 
		</td> 
END

our $tdPrototypeSingleRO = <<END;
		<td> 
			<tmpl_var name='VALUE.__FIELDNAME__'> 
		</td> 
END

our $datasetDeleteTd = <<END;
				<tmpl_if name="DELETE.FLAG"> 
				<td> 
					<input  
						type = 'checkbox'  
						tabindex=-1  
						id = "<tmpl_var name = 'DELETE.ID'>"  
						onclick="__WIDGETID__Controller.deleteRow(this);" 
					> 
				</td> 
				</tmpl_if> 
END

our $datasetMultipleEnd = <<END;
		</tr> 
	</tmpl_loop> 
</table> 
END

our $cssClean = <<END;
div#__WIDGETID__ {

}

END

our $datasetSingleStart = <<END;
<table id="__WIDGETID__.table">
END

our $datasetSingleRowStart = <<END;
	<tr> 
END

our $datasetSingleLableTd = <<END;
		<td 
			id="__FIELDNAME__Label"> 
			<tmpl_var name="LABEL.__FIELDNAME__"> 
		</td> 
END

our $datasetSingleRowEnd = <<END;
	</tr> 

END

our $datasetSingleEnd = <<END;
		
</table> 

END

our $datasetMultipleHeaderStart = <<END;
<div id="__WIDGETID__HDR"> 
	<table> 
		<caption> <tmpl_var name="CAPTION"> </caption> 
		<tr> 

END

our $datasetMultipleHeaderDeleteTd = <<END;
			<th>  
				<tmpl_var name="HEADING.ITEM.DELETE">  
			</th> 

END

our $datasetMultipleHeaderEnd = <<END;
		</tr> 


	</table> 
</div> 


END

our $controllerStart = <<END;
<table>
	<tr>

END

our $controllerEnd = <<END;
	</tr>
</table>

END

our $tdPrototypeControllerSelect = <<END;
				<td> 
					<select 
						name="<tmpl_var name='NAME.__FIELDNAME__'>" 
						id="<tmpl_var name='ID.__FIELDNAME__'>" 
						onchange="__WIDGETID__Controller.select();" 
					/> 
						<tmpl_loop name="LOOP.__FIELDNAME__"> 
							 <option value="<tmpl_var name="ITEM.VALUE">" <tmpl_var name="ITEM.SELECTED">> <tmpl_var name="ITEM.LABEL"> </option> 
						</tmpl_loop> 
					</select> 
				</td> 
END

our $tdPrototypeControllerCheckbox = <<END;
				<td> 
					<input 
						type="checkbox" 
						<tmpl_var name='CHECKED.__FIELDNAME__'> 
						name="<tmpl_var name='NAME.__FIELDNAME__'>" 
						value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
						id="<tmpl_var name='ID.__FIELDNAME__'>" 
						onchange="__WIDGETID__Controller.select();" 
					/> 
				</td> 
END

our $tdPrototypeControllerRadio = <<END;
				<td> 
					<tmpl_loop name="LOOP.__FIELDNAME__"> 
						<tmpl_var name='VALUELABEL.__FIELDNAME__'> 
						<input 
							type="radio" 
							<tmpl_var name='CHECKED.__FIELDNAME__'> 
							name="<tmpl_var name='NAME.__FIELDNAME__'>" 
							value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
							id="<tmpl_var name='ID.__FIELDNAME__'>" 
							onchange="__WIDGETID__Controller.select();" 
						/> 
					</tmpl_loop> 
				</td>

END

our $tdPrototypeControllerText = <<END;
				<td> 
					<input 
						type="text"  
						name="<tmpl_var name='NAME.__FIELDNAME__'>" 
						value="<tmpl_var name='VALUE.__FIELDNAME__'>" 
						id="<tmpl_var name='ID.__FIELDNAME__'>" 
						onchange="__WIDGETID__Controller.select();" 
					/> 
				</td> 
END

#--------------------------------------------------------------------------------------------
sub buildTmplController {
	my $self = shift;

	my $tmpl = $controllerStart;

	foreach my $control (@{$self->controls}) {
		my $type = $control->{type};

		if ($type eq 'select') { 
			$tmpl .= $self->parse4FieldAndID($control->{name}, $tdPrototypeControllerSelect);
		} elsif ($type eq 'checkbox') {
			$tmpl .= $self->parse4FieldAndID($control->{name}, $tdPrototypeControllerCheckbox);
		} elsif ($type eq 'radio') {
			$tmpl .= $self->parse4FieldAndID($control->{name}, $tdPrototypeControllerRadio);
		} else {
			$tmpl .= $self->parse4FieldAndID($control->{name}, $tdPrototypeControllerText);
		}
	}
	
	$tmpl .= $controllerEnd;

	return $self->outputTmpl($tmpl, 'Controller');
}

#--------------------------------------------------------------------------------------------
sub buildTmplDatasetMultiple {
	my $self = shift;

	my $tmpl = $self->parse4ID($datasetMultipleStartBegin);
	$tmpl .= $self->parse4Field($_, $datasetMultipleHDR) for $self->widget->recordset->visibleFields;
	$tmpl .= $datasetMultipleStartEnd;
	
	foreach my $fieldname (@{$self->fieldlist}) {
		if ($self->widget->recordset->webcontrol($fieldname)) {
			my $webcontrol = $self->widget->recordset->webcontrol($fieldname);
			my $type = $webcontrol->{type};

			if ($type eq 'select') { 
				$tmpl .= $self->parse4FieldAndID($fieldname, $tdPrototypeMultiSelect);
			} elsif ($type eq 'checkbox') {
				$tmpl .= $self->parse4FieldAndID($fieldname, $tdPrototypeMultiCheckbox);
			} elsif ($type eq 'radio') {
				$tmpl .= $self->parse4FieldAndID($fieldname, $tdPrototypeMultiRadio);
			} else {
				$tmpl .= $self->parse4FieldAndID($fieldname, $tdPrototypeMultiText);
			}
		} else {
			$tmpl .= $self->parse4FieldAndID($fieldname, $tdPrototypeMultiText);
		}
	}

	$tmpl .= $self->parse4ID($datasetDeleteTd);
	$tmpl .= $self->parse4ID($datasetMultipleEnd);

	$self->outputTmpl($tmpl);
}

#--------------------------------------------------------------------------------------------
sub buildTmplDatasetMultipleHeadings {
	my $self = shift;

	my $tmpl = $self->parse4ID($datasetMultipleHeaderStart);
	$tmpl .= $self->parse4Field($_, $datasetMultipleHDR) for @{$self->fieldlist};
	$tmpl .= $self->parse4ID($datasetMultipleHeaderDeleteTd);
	$tmpl .= $self->parse4ID($datasetMultipleHeaderEnd);

	$self->outputTmpl($tmpl, 'HDR');
}

#--------------------------------------------------------------------------------------------
sub buildTmplDatasetMultipleRO {
	my $self = shift;

	my $tmpl = $self->parse4ID($datasetMultipleStartBegin);
	$tmpl .= $self->parse4Field($_, $datasetMultipleHDR) for $self->widget->recordset->visibleFields;
	$tmpl .= $datasetMultipleStartEnd;
	$tmpl .= $self->parse4FieldAndID($_, $tdPrototypeMultiRO) for @{$self->fieldlist};
	$tmpl .= $self->parse4ID($datasetMultipleEnd);

	$self->outputTmpl($tmpl, 'RO');
}

#--------------------------------------------------------------------------------------------
sub buildTmplDatasetSingle {
	my $self = shift;

	my $widgetID 	= $self->widgetID;
	my $fieldlist 	= $self->fieldlist;
	my $fields 	= scalar @$fieldlist;
	my $rows 	= ($fields / 5 == int $fields) ? $fields / 5 : int $fields / 5 + 1;

	my $tmpl = $self->parse4ID($datasetSingleStart);

	my $field = 0;
	for (my $i = 0; $i < $rows; $i++) {
		my $column = 0;
		$tmpl .= $datasetSingleRowStart;
		while ($column < 6) {
			if ($fieldlist->[$field]) {
				$tmpl .= $self->parse4Field($fieldlist->[$field], $datasetSingleLableTd);

				if ($self->widget->recordset->webcontrol($fieldlist->[$field])) {
					my $webcontrol = $self->widget->recordset->webcontrol($fieldlist->[$field]);
					my $type = $webcontrol->{type};

					if ($type eq 'select') { 
						$tmpl .= $self->parse4Field($fieldlist->[$field], $self->parse4ID($tdPrototypeSingleSelect));
					} elsif ($type eq 'checkbox') {
						$tmpl .= $self->parse4Field($fieldlist->[$field], $self->parse4ID($tdPrototypeSingleCheckbox));
					} elsif ($type eq 'radio') {
						$tmpl .= $self->parse4Field($fieldlist->[$field], $self->parse4ID($tdPrototypeSingleRadio));
					} else {
						$tmpl .= $self->parse4Field($fieldlist->[$field], $self->parse4ID($tdPrototypeSingleText));
					}
				} else {
					$tmpl .= $self->parse4Field($fieldlist->[$field], $self->parse4ID($tdPrototypeSingleText));
				}
			}
			$column++;
			$field++;
		}

		$tmpl .= $datasetSingleRowEnd;

	}

	$tmpl .= $self->parse4ID($datasetSingleEnd);

	$self->outputTmpl($tmpl);
}

#--------------------------------------------------------------------------------------------
sub buildTmplDatasetSingleRO {
	my $self = shift;

	my $widgetID 	= $self->widgetID;
	my $fieldlist 	= $self->fieldlist;
	my $fields 	= scalar @$fieldlist;
	my $rows 	= ($fields / 5 == int $fields) ? $fields / 5 : int $fields / 5 + 1;

	my $tmpl = $self->parse4ID($datasetSingleStart);

	my $field = 0;
	for (my $i = 0; $i < $rows; $i++) {
		my $column = 0;
		$tmpl .= $datasetSingleRowStart;
		while ($column < 6) {
			if ($fieldlist->[$field]) {
				$tmpl .= $self->parse4Field($fieldlist->[$field], $datasetSingleLableTd);
				$tmpl .= $self->parse4Field($fieldlist->[$field], $self->parse4ID($tdPrototypeSingleRO));
			}
			$column++;
			$field++;
		}

		$tmpl .= $datasetSingleRowEnd;

	}

	$tmpl .= $self->parse4ID($datasetSingleEnd);

	$self->outputTmpl($tmpl, 'RO');
}

#--------------------------------------------------------------------------------------------
sub buildTmplDatasetSingleMulti {
	my $self = shift;

	my $tmpl = $self->parse4ID($datasetMultipleStartBegin);
	$tmpl .= $self->parse4Field($_, $datasetMultipleHDR) for $self->widget->recordset->multipleFieldList;
	$tmpl .= $datasetMultipleStartEnd;
	$tmpl .= $self->parse4Field($_, $tdPrototypeSingleMulti) for @{$self->fieldlist};
	$tmpl .= $self->parse4ID($datasetMultipleEnd);

	$self->outputTmpl($tmpl, 'Multi');
}
#--------------------------------------------------------------------------------------------
sub buildTemplates {
	my $self = shift;
	
	if ($self->{_composite} ) {
		$_->buildTemplates foreach (@{$self->{_members}});
		return;
	}

	if ($self->type eq 'Dataset-single') {
		$self->buildTmplDatasetSingle;
		$self->buildTmplDatasetSingleMulti;
		$self->buildTmplDatasetSingleRO;

	} elsif ($self->type eq 'Dataset-multi') {
		$self->buildTmplDatasetMultiple;
		$self->buildTmplDatasetMultipleRO;
		$self->buildTmplDatasetMultipleHeadings;

	} elsif ($self->type eq 'Controller') {
		$self->buildTmplController;

	}

	return;
}

#--------------------------------------------------------------------------------------------
sub controls {
	my $self = shift;

	return $self->{_controls};
}

#--------------------------------------------------------------------------------------------
sub fieldlist {
	my $self = shift;

	return $self->{_fieldlist};
}

#--------------------------------------------------------------------------------------------
sub new {
	my $class = shift;
	my $template = shift;
	my $widget = shift;


	die "Boilerplate called with no widget!" unless $widget;


	my $self = {
		_template		=> $template,
		_widget			=> $widget,
	};

	if (ref $widget eq 'CGI::Lazy::Widget::Dataset') {
		$self->{_widgetID}	= $widget->widgetID;
		$self->{_fieldlist}	= $widget->recordset->visibleFields;
		$self->{_type}		= 'Dataset-'.$widget->type;
		$self->{_style}		= $widget->vars->{style};

	} elsif (ref $widget eq 'CGI::Lazy::Widget::Controller') {
		$self->{_widgetID}	= $widget->widgetID;
		$self->{_type}		= 'Controller';
		$self->{_controls}	= $widget->controls;
	
	} elsif (ref $widget eq 'CGI::Lazy::Widget::Composite') {
		$self->{_widgetID}	= $widget->widgetID;
		$self->{_composite} 	= 1;

		foreach (@{$widget->memberarray}) {
			push @{$self->{_members}}, $template->boilerplate($_);
		}
	}


	return bless $self, $class;
}

#--------------------------------------------------------------------------------------------
sub output {
	my $self = shift;
	my $text = shift;
	my $type = shift;
	my $extra = shift;

	my $filename = $self->widgetID;
	$filename .= $extra if $extra;
	$filename .=".$type";

	my $file = $self->q->config->buildDir."/".$filename;

	open OF, "+> $file" or die "Couldn't open $file for writing: $!";
	print OF $text;
	close OF;
}

#--------------------------------------------------------------------------------------------
sub outputTmpl {
	my $self = shift;
	my $text = shift;
	my $type = shift;

	$self->output($text, "tmpl", $type);
}

#--------------------------------------------------------------------------------------------
sub parse4ID {
	my $self = shift;
	my $text = shift;
	
	my $widgetID = $self->widgetID;

	$text =~ s/__WIDGETID__/$widgetID/gs;

	return $text;
}

#--------------------------------------------------------------------------------------------
sub parse4Field {
	my $self 	= shift;
	my $fieldname	= shift;
	my $text 	= shift;

	$text =~ s/__FIELDNAME__/$fieldname/gs;

	return $text;
}

#--------------------------------------------------------------------------------------------
sub parse4FieldAndID {
	my $self 	= shift;
	my $fieldname	= shift;
	my $text 	= shift;

	$text = $self->parse4Field($fieldname, $text);
	$text = $self->parse4ID($text);

	return $text;
}

#--------------------------------------------------------------------------------------------
sub q {
	my $self = shift;

	return $self->template->q;
}

#--------------------------------------------------------------------------------------------
sub style {
	my $self = shift;

	return $self->{_style};
}

#--------------------------------------------------------------------------------------------
sub template {
	my $self = shift;

	return $self->{_template};
}

#--------------------------------------------------------------------------------------------
sub type {
	my $self = shift;

	return $self->{_type};
}

#--------------------------------------------------------------------------------------------
sub widget {
	my $self = shift;

	return $self->{_widget};
}

#--------------------------------------------------------------------------------------------
sub widgetID {
	my $self = shift;

	return $self->{_widgetID};
}


1

__END__