Skip to content

Commit

Permalink
Merge pull request #10679 from hypeJunction/shell
Browse files Browse the repository at this point in the history
feat(views): a more flexible extendable html page shell
  • Loading branch information
jdalsem committed Mar 14, 2017
2 parents 62a04f9 + 550aeb8 commit 35e3d0c
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 114 deletions.
1 change: 1 addition & 0 deletions docs/guides/upgrading.rst
Expand Up @@ -27,6 +27,7 @@ Removed views
* ``page/layouts/walled_garden/cancel_button``
* ``page/layouts/two_column_left_sidebar``
* ``page/layouts/widgets/add_panel``
* ``page/elements/topbar_wrapper``: update your use of ``page/elements/topbar`` to include a check for a logged in user
* ``groups/group_sort_menu``: use ``register, filter:menu:groups/all`` plugin hook
* ``subscriptions/form/additions``: extend ``notifications/settings/other`` instead
* ``messageboard/css``
Expand Down
2 changes: 1 addition & 1 deletion engine/lib/views.php
Expand Up @@ -478,6 +478,7 @@ function elgg_view_page($title, $body, $page_shell = 'default', $vars = array())
$vars['title'] = $title;
$vars['body'] = $body;
$vars['sysmessages'] = $messages;
$vars['page_shell'] = $page_shell;

// head has keys 'title', 'metas', 'links'
$head_params = _elgg_views_prepare_head($title);
Expand All @@ -488,7 +489,6 @@ function elgg_view_page($title, $body, $page_shell = 'default', $vars = array())

$output = elgg_view("page/$page_shell", $vars);

$vars['page_shell'] = $page_shell;

// Allow plugins to modify the output
$output = elgg_trigger_plugin_hook('output', 'page', $vars, $output);
Expand Down
63 changes: 31 additions & 32 deletions views/default/page/admin.php
Expand Up @@ -12,43 +12,42 @@

elgg_load_css('elgg.admin');

// render content before head so that JavaScript and CSS can be loaded. See #4032
$header = elgg_view('admin/header', $vars);

$messages = elgg_view('page/elements/messages', array('object' => $vars['sysmessages']));
$messages .= elgg_view('page/elements/admin_notices', $vars);

$content = $vars["body"];

$footer = elgg_view('admin/footer', $vars);

$body = <<<__BODY
<div class="elgg-page elgg-page-admin">
<div class="elgg-inner">
<div class="elgg-page-header">
<div class="elgg-inner clearfix">
$header
</div>
</div>
<div class="elgg-page-messages">
$messages
</div>
<div class="elgg-page-body">
<div class="elgg-inner">
$content
</div>
</div>
<div class="elgg-page-footer">
<div class="elgg-inner">
$footer
</div>
</div>
</div>
</div>
__BODY;
// render content before head so that JavaScript and CSS can be loaded. See #4032
$sections = [
'header' => elgg_view('admin/header', $vars),
'messages' => $messages,
'body' => elgg_extract('body', $vars),
'footer' => elgg_view('admin/footer', $vars),
];

$page = '';
foreach ($sections as $section => $content) {
$page .= elgg_view('page/elements/section', [
'section' => $section,
'html' => $content,
'page_shell' => elgg_extract('page_shell', $vars),
]);
}

$page = elgg_format_element('div', ['class' => 'elgg-inner'], $page);

$page_vars = elgg_extract('page_attrs', $vars, []);
$page_vars['class'] = elgg_extract_class($page_vars, ['elgg-page', 'elgg-page-admin']);

$body = elgg_format_element('div', $page_vars, $page);

$body .= elgg_view('page/elements/foot');

$head = elgg_view('page/elements/head', $vars['head']);

echo elgg_view("page/elements/html", array("head" => $head, "body" => $body));
$params = array(
'head' => $head,
'body' => $body,
'body_attrs' => elgg_extract('body_attrs', $vars, []),
'html_attrs' => elgg_extract('html_attrs', $vars, []),
);

echo elgg_view('page/elements/html', $params);
83 changes: 35 additions & 48 deletions views/default/page/default.php
@@ -1,58 +1,47 @@
<?php

/**
* Elgg pageshell
* The standard HTML page shell that everything else fits into
*
* @package Elgg
* @subpackage Core
* Renders a standard HTML page shell
*
* @uses $vars['section'] An array of page sections to render
* @uses $vars['html_attrs'] Attributes of the <html> tag
* @uses $vars['head'] Parameters for the <head> element
* @uses $vars['body_attrs'] Attributes of the <body> tag
* @uses $vars['page_attrs'] Attributes of the .elgg-page container
* @uses $vars['title'] Title of the page
* @uses $vars['body'] The main content of the page
* @uses $vars['sysmessages'] A 2d array of various message registers, passed from system_messages()
*/

// render content before head so that JavaScript and CSS can be loaded. See #4032

$messages = elgg_view('page/elements/messages', array('object' => $vars['sysmessages']));

$header = elgg_view('page/elements/header', $vars);
$navbar = elgg_view('page/elements/navbar', $vars);
$content = elgg_view('page/elements/body', $vars);
$footer = elgg_view('page/elements/footer', $vars);
$sections = elgg_extract('sections', $vars);

