Mojolicious template helper
I would like to explain the helper that is useful in templates. Think of a helper as a function that you can call in a template. The layout helper and stash helper have already been explained, so I will explain the other helpers.
Embedding stylesheets
If you want to write a stylesheet in the template, use the stylesheet tag helper. Write the style sheet in the part surrounded by begin and end .
%= stylesheet begin body { background: blue; } %end
You can write it using the style tag in the usual way, but this is more concise and convenient because it expands to a versatile tag. It will be expanded to the following tags.
<style> / * <! [CDATA [* / body { background: blue; } / *]]> * / </style>
You can also load stylesheets in public directories with the stylesheet tag helper.
%= stylesheet'/css/common.css';
It expands as follows:
<link href = "/ css / common.css" rel = "stylesheet" />
Helpers that can insert tags are called tag helpers. See Mojolicious Tag Helpers List for available tag helpers.
JavaScript embedding
If you want to write JavaScript in the template, use the stylesheet helper. Write JavaScript in the part surrounded by begin and end .
%= javascript begin alert ('Hello'); %end
You can write it using the script tag in the usual way, but this is more concise and convenient because it expands to a versatile tag. It will be expanded to the following tags.
<script> // <! [CDATA [ alert ('Hello'); //]]> </script>
You can also load JavaScript in the public directory with the javascript helper.
%= javascript'/js/common.js';
It expands as follows:
<script src = "/ js / common.js"> </script>
Get application object
Use the app helper to get the application object.
%my $app = app;
Get controller object
You can refer to the controller object by the name $self in the template.
%my $c = $self
You can use this to get HTTP methods in the template, etc.
%my $http_method = $self->req->method;
Data dump
There is a dumper method for dumping the contents of the data. This is functionally the same as the Dumper function in the Data::Dumper module.
%warn dumper $date;
Import other templates
You can use the include helper to include other templates.
%= include'/include/header.html.ep
Headers and footers are often common to all sites, so it is convenient to create them and load them from multiple templates. include You can set the stash value by using the second and subsequent arguments of the helper.
%= include'/include/header.html.ep, name =>'kimoto', age => 34;
URL representation
When expressing the internal URL of an application in Mojolicious, be sure to use the url_for helper except for applications where performance is important. For example, if you want to express the URL "/ date / 20131215", write as follows.
<a href="<%=url_for('/date/20131215')%>"> 2013/12/15</a>
The url_for method is used to make the application versatile. If you write it like this, the URL will be generic regardless of whether you start it as CGI or as a server.
It expands as follows:
# For CGI <a href="/myapp.cgi/date/20131215"> 2013/12/15</a> #When started as a server <a href="/date/20131215"> 2013/12/15</a>
Mojo::URL object
The url_for helper gets the Mojo::URL object. The Mojo::URL class is a class for handling URLs.
To stringify a Mojo::URL object, use the to_strong method or evaluate it as a string.
%my $url_str = url_for->to_string; %my $url_str = "". url_for;
In the first example, "<%=%>" is simply evaluated as a string.
<%= url_for ('/ some')%>
Just write, and the URL will be expanded as a string.
Get the current URL
If you don't specify any arguments with the url_for helper, you can get the current URL.
%my $current_url = url_for
Query string
One thing to keep in mind with the url_for helper is that if you want to get the current URL with no arguments, you can get the URL of the part excluding the query string. If you want to get the URL including the query string, use the
<%= url_with%>
For example, if you access the URL "/ some? Name = kimoto & age = 30", the url_for helper will get "/ some", but the url_with helper will get "/ some? Name = kimoto & age = 30".
The query part is stored in the Mojo::Parameters object. This can be obtained with the query method of the Mojo::URL class.
my $query = url_with->query;
The query method also has the ability to set the query string. There are three ways to set the query string: Suppose the first query string was "title = perl & name = ken".
Replace query string
To replace the query string, pass it in list format as follows:
$url->query(name =>'taro', price => 1900);
In the case of the above example, it is replaced as follows.
# Previous title = perl & name = ken # After name = taro & price = 1900
Merge query strings
To merge the query strings, pass it as an array reference.
$url->query([name =>'taro', price => 1900]);
It will be merged as follows: Those with the same value will be replaced.
# Previous title = perl & name = ken # After title = perl & name = taro & price = 1900
Add query string
Pass it as a hash reference to add the query string.
$url->query({name =>'taro', price => 1900});
It will be added as follows.
# Previous title = perl & name = ken # After title = perl & name = ken & name = taro & price = 1900
I think there is a strong demand for replacing only page numbers in web applications. In that case, it's a good idea to use the query merge feature.
<%= url_with->query([page => $page])%>
Sample using template helper
Let's write a sample code using the template helper explained this time.
use Mojolicious::Lite; get'/ person' => sub { my $self = shift; #Parameter my $name = $self->param('name'); my $age = $self->param('age'); #Drawing $self->render('index', name => $name, age => $age); };; app->start; __DATA__ @@index.html.ep <% #Stash value my $name = stash ('name'); my $age = stash ('age'); #Get log app->log->info('Template Helper'); #HTTP method my $http_method = $self->req->method; #Data dump my $data = [1, 2, 3]; warn dumper $data; %> <html> <head> <title> Template Helper </title>> %= stylesheet'/css/common.css'; %= javascript'/js/common.js'; </head> <body> %= include'/ include / header'; Name: <%= $name%> <br> Age: <%= $age%> <br> Current URL: <%= url_with%> <br> Current URL with some change: <%= url_with->query([name =>'ken'])%> %= include'/ include / footer'; </body> </html>
public / css / common.css
Place your CSS file in the "public" directory. Save it as "public / css / common.css". Settings such as changing the font color are written.
# header h1 { color: green; border-bottom: 1px solid gray; } #footer { color: red; border-top: 1px solid gray; text-align: center; }
public / js / common.js
Place your JavaScript files in the "public" directory. Please put it in the position of "public / js / common.js". JavaScript that executes a dialog that displays "Hello".
alert ('Hello');
Header and footer
Let's make a header and footer. Save it as "templates / include / header.html.ep" and "templates / include / footer.html.ep" in the "templates" directory.
templates / include / header.html.ep
<div id = "header"> <h1> Template Helper </h1> </div>
templates / include / footer.html.ep
<div id = "footer"> Author kimoto </div>
Run application
Run this application and try accessing it with "/ person? Name = kimoto & age = 32". The header and footer are inserted at the top. The following is displayed as the content.
Name: kimoto Age: 32 HTTP Method: GET Current URL: / person? name=kimoto&age=32 Current URL with some change: / person? age = 32 & name = ken