Maybe fixed TT helper
[catagits/Catalyst-View-TT.git] / lib / Catalyst / Helper / View / TTSite.pm
1 package Catalyst::Helper::View::TTSite;
2
3 use strict;
4 use File::Spec;
5
6 sub mk_compclass {
7     my ( $self, $helper, @args ) = @_;
8     my $file = $helper->{file};
9     $helper->render_file( 'compclass', $file );
10     $self->mk_templates( $helper, @args );
11 }
12
13 sub mk_templates {
14     my ( $self, $helper ) = @_;
15     my $base = $helper->{base};
16     my $tdir = File::Spec->catfile( $base, 'root', 'templates' );
17     my $ldir = File::Spec->catfile( $tdir, 'lib' );
18     my $sdir = File::Spec->catfile( $tdir, 'src' );
19
20     $helper->mk_dir($ldir);
21     $helper->mk_dir($sdir);
22
23     my $dir = File::Spec->catfile( $ldir, 'config' );
24     $helper->mk_dir($dir);
25
26     foreach my $file (qw( main col url )) {
27         $helper->render_file( "config_$file",
28             File::Spec->catfile( $dir, $file ) );
29     }
30
31     $dir = File::Spec->catfile( $ldir, 'site' );
32     $helper->mk_dir($dir);
33
34     foreach my $file (qw( wrapper layout html header footer )) {
35         $helper->render_file( "site_$file",
36             File::Spec->catfile( $dir, $file ) );
37     }
38
39     foreach my $file (qw( welcome.tt2 message.tt2 error.tt2 ttsite.css )) {
40         $helper->render_file( $file, File::Spec->catfile( $sdir, $file ) );
41     }
42
43 }
44
45 =head1 NAME
46
47 Catalyst::Helper::View::TTSite - Helper for TT view which builds a skeleton web site
48
49 =head1 SYNOPSIS
50
51 # use the helper to create the view module and templates
52
53     $ script/myapp_create.pl view TT TTSite
54
55 # add something like the following to your main application module
56
57     sub message : Global {
58         my ($self, $c) = @_;
59         $c->stash->{ template } = 'message.tt2';
60         $c->stash->{ message  } = $c->req->param('message') || 'Hello World';
61     }
62     
63     sub default : Private {
64         my ($self, $c) = @_;
65         $c->stash->{ template } = 'welcome.tt2';
66     }
67     
68     sub end : Private {
69         my ($self, $c) = @_;
70         $c->forward('MyApp::V::TT');
71     }
72
73 =head1 DESCRIPTION
74
75 This helper module creates a TT View module.  It goes further than
76 Catalyst::Helper::View::TT in that it additionally creates a simple
77 set of templates to get you started with your web site presentation.
78
79 It creates the templates in a F<templates> directory underneath your
80 main project directory.  In here two further subdirectories are
81 created: F<src> which contains the main page templates, and F<lib>
82 containing a library of other templates components (header, footer,
83 etc.) that the page templates use.
84
85 The view module that the helper creates is automatically configured
86 to locate these templates.
87
88 =head2 METHODS
89
90 =head3 mk_compclass
91
92 Generates the component class.
93
94 =head3 mk_templates
95
96 Generates the templates.
97
98 =cut
99
100 =head1 SEE ALSO
101
102 L<Catalyst>, L<Catalyst::View::TT>, L<Catalyst::Helper>,
103 L<Catalyst::Helper::View::TT>
104
105 =head1 AUTHOR
106
107 Andy Wardley <abw@cpan.org>
108
109 =head1 LICENSE
110
111 This library is free software . You can redistribute it and/or modify
112 it under the same terms as perl itself.
113
114 =cut
115
116 1;
117
118 __DATA__
119
120 __compclass__
121 package [% class %];
122
123 use strict;
124 use base 'Catalyst::View::TT';
125
126 my $root = [% app %]->config->root;
127
128 __PACKAGE__->config({
129     CATALYST_VAR => 'Catalyst',
130     INCLUDE_PATH => [ "$root/templates/src", "$root/templates/lib" ],
131     PRE_PROCESS  => 'config/main',
132     WRAPPER      => 'site/wrapper',
133     ERROR        => 'error.tt2'
134 });
135
136 =head1 NAME
137
138 [% class %] - TT View Component
139
140 =head1 SYNOPSIS
141
142 See L<[% app %]>
143
144 =head1 DESCRIPTION
145
146 TT View Component.
147
148 =head1 AUTHOR
149
150 [% author %]
151
152 =head1 LICENSE
153
154 This library is free software . You can redistribute it and/or modify
155 it under the same terms as perl itself.
156
157 =cut
158
159 1;
160
161 __config_main__
162 [% USE Date;
163    year = Date.format(Date.now, '%Y');
164 -%]
165 [% TAGS star -%]
166 [% # config/main
167    #
168    # This is the main configuration template which is processed before
169    # any other page, by virtue of it being defined as a PRE_PROCESS 
170    # template.  This is the place to define any extra template variables,
171    # macros, load plugins, and perform any other template setup.
172
173    IF Catalyst.debug;
174      # define a debug() macro directed to Catalyst's log
175      MACRO debug(message) CALL Catalyst.log.debug(message);
176    END;
177
178    # define a data structure to hold sitewide data
179    site = {
180      title     => 'Catalyst::View::TTSite Example Page',
181      copyright => '[* year *] Your Name Here',
182    };
183
184    # load up any other configuration items 
185    PROCESS config/col
186          + config/url;
187
188    # set defaults for variables, etc.
189    DEFAULT 
190      message = 'There is no message';
191
192 -%]
193 __config_col__
194 [% TAGS star -%]
195 [% site.rgb = {
196      black  = '#000000'
197      white  = '#ffffff'
198      grey1  = '#46494c'
199      grey2  = '#c6c9cc'
200      grey3  = '#e3e6ea'
201      red    = '#CC4444'
202      green  = '#66AA66'
203      blue   = '#89b8df'
204      orange = '#f08900'
205    };
206
207    site.col = {
208       page    = site.rgb.white
209       text    = site.rgb.grey1
210       head    = site.rgb.grey3
211       line    = site.rgb.orange
212       message = site.rgb.green
213       error   = site.rgb.red
214    };
215 %]
216 __config_url__
217 [% TAGS star -%]
218 [% base = Catalyst.req.base;
219
220    site.url = {
221      base    = base
222      home    = "${base}welcome"
223      message = "${base}message"
224    }
225 -%]
226 __site_wrapper__
227 [% TAGS star -%]
228 [% IF template.name.match('\.(css|js|txt)');
229      debug("passing page through as text: $template.name");
230      content;
231    ELSE;
232      debug("applying HTML page layout wrappers to $template.name\n");
233      content WRAPPER site/html + site/layout;
234    END;
235 -%]
236 __site_html__
237 [% TAGS star -%]
238 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
239 <html>
240  <head>
241   <title>[% template.title or site.title %]</title>
242   <style type="text/css">
243 [% PROCESS ttsite.css %]
244   </style>
245  </head>
246  <body>
247 [% content %]
248  </body>
249 </html>
250 __site_layout__
251 [% TAGS star -%]
252 <div id="header">[% PROCESS site/header %]</div>
253
254 <div id="content">
255 [% content %]
256 </div>
257
258 <div id="footer">[% PROCESS site/footer %]</div>
259 __site_header__
260 [% TAGS star -%]
261 <!-- BEGIN site/header -->
262 <h1 class="title">[% template.title or site.title %]</h1>
263 <!-- END site/header -->
264 __site_footer__
265 [% TAGS star -%]
266 <!-- BEGIN site/footer -->
267 <div id="copyright">&copy; [% site.copyright %]</div>
268 <!-- END site/footer -->
269 __welcome.tt2__
270 [% TAGS star -%]
271 [% META title = 'Catalyst/TT View!' %]
272 <p>
273   Yay!  You're looking at a page generated by the Catalyst::View::TT
274   plugin module.
275 </p>
276 <p>
277   This is the welcome page.  Why not try the equally-exciting 
278   <a href="[% site.url.message %]">Message Page</a>?
279 </p>
280 __message.tt2__
281 [% TAGS star -%]
282 [% META title = 'Catalyst/TT View!' %]
283 <p>
284   Yay!  You're looking at a page generated by the Catalyst::View::TT
285   plugin module.
286 </p>
287 <p>
288   We have a message for you: <span class="message">[% message %]</span>.
289 </p>
290 <p>
291   Why not try updating the message?  Go on, it's really exciting, honest!
292 </p>
293 <form action="[% site.url.message %]"
294       method="POST" enctype="application/x-www-form-urlencoded">
295  <input type="text" name="message" value="[% message %]" />
296  <input type="submit" name="submit" value=" Update Message "/>
297 </form>
298 __error.tt2__
299 [% TAGS star -%]
300 [% META title = 'Catalyst/TT Error' %]
301 <p>
302   An error has occurred.  We're terribly sorry about that, but it's 
303   one of those things that happens from time to time.  Let's just 
304   hope the developers test everything properly before release...
305 </p>
306 <p>
307   Here's the error message, on the off-chance that it means something
308   to you: <span class="error">[% error %]</span>
309 </p>
310 __ttsite.css__
311 [% TAGS star %]
312 html {
313     height: 100%;
314 }
315
316 body { 
317     background-color: [% site.col.page %];
318     color: [% site.col.text %];
319     margin: 0px;
320     padding: 0px;
321     height: 100%;
322 }
323
324 #header {
325     background-color: [% site.col.head %];
326     border-bottom: 1px solid [% site.col.line %];
327 }
328
329 #footer {
330     background-color: [% site.col.head %];
331     text-align: center;
332     border-top: 1px solid [% site.col.line %];
333     position: absolute;
334     bottom: 0;
335     left: 0px;
336     width: 100%;
337     padding: 4px;
338 }
339
340 #content {
341     padding: 10px;
342 }
343
344 h1.title {
345     padding: 4px;
346     margin: 0px;
347 }
348
349 .message {
350     color: [% site.col.message %];
351 }
352
353 .error {
354     color: [% site.col.error %];
355 }