Simple search application (Mojolicious::Lite version)
It is a simple search application. This is a rewrite of the "simple search application" in Chapter 5, Section 3 of Easy Programming CGI / Perl using Mojolicious::Lite. I am.
Simple search application
It is a simple search application.
Search page
[f: id: yukikimoto: 20100219230809p: image]
Search result page
[f: id: yukikimoto: 20100219230811p: image]
Registration page
[f: id: yukikimoto: 20100219231044p: image]
Source code
The source code of the search application.
use Mojolicious::Lite; use utf8; use Scalar::Util'looks_like_number'; use Encode qw / encode decode /; use File::Path'mkpath'; use File::Basename'dirname'; #Data file (absolute path) my $data_file = app->home->rel_file('search-person / data.txt'); unless (-f $data_file) { #Create data directory my $data_dir = dirname ($data_file); unless (-d $data_dir) { mkpath ($data_dir) or die "Cannot create directory'$data_dir'"; } #Create file open my $fh,'>', $data_file or die "Cannot create file'$data_file': $!"; close $fh; } #Search page (This is top page) get'/' => sub { shift->render(title =>'Search page'); } =>'index'; #Data registering page get'/ register' => sub { shift->render(title =>'Resist page'); } =>'register'; #Search result get'/ search-result' => sub { my $self = shift; my $height_min = $self->param('height-min'); my $height_max = $self->param('height-max'); #Parameter error my $error = ! looks_like_number($height_min)?'Height min must be a number' :! looks_like_number($height_max)?'Height max must be a number' : undef; # Render error page return $self->render( template =>'error', title =>'Error page', message => $error ) if $error; #Open open my $fh,'<', $data_file or die "Cannot open file'$data_file': $!"; #Search my $persons = []; while (my $line = <$fh>) { #Decode $line = decode ('UTF-8', $line); # Remove line break chomp $line; #Split line my @record = split("\ t", $line); #Person my $person = {}; $person->{name} = $record [0]; $person->{height} = $record [1]; #Match if ($person->{height}> = $height_min && $person->{height} <= $height_max) { push @$persons, $person; } } $self->render(title =>'Search result', persons => $persons); } =>'search-result'; #Post data post'/ post' => sub { my $self = shift; #Parameter my $name = $self->param('name'); my $height = $self->param('height'); #Parameter error my $error =! $name ?'You must be specify name' :! looks_like_number($height) ?'Height must be a number' : undef; # Render error page return $self->render(template =>'error', title =>'Error page', message => $error) if $error; #Open open my $fh,'>>', $data_file or die "Cannot open file'$data_file': $!"; #Line my $line = join "\ t", $name, $height; #Print print $fh encode ('UTF-8', $line). "\ n"; close $fh; #Redirect $self->redirect_to('register'); } =>'post'; app->start; __DATA__ @@layouts / default.html.ep <html> <head> <meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8"> <title> Simple Search-<%= $title%> </title> </head> <body> <%= content%> </body> </html> @@index.html.ep %layout'default'; <h1> Simple Search-<%= $title%> </h1> <form method = "get" action = "<%= url_for ('search-result')%>"> <div> Search person informations. </div> <div> Height <input type = "text" name = "height-min">- <input type = "text" name = "height-max"> </div> <div> <input type = "submit" value = "Search"> </div> </form> <div> <a href="<%=url_for('register')%>"> Go to register page.</a> </div> @@register.html.ep %layout'default'; <h1> Simple Search-<%= $title%> </h1> <form method = "post" action = "<%= url_for ('post')%>"> <div> Resist person information. </div> <div> Name <input type = "text" name = "name"> </div> <div> Height <input type = "text" name = "height"> </div> <div> <input type = "submit" value = "Resister"> </div> </form> <div> <a href="<%=url_for('index')%>"> Go to search page</a> </div> @@error.html.ep %layout'default'; <h1> Simple Search-<%= $title%> </h1> <%= $message%> @@search-result.html.ep %layout'default'; <h1> Simple Search-<%= $title%> </h1> <div> <a href="<%=url_for('index')%>"> Go to Searching page</a> <a href="<%=url_for('register')%>"> Go to Resisting page</a> </div> <div> %for my $person (@$persons) { <div> <hr> <div> Name: <%= $person->{name}%> </div> <div> Height: <%= $person->{height}%> </div> <div> %} </div>
I'm using a while statement to retrieve a line from a file.