LINUX.ORG.RU

использование шаблонизатора для сайта (perl)


0

1

Добрый день! Есть скрипт для обработки данный из БД написанный на perl и выводу данных в web. Решил прикрутить к нему шаблонизатор HTML::Template. Возник вопрос. скрипт делает выборку из БД, проверяет значения, если они есть то выводит в web. если нет, то он пропускает пустое значение. выглядит это так:

{
my @text=();
while(my $row=$sth->fetchrow_arrayref()){
               if ($row->[1]) {push(@text, "Событие:".$row->[1].", ")}
               if ($row->[2]) {push(@text, "произошло ".$row->[2]."г.")}
                if ($row->[3]) {push(@text, "пояснение".$row->[3]."")}
               push(@text, "<br>");
   }              
return @text;
}
print @text;
одного из значений может не быть в базе, по этому перед тем как положить в массив, проходит проверка. если пусто то ничего не добавляется. решил отделить скрипт от HTML. И начал в скрипы добавлять шаблонизатор HTML::Template. Но из-за проверки значений не знаю как тут встроить шаблонизатор. пробовал делать так:
{
   my @text=();
   while(my $row=$sth->fetchrow_arrayref()){
   if ($row->[1]) {push (@text, A =>$row->[1],)}
   if ($row->[2]) {push (@text, B=>$row->[2],)}
   if ($row->[3]) {push (@text, C=>$row->[3],)}
   }
return @text;
}
$template->param(ROWS => [{@text}]);
print $template->output;
но тогда выводится только последняя запись. решил делать по другому:
{
  my @text=();
  while(my $row=$sth->fetchrow_arrayref()){
  push (@text, {A =>$row->[1],
       B=>$row->[2],
       C=>$row->[3]},);
  }
return @text;
}
$template->param(ROWS => [@text]);
print $template->output;
тогда выводятся все записи из БД, в месте с пустыми значениями. скажите, как мне сделать проверку пустых значений и их не выводить? а то получается следующее: Событие: сломался компьютер 28.05.2014г. пояснение и тут пусто. а надо что бы пояснение если его нет - не выводилось на экран. Может я до чего то не додумался, может этот шаблонизатор мне не очень подходит. у кого какие мысли? то есть, до того как начал делать вывод через шаблонизатор выводилось так, как мне было нужно: Событие: сломался компьютер 28.05.2014г. (без вывода пояснения, если его нет в базе)



Последнее исправление: Evgen25 (всего исправлений: 3)

А если так перефразировать ваш код:

{
   my $text=[];
   while(my $row=$sth->fetchrow_arrayref()) {
   push $text, {A =>$row->[1]} if $row->[1];
   push $text, {A =>$row->[2]} if $row->[2];
   push $text, {A =>$row->[3]} if $row->[3];
   }
return $text;
}
$template->param(ROWS => $text);
print $template->output;

kilolife ★★★★★
()
Ответ на: комментарий от kilolife

Что эквивалентно, в принципе:

{
    my $text = [map { {A=>$_} } grep {$_} @{$sth->fetchrow_arrayref()}];
    return $text;
}
$template->param(ROWS => $text);
print $template->output;

kilolife ★★★★★
()
Ответ на: комментарий от kilolife

на вскидку, не получится скорее всего. там же в {} массив собирается. т.е. в массиве должна быть строчка такого вида {a=>1,b=>2,c=>3}, Хотя целый день на эту тему мысля по голове ползают, уже запутался. пробовать надо вообщем.

Evgen25
() автор топика
Ответ на: комментарий от Evgen25

Мельком глянул на HTML::Template - показалось что там как раз массив хешей собирается, а не просто хеш. Вообщем нужно понять какой они ждут формат данных в свою переменную ROWS. А ясно, ROWS это часть вашего шаблона а не пакета HTML::Template. Как обрабатывается - надо глядеть код.

kilolife ★★★★★
()
Последнее исправление: kilolife (всего исправлений: 1)
Ответ на: комментарий от kilolife

С этим разобрался, надо было делать так:

{
  my @text=();
  while(my $row=$sth->fetchrow_arrayref()){
  push (@text, {A =>$row->[1],
       B=>$row->[2],
       C=>$row->[3]},);
  if ($row->[1]) {$template->param(print_a => 1);}
  if ($row->[2]) {$template->param(print_b => 1);}
  if ($row->[3]) {$template->param(print_c => 1);}
  }
return @text;
}
$template->param(ROWS => [@text]);
print $template->output;
а в шаблоне надо делать:
 <TMPL_IF name="print_a">
но тут вылезла новая проблема. если сделать так:
<TMPL_LOOP>
<TMPL_IF name="print_a">
</TMPL_IF>
</TMPL_LOOP>
то он не видит :<TMPL_IF name=«print_a»> и </TMPL_IF>. их надо делать до луп`а. а как сделать проверку значений внутри лупа остается проблемой

Evgen25
() автор топика
Ответ на: комментарий от Evgen25

может стоит перейти на другой шаблонизатор? кто, что может посоветовать? смотрел в сторону ctpp2 но он давно не обновляется. в репозитарии его нет, а при компиляции куча зависимостей + на форумах пишут что у него утечки памяти имеются.

Evgen25
() автор топика
Ответ на: комментарий от Evgen25

Я для веба использую Mojolicious там свой, простой шаблонизатор.
Mojolicious (если не работать с SSL) не имеет зависимостей.

kilolife ★★★★★
()
Ответ на: комментарий от Evgen25

разобрался в со своим шаблонизатором, правда получился костыль. может кто изящнее вариант предложит .....

my @text=();
  while(my $row=$sth->fetchrow_arrayref()){
   my %hash;
   if ($row->[1]) {
        $hash{A_PRINT}=1;
        }
   if ($row->[2]) {
        $hash{B_PRINT}=1;
        }
   if ($row->[3]) {
        $hash{C_PRINT}=1;
        }
   $hash{A}=$row->[1];
   $hash{B}=$row->[2];
   $hash{C}=$row->[2];
   push(@text, {%hash});
}
return @text;

Evgen25
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.