if (empty($sections)) {
// render content before head so that JavaScript and CSS can be loaded. See #4032
$sections = [
'messages' => elgg_view('page/elements/messages', [
'object' => $vars['sysmessages'],
]),
'topbar' => elgg_view('page/elements/topbar', $vars),
'header' => elgg_view('page/elements/header', $vars),
'navbar' => elgg_view('page/elements/navbar', $vars),
'body' => elgg_view('page/elements/body', $vars),
'footer' => elgg_view('page/elements/footer', $vars),
];
}

$body = <<<__BODY
<div class="elgg-page elgg-page-default">
<div class="elgg-page-messages">
$messages
</div>
__BODY;
$page = '';
foreach ($sections as $section => $content) {
$page .= elgg_view('page/elements/section', [
'section' => $section,
'html' => $content,
'page_shell' => elgg_extract('page_shell', $vars),
]);
}

$body .= elgg_view('page/elements/topbar_wrapper', $vars);
$page_vars = elgg_extract('page_attrs', $vars, []);
$page_vars['class'] = elgg_extract_class($page_vars, ['elgg-page', 'elgg-page-default']);

$body .= <<<__BODY
<div class="elgg-page-header">
<div class="elgg-inner">
$header
</div>
</div>
<div class="elgg-page-navbar">
<div class="elgg-inner">
$navbar
</div>
</div>
<div class="elgg-page-body">
<div class="elgg-inner">
$content
</div>
</div>
<div class="elgg-page-footer">
<div class="elgg-inner">
$footer
</div>
</div>
</div>
__BODY;
$body = elgg_format_element('div', $page_vars, $page);

$body .= elgg_view('page/elements/foot');

Expand All @@ -61,10 +50,8 @@
$params = array(
'head' => $head,
'body' => $body,
'body_attrs' => elgg_extract('body_attrs', $vars, []),
'html_attrs' => elgg_extract('html_attrs', $vars, []),
);

if (isset($vars['body_attrs'])) {
$params['body_attrs'] = $vars['body_attrs'];
}

echo elgg_view("page/elements/html", $params);
echo elgg_view('page/elements/html', $params);
31 changes: 17 additions & 14 deletions views/default/page/elements/html.php
Expand Up @@ -2,29 +2,32 @@
/**
* Page shell for all HTML pages
*
* @uses $vars['head'] Parameters for the <head> element
* @uses $vars['body_attrs'] Attributes of the <body> tag
* @uses $vars['body'] The main content of the page
* @uses $vars['body_attrs'] Attributes of the <html> tag
* @uses $vars['head'] Parameters for the <head> element
* @uses $vars['body_attrs'] Attributes of the <body> tag
* @uses $vars['body'] The main content of the page
*/
// Set the content type
elgg_set_http_header("Content-type: text/html; charset=UTF-8");

$lang = get_current_language();

$attrs = "";
if (isset($vars['body_attrs'])) {
$attrs = elgg_format_attributes($vars['body_attrs']);
if ($attrs) {
$attrs = " $attrs";
}
}
$default_html_attrs = [
'xmlns' => 'http://www.w3.org/1999/xhtml',
'xml:lang' => $lang,
'lang' => $lang,
];
$html_attrs = elgg_extract('html_attrs', $vars, []);
$html_attrs = array_merge($default_html_attrs, $html_attrs);

$body_attrs = elgg_extract('body_attrs', $vars, []);
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang; ?>" lang="<?php echo $lang; ?>">
<html <?= elgg_format_attributes($html_attrs) ?>>
<head>
<?php echo $vars["head"]; ?>
<?= elgg_extract('head', $vars, '') ?>
</head>
<body<?php echo $attrs ?>>
<?php echo $vars["body"]; ?>
<body <?= elgg_format_attributes($body_attrs) ?>>
<?= elgg_extract('body', $vars, '') ?>
</body>
</html>
33 changes: 33 additions & 0 deletions views/default/page/elements/section.php
@@ -0,0 +1,33 @@
<?php

/**
* A wrapper to render a section of the page shell
*
* @uses $vars['section'] Section name (e.g. navbar, header etc)
* @uses $vars['html'] Content of the element
*/
$section = elgg_extract('section', $vars);
$html = elgg_extract('html', $vars);

if ($section && elgg_view_exists("page/elements/$section/before")) {
echo elgg_view("page/elements/$section/before", $vars);
}

if (!empty($html)) {
$class = ['elgg-page-section'];
if ($section) {
$class[] = "elgg-page-$section";
}

$inner = elgg_format_element('div', [
'class' => 'elgg-inner',
], $html);

echo elgg_format_element('div', [
'class' => $class,
], $inner);
}

if ($section && elgg_view_exists("page/elements/$section/after")) {
echo elgg_view("page/elements/$section/after", $vars);
}
10 changes: 8 additions & 2 deletions views/default/page/elements/topbar.php
@@ -1,8 +1,14 @@
<?php

/**
* Elgg topbar
* The standard elgg top toolbar
*/
if (!elgg_is_logged_in()) {
return;
}

// Elgg logo
echo elgg_view_menu('topbar', array('sort_by' => 'priority', array('elgg-menu-hz')));
echo elgg_view_menu('topbar', [
'sort_by' => 'priority',
'class' => 'elgg-menu-hz',
]);
17 changes: 0 additions & 17 deletions views/default/page/elements/topbar_wrapper.php

This file was deleted.

0 comments on commit 35e3d0c

Please sign in to comment.