martini-contrib / render

Martini middleware/handler for easily rendering serialized JSON, XML, and HTML template responses.
MIT License
245 stars 57 forks source link

Not use a template for specific view #41

Open matejkramny opened 10 years ago

matejkramny commented 10 years ago

Hi is this possible?

Alternatively, how can I include another view from within a view?

It would be cool to support jade. It is originating from nodejs, but its also a compiler that can be used on the command line.. Having an 'engine' that could be configured to compile a view when it is requested (then cached) would be really helpful.

What do you think?

mickelsonm commented 10 years ago

The native Go templating system is pretty flexible in what you can do with it out of the box.

If I had a layout like this:

<html>
<body>
    {{template "layout/header"}}
    {{yield}}
    {{template "layout/footer"}}
</body>
</html>

The pieces would be found in:

templates/layout/header.tmpl or header.html templates/layout/footer.tmpl or footer.html

On a controller, I can serve up a specific page view like:

func Index(rw http.ResponseWriter, req *http.Request, bag map[string]interface{}, ren render.Render) {
    ren.HTML(200, "homepage", bag)
}

Then on homepage I could do something like this:

<div class="container">
    <div class="row">
        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
            {{template "homepage/slideshow"}}
        </div>
        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
            {{template "homepage/twitterfeed"}}
        </div>
    </div>
</div>

If you wanted to not display a template based on a condition, you can add a little behavior in the controller and then have your template respond to that. For example:

func Index(rw http.ResponseWriter, req *http.Request, bag map[string]interface{}, ren render.Render){
    bag["IsAdmin"] = true
    ren.HTML(200, "admin", bag)
}

<div class="container">
    {{if .IsAdmin}}
        <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
            {{template "homepage/admin/controls"}}
        </div>
    {{end}}
    <div class="row">
        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
            {{template "homepage/slideshow"}}
        </div>
        <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
            {{template "homepage/twitterfeed"}}
        </div>
    </div>
</div>

I'll be the first to say that Go templates are different, but they're pretty nice once you get the hang of it.