Урок 2: Выводим список новостей
Исходные файлы к этой статье можно найти здесь.
В предыдущей статье мы познакомились с основами PERL-API шаблонизатора CTPP2, написав программу "Hello, World!". В этом примере мы создадим ленту новостей для сайта.
Новости будем брать из СУБД MySQL, и для этого создадим таблицу со следующей структурой:
CREATE TABLE news
(
id INT NOT NULL auto_increment,
date INT NOT NULL,
title VARCHAR(255) NOT NULL,
body text,
publication VARCHAR(255) NOT NULL DEFAULT '',
reporter VARCHAR(255) NOT NULL DEFAULT '',
reporter_url VARCHAR(255) NOT NULL DEFAULT '',
primary key(id)
);
Новости (многоточиями заменен длинный текст):
{
"date" : 1169090455,
"title" : "FreeBSD 6.3-RELEASE is now available",
"body" : "Please ......."
},
{
"date" : 1169019722,
"title" : "New RSS Feeds",
"body" : "Six new ......."
},
{
"date" : 1169010455,
"title" : "$199 Linux PC Now Available at Sears.com",
"body" : "Linspire, Inc ........",
"publication" : "http:// .......",
"reporter" : "SOURCE Linspire, Inc."
},
{
"date" : 1168840430,
"title" : "Samba's Tridge clusters code and crowds",
"body" : "Andrew .......",
"publication" : "http:// .......",
"reporter" : "Dahna McConnachie",
"reporter_url" : "http:// ......."
}
Шаблон:
<html>
<head>
<title>News List</title>
<style type="text/css">
a {
font-family: Verdana, Arial, Helvetica, sans-serif;
color: black; font-size: 8pt; font-weight: bold;
}
span
{
font-family: Verdana, Arial, Helvetica, sans-serif;
color: black; font-size: 10pt; font-weight: normal;
}
span.date
{
font-family: Verdana, Arial, Helvetica, sans-serif;
color: #D00000; font-size: 10pt; font-weight: normal;
}
</style>
</head>
<body>
<TMPL_if newslist>
<div align="center" style="width=100%">
<table cellspacing="0" cellpadding="0" border="0" width="96%">
<TMPL_loop newslist>
<tr><td>
<span class="date"><b><i><TMPL_var DATE_FORMAT(date, "%d %b %Y %H:%M")>
</i></b></span>
<span><b><TMPL_var title></b><br><TMPL_var body><br>
<TMPL_if publication>
<a href="<TMPL_var publication>">Main URL</a><br>
</TMPL_if>
<TMPL_if reporter>
<TMPL_if reporter_url>
<a href="<TMPL_var reporter_url>"><TMPL_var reporter></a><br>
<TMPL_else>
<TMPL_var reporter>
</TMPL_if>
</TMPL_if>
<br>
</span>
</td></tr>
</TMPL_loop>
</table>
</div>
</TMPL_if>
</body>
</html>
Код
Загружаем модули HTML::CTPP2 и DBI.
use HTML::CTPP2;
use DBI;
Подключаемся к БД и создаем объект шаблонизатора.
my $DBH = DBI -> connect('DBI:mysql:database=news;host=localhost;port=3306',
'newsreader',
'topsecret') || die "Can't connect: $!";
my $T = new HTML::CTPP2();
Делаем запрос к БД и получаем данные.
my $Query = "SELECT id, date, title, body, publication
reporter, reporter_url FROM news ORDER BY date DESC";
my $STH = $DBH -> prepare($Query);
$STH -> execute;
my $H = $STH -> fetchall_arrayref({});
Отправляем данные в шаблонизатор и выводим результат.
$T -> param({newslist => $H});
print "Content-type: text/html\n\n";
print $T -> output($Bytecode);
Проверяем работу
1. Комипилируем шаблон
ctpp2c newslist.tmpl newslist.ct2
2. Запускаем код
#!/usr/bin/perl
use strict;
use HTML::CTPP2;
use DBI;
use Data::Dumper;
my $DBH = DBI -> connect('DBI:mysql:database=news;host=localhost;port=3306',
'newsreader',
'topsecret') || die "Can't connect: $!";
my $T = new HTML::CTPP2();
my $Bytecode = $T -> load_bytecode("newslist.ct2");
my $Query = "SELECT id, date, title, body, publication
reporter, reporter_url FROM news ORDER BY date DESC";
my $STH = $DBH -> prepare($Query);
$STH -> execute;
my $H = $STH -> fetchall_arrayref({});
$T -> param({newslist => $H});
print "Content-type: text/html\n\n";
print $T -> output($Bytecode);
Результат работы - страница со списком новостей:
.
|