Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Catalyst сборка шаблона в переменную.


Автор: z0091 28.10.2012, 22:31
Добрый вечер!

Представим есть обертка шаблона.

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link rel="stylesheet" type="text/css" href="dbrm/root/styles/style.css"/>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>[% page.title %]</title>
    </head>
    <body>
        [% page.content %]
    </body>
</html>


Также есть контролер page.pm
В зависимости от переменной, контролер вытаскивает данные из базы.

Например страницу с id=1
Код

my $my_content = $c->model('DBI::Content::Return')->return( '1' );


DBI::Content::Return
Код

    foreach my $content_f (@$contents) {
            $keys_db->{ $content_f->{id}  }->{title} = $content_f->{title};
            $keys_db->{ $content_f->{id}  }->{date} = $content_f->{date};
            $keys_db->{ $content_f->{id}  }->{published} = $content_f->{published};
            $keys_db->{ $content_f->{id}  }->{autor} = $content_f->{autor};
            $keys_db->{ $content_f->{id}  }->{content} = $content_f->{content};
    }

    #print Dumper $keys_db;
    return \$keys_db;


Ни как не могу понять, как мне отправить данные хэша $my_content, в определенный шаблон. И уже подготовленный html код вставить в $c->page->content

Погуглив наткнулся на:
Код

my $html = $c->view('TT')->render($c,'list_main.tt2', { result => $result, no_wrapper => 1 });


Но не могу понять как это работает.

Автор: z0091 28.10.2012, 23:03
Нашел пример:


Код

sub email_stuff : Local {
    my ($self, $c, $review_id) = @_;

    $c->stash(
        review_url    => $c->uri_for("/thingy/${review_id}"),
        status_msg => "Thank you for your feedback!",
        template      => 'view_all.tt2',
    );

    $c->email(
        header => [
            From    => $c->config->{'from'},
            To      => $c->config->{'to'},
            Subject => "Emaily stuff!",
        ],
        body => $c->view('TT')->render($c, 'review.tt2'),
    );

    return; 
}



Я правильно понимаю, что линией  body => $c->view('TT')->render($c, 'review.tt2'),

Мы присваиваем в  $c->body шаблон review.tt2 с уже вставленными в него

Код

  header => [
            From    => $c->config->{'from'},
            To      => $c->config->{'to'},
            Subject => "Emaily stuff!",
        ],


Если да, то помогите пожалуйста разобраться, где и как осуществляется эта самая вставка. 

Автор: z0091 30.10.2012, 17:28
Разобрался.

Можно делать так:

Код

sub index :Path :Args(0) {
    my ( $self, $c ) = @_;


    my $my_page_id = $c->req->param('id');
    my $f = $c->model('DBI::Content::Return');
    $f = $f->return( $my_page_id );
    $c->stash->{content} = $f->{content};
    $c->stash->{content} = $c->view('TT')->render( $c, 'content.html' ); 
    print Dumper $c->stash->{content};
}



DBI::Content::Return
Код

extends 'dbrm::Model::DBI';

sub return {
    my ( $self, $id ) = @_;

    my $dbh = $self->dbh;
    
    my $contents = $dbh->selectall_arrayref(
        "SELECT * FROM  `contents` WHERE id = $id",
    { Slice => {} } )
    or die "Couldn't select books: " . $dbh->errstr;

    foreach my $content_f (@$contents) {

        $self->{content}->{title} = $content_f->{title};
        $self->{content}->{date} = $content_f->{date};
        $self->{content}->{published} = $content_f->{published};
        $self->{content}->{autor} = $content_f->{autor};
        $self->{content}->{content} = $content_f->{content};
    }
    return $self;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)