Move View::TT to new repo layout.
[catagits/Catalyst-View-TT.git] / tags / 0.13 / 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     TIMER        => 0
135 });
136
137 =head1 NAME
138
139 [% class %] - TT View Component
140
141 =head1 SYNOPSIS
142
143 See L<[% app %]>
144
145 =head1 DESCRIPTION
146
147 TT View Component.
148
149 =head1 AUTHOR
150
151 [% author %]
152
153 =head1 LICENSE
154
155 This library is free software . You can redistribute it and/or modify
156 it under the same terms as perl itself.
157
158 =cut
159
160 1;
161
162 __config_main__
163 [% USE Date;
164    year = Date.format(Date.now, '%Y');
165 -%]
166 [% TAGS star -%]
167 [% # config/main
168    #
169    # This is the main configuration template which is processed before
170    # any other page, by virtue of it being defined as a PRE_PROCESS 
171    # template.  This is the place to define any extra template variables,
172    # macros, load plugins, and perform any other template setup.
173
174    IF Catalyst.debug;
175      # define a debug() macro directed to Catalyst's log
176      MACRO debug(message) CALL Catalyst.log.debug(message);
177    END;
178
179    # define a data structure to hold sitewide data
180    site = {
181      title     => 'Catalyst::View::TTSite Example Page',
182      copyright => '[* year *] Your Name Here',
183    };
184
185    # load up any other configuration items 
186    PROCESS config/col
187          + config/url;
188
189    # set defaults for variables, etc.
190    DEFAULT 
191      message = 'There is no message';
192
193 -%]
194 __config_col__
195 [% TAGS star -%]
196 [% site.rgb = {
197      black  = '#000000'
198      white  = '#ffffff'
199      grey1  = '#46494c'
200      grey2  = '#c6c9cc'
201      grey3  = '#e3e6ea'
202      red    = '#CC4444'
203      green  = '#66AA66'
204      blue   = '#89b8df'
205      orange = '#f08900'
206    };
207
208    site.col = {
209       page    = site.rgb.white
210       text    = site.rgb.grey1
211       head    = site.rgb.grey3
212       line    = site.rgb.orange
213       message = site.rgb.green
214       error   = site.rgb.red
215    };
216 %]
217 __config_url__
218 [% TAGS star -%]
219 [% base = Catalyst.req.base;
220
221    site.url = {
222      base    = base
223      home    = "${base}welcome"
224      message = "${base}message"
225    }
226 -%]
227 __site_wrapper__
228 [% TAGS star -%]
229 [% IF template.name.match('\.(css|js|txt)');
230      debug("Passing page through as text: $template.name");
231      content;
232    ELSE;
233      debug("Applying HTML page layout wrappers to $template.name\n");
234      content WRAPPER site/html + site/layout;
235    END;
236 -%]
237 __site_html__
238 [% TAGS star -%]
239 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
240 <html>
241  <head>
242   <title>[% template.title or site.title %]</title>
243   <style type="text/css">
244 [% PROCESS ttsite.css %]
245   </style>
246  </head>
247  <body>
248 [% content %]
249  </body>
250 </html>
251 __site_layout__
252 [% TAGS star -%]
253 <div id="header">[% PROCESS site/header %]</div>
254
255 <div id="content">
256 [% content %]
257 </div>
258
259 <div id="footer">[% PROCESS site/footer %]</div>
260 __site_header__
261 [% TAGS star -%]
262 <!-- BEGIN site/header -->
263 <h1 class="title">[% template.title or site.title %]</h1>
264 <!-- END site/header -->
265 __site_footer__
266 [% TAGS star -%]
267 <!-- BEGIN site/footer -->
268 <div id="copyright">&copy; [% site.copyright %]</div>
269 <!-- END site/footer -->
270 __welcome.tt2__
271 [% TAGS star -%]
272 [% META title = 'Catalyst/TT View!' %]
273 <p>
274   Yay!  You're looking at a page generated by the Catalyst::View::TT
275   plugin module.
276 </p>
277 <p>
278   This is the welcome page.  Why not try the equally-exciting 
279   <a href="[% site.url.message %]">Message Page</a>?
280 </p>
281 __message.tt2__
282 [% TAGS star -%]
283 [% META title = 'Catalyst/TT View!' %]
284 <p>
285   Yay!  You're looking at a page generated by the Catalyst::View::TT
286   plugin module.
287 </p>
288 <p>
289   We have a message for you: <span class="message">[% message %]</span>.
290 </p>
291 <p>
292   Why not try updating the message?  Go on, it's really exciting, honest!
293 </p>
294 <form action="[% site.url.message %]"
295       method="POST" enctype="application/x-www-form-urlencoded">
296  <input type="text" name="message" value="[% message %]" />
297  <input type="submit" name="submit" value=" Update Message "/>
298 </form>
299 __error.tt2__
300 [% TAGS star -%]
301 [% META title = 'Catalyst/TT Error' %]
302 <p>
303   An error has occurred.  We're terribly sorry about that, but it's 
304   one of those things that happens from time to time.  Let's just 
305   hope the developers test everything properly before release...
306 </p>
307 <p>
308   Here's the error message, on the off-chance that it means something
309   to you: <span class="error">[% error %]</span>
310 </p>
311 __ttsite.css__
312 [% TAGS star %]
313 html {
314     height: 100%;
315 }
316
317 body { 
318     background-color: [% site.col.page %];
319     color: [% site.col.text %];
320     margin: 0px;
321     padding: 0px;
322     height: 100%;
323 }
324
325 #header {
326     background-color: [% site.col.head %];
327     border-bottom: 1px solid [% site.col.line %];
328 }
329
330 #footer {
331     background-color: [% site.col.head %];
332     text-align: center;
333     border-top: 1px solid [% site.col.line %];
334     position: absolute;
335     bottom: 0;
336     left: 0px;
337     width: 100%;
338     padding: 4px;
339 }
340
341 #content {
342     padding: 10px;
343 }
344
345 h1.title {
346     padding: 4px;
347     margin: 0px;
348 }
349
350 .message {
351     color: [% site.col.message %];
352 }
353
354 .error {
355     color: [% site.col.error %];
356 }