| Jifty documentation | Contained in the Jifty distribution. |
Jifty::View::Declare::Page - page wrappers
This library provides page wrappers
Sets up a new page class
Renders everything. This main driver of page rendering and called right after constructing page object.
Renders an HTML5 "doctype", <head> and the first part of a page body. This bit isn't terribly well thought out and we're not happy with it.
Renders $body_code inside a body tag
Renders the skeleton of the page
Returns a coderef that will make headers for each thing passed to it
Renders the in-page title
Renders the AdminMode alert (if AdminMode is on)
Renders the keybinding and PubSub javascript as well as the wait message
| Jifty documentation | Contained in the Jifty distribution. |
package Jifty::View::Declare::Page; use strict; use warnings; use base qw/Template::Declare Class::Accessor::Fast/;
use Jifty::View::Declare::Helpers; __PACKAGE__->mk_accessors(qw(content_code done_header _title _meta)); use constant allow_single_page => 1;
sub new { my $class = shift; my $self = $class->SUPER::new(@_); my ($title) = get_current_attr(qw(title)); $self->_title($title); $self->_title($self->_meta->{title}) if $self->_meta && $self->_meta->{title}; return $self; }
sub render { my $self = shift; # This needs to be private so we can prepend the header at the end Template::Declare->buffer->push(private => 1); $self->render_body( sub { $self->render_page->() } ); $self->render_footer; outs_raw(Template::Declare->buffer->pop); return ''; }
sub render_header { my $self = shift; return if $self->done_header; Template::Declare->buffer->push( private => 1 ); outs_raw("<!DOCTYPE html>\n<html>\n"); $self->_render_header($self->_title || Jifty->config->framework('ApplicationName')); $self->done_header(Template::Declare->buffer->pop); return ''; };
sub render_body { my ($self, $body_code) = @_; body { Jifty->handler->stash->{'in_body'} = 1; $body_code->(); Jifty->handler->stash->{'in_body'} = 0; }; }
sub render_page { my $self = shift; div { div { show '/salutation'; show '/menu'; }; div { attr { id is 'content' }; div { { no warnings qw( redefine once ); local *is::title = $self->mk_title_handler(); $self->render_pre_content_hook(); Jifty->web->render_messages; $self->content_code->(); $self->render_header(); $self->render_jifty_page_detritus(); } }; }; }; }
sub mk_title_handler { my $self = shift; return sub { shift; for (@_) { no warnings qw( uninitialized ); if ( ref($_) eq 'CODE' ) { Template::Declare->buffer->push( private => 1 ); $_->(); $self->_title( $self->_title . Template::Declare->buffer->pop ); } else { $self->_title( $self->_title . Jifty->web->escape($_) ); } } $self->render_header; $self->render_title(); }; }
sub render_title { my $self = shift; my $oldt = get('title'); set( title => $self->_title ); show '/heading_in_wrapper'; set( title => $oldt ); }
sub render_footer { my $self = shift; outs_raw('</html>'); my $ref = Template::Declare->buffer->buffer_ref; $$ref = $self->done_header . $$ref; return ''; }
sub render_pre_content_hook { if ( Jifty->admin_mode ) { with( class => "warning admin_mode" ), div { outs( _('Alert') . ': ' ); outs_raw( Jifty->web->tangent( label => _('Administration mode is enabled.'), url => '/__jifty/admin/' ) ); } } }
sub render_jifty_page_detritus { show('/app_page_footer') if Template::Declare->resolve_template('/app_page_footer' => 1); # the 1 is 'show_private' show('/keybindings'); with( id => "jifty-wait-message", style => "display: none" ), div { _('Loading...') }; # This is required for jifty server push. If you maintain your own # wrapper, make sure you have this as well. if ( Jifty->config->framework('PubSub')->{'Enable'} && Jifty::Subs->list ) { script { outs_raw('jQuery(document).ready(function(){new Jifty.Subs({}).start()});') }; } } sub _render_header { my $self = shift; my $title = shift || ''; $title =~ s/<.*?>//g; # remove html HTML::Entities::decode_entities($title); my $old = Jifty->handler->stash->{'in_body'}; Jifty->handler->stash->{'in_body'} = 0; with( title => $title ), show('/header'); Jifty->handler->stash->{'in_body'} = $old; } 1;