Zero to Mojolicious: Building a Site with Zurb Foundation
Combining several of my previous posts, let's build a quick site with Mojolicious and Zurb Foundation. We will use the AssetPack plugin. Although we are serving fairly simple Javascript and CSS files now, later we can switch to using Coffeescript, Less or Sass or anything which AssetPack can pre-process.
First, install the AssetPack plugin and create a fresh "app" −
$ cpanm Mojolicious::Plugin::AssetPack
$ mojo generate app FoundationExample
Method 1 − Local copy of Foundation
Download the latest Foundation and put the files under a foundation/ directory under our "app" directory:
$ mkdir foundation
$ cd foundation
$ wget http://foundation.zurb.com/cdn/releases/foundation-5.5.2.zip
$ unzip foundation-5.5.2.zip
Now let's create a set of relative symbolic links for each file in the Foundation directory:
$ mkdir public/foundation/
$ ln -s -r foundation/* public/foundation/
In lib/FoundationExample.pm, change the startup to −
# This method will run once at server start
sub startup {
my $self = shift;
$self->plugin("AssetPack");
my $source = "/foundation/";
$self->asset("foundation.css" => $source."css/foundation.min.css");
$self->asset("foundation.js" => $source."js/foundation.js");
$self->asset("modernizr.js" => $source."js/vendor/modernizr.js");
$self->asset("jquery.js" => $source."js/vendor/jquery.js");
# Router
my $r = $self->routes;
# Normal route to controller
$r->get('/')->to('example#welcome');
}
Continue with Both Methods, below.
Method 2 − CDN method
Use only the changes in lib/FoundationExample.pm shown above, but replace the source with −
my $source = "https://cdnjs.cloudflare.com/ajax/libs/" .
"foundation/5.5.2/";
Continue with Both Methods, below.
Both Methods.
In lib/FoundationExample/Controller/Example.pm − change the welcome routine to:
sub welcome {
my $self = shift;
$self->stash(copyright_holder => 'Someone');
$self->stash(keywords => 'something, somebody, somewhere');
$self->stash(author => 'William Lindley');
# Render template "example/welcome.html.ep" with message
$self->render(msg => 'Welcome to the Mojolicious real-time web framework!');
}
In templates/example/welcome.html.ep − change the layout to:
% layout 'zurbish';
and templates/layouts/zurbish.html.ep −
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- Zurb Foundation stuff -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
%= asset 'foundation.css'
%= asset 'modernizr.js'
<!-- end Zurb -->
<title><%= title %></title>
<meta name="copyright" content="Copyright ⓒ <%= ((localtime())[5]+1900) %> <%= $copyright_holder %>" />
<meta name="keywords" content="<%= $keywords %>" />
<meta name="author" content="<%= $author %>" />
</head>
<body>
%= asset 'jquery.js'
%= asset 'foundation.js'
<script>
$(document).foundation();
</script>
<%= content %>
</body>
</html>
For more, see Jan Henning Thorsen's talk on Mojolicious::Plugin::AssetPack at MojoConf 2014.