[Bio] / WebApplication / WebPage.pm Repository:
ViewVC logotype

Annotation of /WebApplication/WebPage.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.30 - (view) (download) (as text)

1 : paarmann 1.1 package WebPage;
2 :    
3 :     use strict;
4 :     use warnings;
5 :    
6 : paczian 1.2 1;
7 :    
8 : paarmann 1.1 =pod
9 :    
10 :     =head1 NAME
11 :    
12 : paczian 1.2 WebPage - an abstract object for web pages used by WebApplication.
13 :     Instances of this object each represent a distinct page.
14 : paarmann 1.1
15 :     =head1 DESCRIPTION
16 :    
17 :     TODO
18 :    
19 :     =head1 METHODS
20 :    
21 :     =over 4
22 :    
23 :     =item * B<new> ()
24 :    
25 :     Creates a new instance of the WebPage object.
26 :    
27 :     =cut
28 :    
29 :     sub new {
30 :     my ($class, $application) = @_;
31 : paarmann 1.9
32 : paarmann 1.1 my $self = { application => $application,
33 : paarmann 1.9 title => '',
34 : paczian 1.2 components => {},
35 :     css => [],
36 :     omit_from_session => undef,
37 :     javascript => [],
38 : paarmann 1.9 data => {},
39 : devoid 1.30 childComponents => [],
40 :     _orderedCSS => [],
41 :     _orderedJS => [],
42 : paarmann 1.1 };
43 :    
44 :     bless($self, $class);
45 :    
46 :     return $self;
47 :     }
48 :    
49 :    
50 :     =pod
51 :    
52 :     =item * B<title> ()
53 :    
54 :     Get/set the title of a page. By default the title is empty.
55 :    
56 :     =cut
57 :    
58 :     sub title {
59 :     my ($self, $title) = @_;
60 :     if (defined $title) {
61 : paarmann 1.9 $self->{'title'} = $title;
62 : paarmann 1.1 }
63 : paarmann 1.9 return $self->{'title'};
64 : paarmann 1.1 }
65 :    
66 : paczian 1.2
67 :     =pod
68 :    
69 :     =item * B<init> ()
70 :    
71 :     This method is called immediately after the new page object was created.
72 :     It should be used to perform all initialisations (requesting web components,
73 :     registering actions, getting PPO connections) and include required css or
74 :     javascript files (rf. to B<require_javascript> and B<require_css>).
75 :    
76 :     The default init does nothing.
77 :    
78 :     =cut
79 :    
80 :     sub init {
81 :    
82 :     }
83 :    
84 :    
85 : paarmann 1.1 =pod
86 :    
87 :     =item * B<output> ()
88 :    
89 : paczian 1.2 Returns the html output of the page. This method is abstract and must be
90 :     implemented.
91 : paarmann 1.1
92 :     =cut
93 :    
94 :     sub output {
95 :     my ($self) = @_;
96 :    
97 :     die 'Abstract method "output" must be implemented in __PACKAGE__.\n';
98 :     }
99 :    
100 : paczian 1.2
101 : paarmann 1.1 =pod
102 :    
103 :     =item * B<application> ()
104 :    
105 :     Returns the reference to the WebApplication object which called this WebPage
106 :    
107 :     =cut
108 :    
109 :     sub application {
110 :     return $_[0]->{application};
111 :     }
112 :    
113 : paczian 1.2 sub app {
114 :     return $_[0]->{application};
115 :     }
116 :    
117 : paarmann 1.1
118 :     =pod
119 :    
120 :     =item * B<name> ()
121 :    
122 :     Returns the page name which is used to retrieve this page using the
123 :     cgi param 'page';
124 :    
125 :     =cut
126 :    
127 :     sub name {
128 : paczian 1.8 my $name = '';
129 : paczian 1.22 if(ref($_[0]) =~ /^\w+\:\:\w+\:\:(\w+)$/) {
130 :     $name = $1;
131 :     } elsif (ref($_[0]) =~ /^\w+\:\:(\w+)$/) {
132 : paczian 1.8 $name = $1;
133 :     }
134 :     return $name;
135 : paarmann 1.1 }
136 :    
137 :    
138 :     =pod
139 :    
140 :     =item * B<url> ()
141 :    
142 :     Returns the name of the cgi script of this page;
143 :     this is used as a relative url
144 :    
145 :     =cut
146 :    
147 :     sub url {
148 :     my ($self) = @_;
149 :     return $self->application->url . "?page=" . $self->name . "&";
150 :     }
151 :    
152 : paczian 1.2
153 :     =pod
154 :    
155 :     =item * B<require_javascript> (I<js_file>)
156 :    
157 :     Returns a reference to an array of javascript files to include into the output of
158 :     the html page. If the optional parameter I<js_file> is given, the page will require
159 :     that javascript file. To add a list of files, let I<js_file> be an array reference
160 :     of file names.
161 :    
162 :     Call this method in the init method of your derived WebPage to include javascript
163 :     files into your page.
164 :    
165 :     =cut
166 :    
167 :     sub require_javascript {
168 :     if ($_[1]) {
169 :     if (ref $_[1] eq 'ARRAY') {
170 :     $_[0]->{'javascript'} = $_[1];
171 :     }
172 :     else {
173 :     push @{$_[0]->{'javascript'}}, $_[1];
174 :     }
175 :     }
176 :     return $_[0]->{'javascript'};
177 :     }
178 :    
179 : devoid 1.30 =item * B<require_javascript_ordered> ([filenames]) || (filename)
180 :    
181 :     Adds a list of javascript files or a single file to an ordered list that
182 :     are required for this component. These files are always added after the
183 :     files in the component's child-components.
184 :    
185 :     =cut
186 :    
187 :     sub require_javascript_ordered {
188 :     my ($self, $files) = @_;
189 :     if (ref($files) eq 'ARRAY') {
190 :     push(@{$self->{"_orderedJS"}}, @$files);
191 :     } else {
192 :     push(@{$self->{"_orderedJS"}}, $files);
193 :     }
194 :     return $self->{"_orderedJS"};
195 :     }
196 : paczian 1.2
197 :     =pod
198 :    
199 :     =item * B<require_css> (I<css_file>)
200 :    
201 :     Returns a reference to an array of css files to include into the output of the
202 :     html page. If the optional parameter I<css_file> is given, the page will require
203 :     that css file. To add a list of files, let I<css_file> be an array reference
204 :     of file names.
205 :    
206 :     Call this method in the init method of your derived WebPage to include css files
207 :     into your page.
208 :    
209 :     =cut
210 :    
211 :     sub require_css {
212 :     if ($_[1]) {
213 :     if (ref $_[1] eq 'ARRAY') {
214 :     $_[0]->{'css'} = $_[1];
215 :     }
216 :     else {
217 :     push @{$_[0]->{'css'}}, $_[1];
218 :     }
219 :     }
220 :     return $_[0]->{'css'};
221 :     }
222 :    
223 : devoid 1.30 =item * B<require_css_ordered> ([filenames]) || (filename)
224 :    
225 :     Adds a list of css files or a single file to an ordered list that
226 :     are required for this component. These files are always added after the
227 :     files in the component's child-components.
228 :    
229 :     =cut
230 :    
231 :     sub require_css_ordered {
232 :     my ($self, $files) = @_;
233 :     if (ref($files) eq 'ARRAY') {
234 :     push(@{$self->{"_orderedCSS"}}, @$files);
235 :     } else {
236 :     push(@{$self->{"_orderedCSS"}}, $files);
237 :     }
238 :     return $self->{"_orderedCSS"};
239 :     }
240 : paczian 1.2
241 : paarmann 1.1 =pod
242 :    
243 : parrello 1.24 =item * B<start_form> (I<id>, I<state>, I<target>)
244 : paarmann 1.1
245 :     Returns the start of a form
246 :    
247 :     Parameters:
248 :    
249 :     id - (optional) an html id that can be referenced by javascript
250 : paczian 1.21 state - (optional) a hashref whose keys will be turned into the names of hidden
251 :     variables with the according values set as values. If this is 1 and not a hashref,
252 :     all key/value pairs of the CGI object of the previous invocation of the script
253 :     are preserved.
254 :     target - (optional) the name of the target window for this form
255 : paarmann 1.1
256 :     =cut
257 :    
258 :     sub start_form {
259 : paczian 1.16 my ($self, $id, $state, $target) = @_;
260 : paarmann 1.1
261 : paarmann 1.5 my $id_string = ($id) ? " id='$id'" : '';
262 : paarmann 1.1
263 : paczian 1.16 my $target_string = "";
264 :     if (defined($target)) {
265 :     $target_string = " target=$target";
266 :     }
267 :    
268 : paarmann 1.5 my $start_form = "<form method='post'$id_string enctype='multipart/form-data' action='".
269 : paczian 1.16 $self->application->url . "' style='margin: 0px; padding: 0px;'$target_string>\n";
270 : paarmann 1.1
271 : redwards 1.29 my $cgi = $self->application->cgi;
272 : paarmann 1.9 if (ref($state) eq 'HASH') {
273 :    
274 :     foreach my $key (keys(%$state)) {
275 : dsouza 1.19
276 :     if ( ref($state->{$key}) eq 'ARRAY' ) {
277 :     foreach my $val ( @{$state->{$key}} ) {
278 : redwards 1.29 $start_form .= $self->application->cgi->hidden(-name=>$key, -id=>$key, -value=>$val, -override=>1) . "\n";
279 : dsouza 1.19 }
280 :     } else {
281 : olson 1.28 if ($key && defined($state->{$key})) {
282 : redwards 1.29 $start_form .= $self->application->cgi->hidden(-name=>$key, -id=>$key, -value=>$state->{$key}, -override=>1) . "\n";
283 : paczian 1.27 }
284 : dsouza 1.19 }
285 : paarmann 1.9 }
286 :    
287 :     unless (exists $state->{page}) {
288 : redwards 1.29 $start_form .= $self->application->cgi->hidden(-name=>'page', -id=>'page', -value=>$self->name, -overrride=>1) . "\n";
289 : paarmann 1.9 }
290 :    
291 :     }
292 :     elsif ($state) {
293 :     my $cgi = $self->application->cgi;
294 :     my @names = $cgi->param;
295 :     foreach my $name (@names) {
296 :     next if ($name eq 'action');
297 : redwards 1.29 $start_form .= $cgi->hidden(-name=>$name, -id=>$name, -value=>$cgi->param($name), -overrride=>1) . "\n";
298 : paarmann 1.1 }
299 :     }
300 : paarmann 1.11 else {
301 : redwards 1.29 $start_form .= $cgi->hidden(-name=>'page', -id=>'page', -value=>$self->name, -overrride=>1) . "\n";
302 : paarmann 1.11 }
303 : paarmann 1.9
304 : paarmann 1.1 return $start_form;
305 :     }
306 :    
307 :     =pod
308 :    
309 :     =item * B<end_form> ()
310 :    
311 :     Returns the end of a form
312 :    
313 :     =cut
314 :    
315 :     sub end_form {
316 :     my ($self) = @_;
317 :    
318 :     return "</form>";
319 :     }
320 : paczian 1.2
321 :     =pod
322 :    
323 :     =item * B<required_rights> ()
324 :    
325 :     Returns an empty array, should be overwritten by subclass if rights
326 :     are required to view the page.
327 :    
328 :     =cut
329 :    
330 :     sub required_rights {
331 :     return [];
332 :     }
333 :    
334 :     =pod
335 :    
336 : paarmann 1.9 =item * B<omit_from_session> (I<boolean>)
337 : paczian 1.2
338 :     Returns true if a page should not be stored in the history.
339 :    
340 :     =cut
341 :    
342 :     sub omit_from_session {
343 :     my $self = shift;
344 :    
345 :     if (scalar(@_)) {
346 :     $self->{omit_from_session} = shift;
347 :     }
348 :    
349 :     return $self->{omit_from_session};
350 :     }
351 : paczian 1.7
352 : paarmann 1.9
353 : paczian 1.7 =pod
354 :    
355 :     =item * B<supported_rights> ()
356 :    
357 :     Returns a reference to an array of right object this page supports.
358 :     This method should be overwritten for any page that supports rights.
359 :    
360 :     =cut
361 :    
362 :     sub supported_rights {
363 :     return [];
364 :     }
365 : paarmann 1.9
366 :    
367 :     =pod
368 :    
369 :     =item * B<data> (I<id>, I<value>)
370 :    
371 :     Method to store and retrieve data within the page object. The parameter I<id>
372 :     is the key used to store/retrieve the data. If you provide I<value> the method
373 :     will store the data, if not the stored data will returned.
374 :    
375 :     =cut
376 :    
377 :     sub data {
378 :     my $self = shift;
379 :     my $id = shift;
380 :    
381 :     unless ($id) {
382 :     die "No id key for data given.";
383 :     }
384 :    
385 : paczian 1.23 # if ( $id and scalar(@_) == 0 and
386 :     # !exists($self->{data}->{$id}) ) {
387 :     # die "Retrieving unknown id key: $id.";
388 :     # }
389 : paarmann 1.9
390 :     if (scalar(@_)) {
391 :     $self->{data}->{$id} = shift;
392 :     }
393 :    
394 :     return $self->{data}->{$id};
395 :     }
396 : paczian 1.25
397 :     =pod
398 :    
399 :     =item * B<robot_content> ()
400 :    
401 :     Returns the html which will only be printed if the user agent is a robot.
402 :     This should be overwritten if you want special content to be seen by bots
403 :     like i.e. GoogleBot only.
404 :    
405 :     =cut
406 :    
407 :     sub robot_content {
408 :     return "";
409 :     }
410 : parrello 1.26
411 :     =pod
412 :    
413 :     =item * B<button> ($value, %options)
414 :    
415 :     Returns the html for a submit button. The position parameter is the button value
416 :     (default C<Submit>). Any other properties can be added as part of the options hash.
417 :     No leading C<-> is necessary on the option name. Thus,
418 :    
419 :     $page->button('OK', name => 'frog')
420 :    
421 :     will generate a button with a value of C<OK> and a name of C<frog>. Use this method
422 :     instead of CGI methods or raw literals in order to automatically include the button
423 :     style class.
424 :    
425 :     To generate a pure button (as opposed to a submit button), specify
426 :    
427 :     type => 'button'
428 :    
429 :     in the options.
430 :    
431 :     =cut
432 :    
433 :     sub button {
434 :     my ($self, $value, %options) = @_;
435 :     my $app = $self->{application};
436 :     return $app->button($value, %options);
437 :     }
438 :    
439 : devoid 1.30
440 :     =pod
441 :    
442 :     =item * B<register_component> ($Class, $id)
443 :     Registers WebComponent with the page. This is identical to the
444 :     WebApplication call, but preserves component dependencies.
445 :    
446 :     =cut
447 :    
448 :     sub register_component {
449 :     my ($self, $component, $id) = @_;
450 :     my $web_component = $self->application->register_component($component, $id);
451 :     push(@{$self->{"childComponents"}}, $web_component);
452 :     return $web_component;
453 :     }
454 :    
455 :    

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3