[Catalyst] Setting View

Matt S Trout dbix-class at trout.me.uk
Sun May 21 15:19:23 CEST 2006

Jon wrote:
> On 5/20/06, *Matt S Trout* <dbix-class at trout.me.uk 
> <mailto:dbix-class at trout.me.uk>> wrote:
>     Jon wrote:
>      > Hi,
>      >
> [snip] 
>      >
>      > Is Catalyst-View-JSON-0.09 The Right Thing to use for json? First
>      > release 04 Jan, and last release 10. Gives the impression of not
>     being
>      > an active and robust module that follows the Catalyst progress.
>     It's not had another release because it already works and hasn't AFAIK
>     had any bugs reported against it.
>     I implemented a JSON-REST API recently using this and it worked
>     perfectly.
> Nice, I just got a bit worried it was yet another module someone thought 
> would be nice, started making and stoped making after getting tired of 
> it. Since it seems to be ready I'll go for it.
>      > It's often mentioned how simple it is to switch between
>     HTML/XML/FOO by
>      > using different views in Catalyst, but I haven't found
>     documentation on
>      > how the prefered way of picking template/language/template
>     system. For
>      > me (coming from Apache::CGI) I'd want to put it like this:
>      >
>      > 1 Set base name of template in Controller method, ie
>      > $c->stash->{template} = 'foo/bar'
>      > 2 At Root::end check cookies (and/or params) for language
>     settings and
>      > append '_lang'
>      > 3 Still at Root:end check param 'output', 'format' or something
>     similar
>      > for what template system to use and forward to it.
>     The code below would work fine; you could make it even simpler by using
>     $c->stash->{view_type} = 'JSON'; # for example
>     then in your end
>     $c->forward($c->view($c->stash->{view_type}||'TT'));
> Hmm, I'm not sure I follow you there, where would you want the stash to 
> happend? I'd prefer the controllers not to know anything about the 
> template their data is used in (I'm pretty new to MVC so there might be 
> something I miss, or I might be overzealotish trying to learn how to do 
> it The Right Way).

Setting the stash is what I'd do in place of using a request parameter; 
you can do this during begin() or something but just using it as a stash 
var in end() allows you to abstract away what it came from - you might 
for example want to select based on the Accept: header the client sends 
or some other environmental question.

> After some thinking while re-reading the stash you put there I'd change 
> my original three steps to be:
> 1. Set template type in begin where I untaint all paramters 
> ($c->stash->{view_type} or something)
> 2. Set template name in controller getting called by URI
> 3. Set language in the END by appending _$language depinging on member 
> setting/cookie/param
> 4. Add .type ($template .= '.tt' if $view_type = 'TT' ) in end depending 
> of template system so I can have index.tt <http://index.tt>, index.json, 
> index_se.tt without changing anything
> Is this remotely what you mean or am I on thin ice in deep waters?

Seems reasonable, although why not use normal I18N stuff for the 
language part rather than having a separate index_se template etc.?

More information about the Catalyst mailing list