Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
project
drupal
Commits
10b03890
Commit
10b03890
authored
Apr 03, 2014
by
Alex Pott
Browse files
Issue
#2218039
by sun, dawehner: Render the maintenance/install page like any other HTML page.
parent
719b36a4
Changes
20
Hide whitespace changes
Inline
Side-by-side
core/authorize.php
View file @
10b03890
...
...
@@ -21,6 +21,7 @@
*/
use
Drupal\Component\Utility\Settings
;
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
// Change the directory to the Drupal root.
chdir
(
'..'
);
...
...
@@ -155,13 +156,7 @@ function authorize_access_allowed() {
if
(
!
empty
(
$output
))
{
drupal_add_http_header
(
'Content-Type'
,
'text/html; charset=utf-8'
);
$maintenance_page
=
array
(
'#page'
=>
array
(
'#title'
=>
$page_title
,
),
'#theme'
=>
'maintenance_page'
,
'#content'
=>
$output
,
print
DefaultHtmlPageRenderer
::
renderPage
(
$output
,
$page_title
,
'maintenance'
,
array
(
'#show_messages'
=>
$show_messages
,
);
print
drupal_render
(
$maintenance_page
);
));
}
core/includes/batch.inc
View file @
10b03890
...
...
@@ -16,6 +16,7 @@
use
Drupal\Component\Utility\Timer
;
use
Drupal\Core\Batch\Percentage
;
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
use
Symfony\Component\HttpFoundation\JsonResponse
;
use
Symfony\Component\HttpFoundation\Request
;
use
Symfony\Component\HttpFoundation\RedirectResponse
;
...
...
@@ -121,18 +122,14 @@ function _batch_progress_page() {
// the error message.
ob_start
();
$fallback
=
$current_set
[
'error_message'
]
.
'<br />'
.
$batch
[
'error_message'
];
$fallback
=
array
(
'#theme'
=>
'maintenance_page'
,
'#title'
=>
$current_set
[
'title'
],
'#content'
=>
$fallback
,
'#show_messages'
=>
FALSE
,
);
// We strip the end of the page using a marker in the template, so any
// additional HTML output by PHP shows up inside the page rather than below
// it. While this causes invalid HTML, the same would be true if we didn't,
// as content is not allowed to appear after </html> anyway.
$fallback
=
drupal_render
(
$fallback
);
$fallback
=
DefaultHtmlPageRenderer
::
renderPage
(
$fallback
,
$current_set
[
'title'
],
'maintenance'
,
array
(
'#show_messages'
=>
FALSE
,
));
list
(
$fallback
)
=
explode
(
'<!--partial-->'
,
$fallback
);
print
$fallback
;
...
...
core/includes/errors.inc
View file @
10b03890
...
...
@@ -5,6 +5,7 @@
* Functions for error handling.
*/
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
use
Drupal\Core\Utility\Error
;
use
Drupal\Component\Utility\String
;
use
Symfony\Component\HttpFoundation\Response
;
...
...
@@ -231,12 +232,7 @@ function _drupal_log_error($error, $fatal = FALSE) {
install_display_output
(
$output
,
$GLOBALS
[
'install_state'
]);
}
else
{
$output
=
array
(
'#theme'
=>
'maintenance_page'
,
'#title'
=>
'Error'
,
'#content'
=>
$message
,
);
$output
=
drupal_render
(
$output
);
$output
=
DefaultHtmlPageRenderer
::
renderPage
(
$message
,
'Error'
);
}
$response
=
new
Response
(
$output
,
500
);
...
...
core/includes/install.core.inc
View file @
10b03890
...
...
@@ -14,6 +14,7 @@
use
Drupal\Core\Installer\Exception\NoProfilesException
;
use
Drupal\Core\Language\Language
;
use
Drupal\Core\Language\LanguageManager
;
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
use
Drupal\Core\StringTranslation\Translator\FileTranslation
;
use
Drupal\Core\Extension\ExtensionDiscovery
;
use
Drupal\Core\DependencyInjection\ContainerBuilder
;
...
...
@@ -903,6 +904,7 @@ function install_display_output($output, $install_state) {
// Only show the task list if there is an active task; otherwise, the page
// request has ended before tasks have even been started, so there is nothing
// meaningful to show.
$regions
=
array
();
if
(
isset
(
$install_state
[
'active_task'
]))
{
// Let the theming function know when every step of the installation has
// been completed.
...
...
@@ -912,20 +914,10 @@ function install_display_output($output, $install_state) {
'#items'
=>
install_tasks_to_display
(
$install_state
),
'#active'
=>
$active_task
,
);
drupal_add_region_content
(
'sidebar_first'
,
drupal_render
(
$task_list
))
;
$regions
[
'sidebar_first'
]
=
$task_list
;
}
$install_page
=
array
(
'#theme'
=>
'install_page'
,
// $output has to be rendered here, because the install page template is not
// wrapped into the html template, which means that any #attached libraries
// in $output will not be loaded, because the wrapping HTML has been printed
// already.
'#content'
=>
drupal_render
(
$output
),
);
if
(
isset
(
$output
[
'#title'
]))
{
$install_page
[
'#page'
][
'#title'
]
=
$output
[
'#title'
];
}
print
drupal_render
(
$install_page
);
print
DefaultHtmlPageRenderer
::
renderPage
(
$output
,
$output
[
'#title'
],
'install'
,
$regions
);
exit
;
}
...
...
core/includes/theme.inc
View file @
10b03890
...
...
@@ -2070,16 +2070,26 @@ function template_preprocess_page(&$variables) {
$variables
[
'base_path'
]
=
base_path
();
$variables
[
'front_page'
]
=
url
();
$variables
[
'feed_icons'
]
=
drupal_get_feeds
();
$variables
[
'language'
]
=
$language_interface
;
$variables
[
'language'
]
->
dir
=
$language_interface
->
direction
?
'rtl'
:
'ltr'
;
$variables
[
'logo'
]
=
theme_get_setting
(
'logo.url'
);
$variables
[
'main_menu'
]
=
theme_get_setting
(
'features.main_menu'
)
?
menu_main_menu
()
:
array
();
$variables
[
'secondary_menu'
]
=
theme_get_setting
(
'features.secondary_menu'
)
?
menu_secondary_menu
()
:
array
();
$variables
[
'action_links'
]
=
menu_get_local_actions
();
$variables
[
'site_name'
]
=
(
theme_get_setting
(
'features.name'
)
?
String
::
checkPlain
(
$site_config
->
get
(
'name'
))
:
''
);
$variables
[
'site_slogan'
]
=
(
theme_get_setting
(
'features.slogan'
)
?
filter_xss_admin
(
$site_config
->
get
(
'slogan'
))
:
''
);
$variables
[
'tabs'
]
=
menu_local_tabs
();
if
(
!
defined
(
'MAINTENANCE_MODE'
))
{
$variables
[
'main_menu'
]
=
theme_get_setting
(
'features.main_menu'
)
?
menu_main_menu
()
:
array
();
$variables
[
'secondary_menu'
]
=
theme_get_setting
(
'features.secondary_menu'
)
?
menu_secondary_menu
()
:
array
();
$variables
[
'action_links'
]
=
menu_get_local_actions
();
$variables
[
'tabs'
]
=
menu_local_tabs
();
$variables
[
'feed_icons'
]
=
drupal_get_feeds
();
}
else
{
$variables
[
'main_menu'
]
=
array
();
$variables
[
'secondary_menu'
]
=
array
();
$variables
[
'action_links'
]
=
array
();
$variables
[
'tabs'
]
=
array
();
$variables
[
'feed_icons'
]
=
''
;
}
// Pass the main menu and secondary menu to the template as render arrays.
if
(
!
empty
(
$variables
[
'main_menu'
]))
{
...
...
@@ -2120,10 +2130,12 @@ function template_preprocess_page(&$variables) {
// re-use the cache of an already retrieved menu containing the active link
// for the current page.
// @see menu_tree_page_data()
$variables
[
'breadcrumb'
]
=
array
(
'#theme'
=>
'breadcrumb'
,
'#breadcrumb'
=>
\
Drupal
::
service
(
'breadcrumb'
)
->
build
(
\
Drupal
::
request
()
->
attributes
->
all
()),
);
if
(
!
defined
(
'MAINTENANCE_MODE'
))
{
$variables
[
'breadcrumb'
]
=
array
(
'#theme'
=>
'breadcrumb'
,
'#breadcrumb'
=>
\
Drupal
::
service
(
'breadcrumb'
)
->
build
(
\
Drupal
::
request
()
->
attributes
->
all
()),
);
}
}
/**
...
...
@@ -2201,12 +2213,6 @@ function theme_get_suggestions($args, $base, $delimiter = '__') {
*
* Default template: maintenance-page.html.twig.
*
* The variables array generated here is a mirror of
* template_preprocess_page(). This preprocessor will run its course when
* theme_maintenance_page() is invoked. An alternate template file of
* maintenance-page--offline.html.twig can be used when the database is offline
* to hide errors and completely replace the content.
*
* @param array $variables
* An associative array containing:
* - content - An array of page content.
...
...
@@ -2214,117 +2220,29 @@ function theme_get_suggestions($args, $base, $delimiter = '__') {
* @see system_page_build()
*/
function
template_preprocess_maintenance_page
(
&
$variables
)
{
$language_interface
=
\
Drupal
::
languageManager
()
->
getCurrentLanguage
();
// Initializes attributes which are specific to the html element.
$variables
[
'html_attributes'
]
=
new
Attribute
;
// HTML element attributes.
$variables
[
'html_attributes'
][
'lang'
]
=
$language_interface
->
id
;
$variables
[
'html_attributes'
][
'dir'
]
=
$language_interface
->
direction
?
'rtl'
:
'ltr'
;
// Add favicon
if
(
theme_get_setting
(
'features.favicon'
))
{
$favicon
=
theme_get_setting
(
'favicon.url'
);
$type
=
theme_get_setting
(
'favicon.mimetype'
);
$build
[
'#attached'
][
'drupal_add_html_head_link'
][][]
=
array
(
'rel'
=>
'shortcut icon'
,
'href'
=>
UrlHelper
::
stripDangerousProtocols
(
$favicon
),
'type'
=>
$type
,
);
drupal_render
(
$build
);
}
foreach
(
system_region_list
(
$GLOBALS
[
'theme'
])
as
$region_key
=>
$region_name
)
{
if
(
!
isset
(
$variables
[
$region_key
]))
{
$variables
[
$region_key
]
=
array
();
}
// Append region content set with drupal_add_region_content() as markup.
if
(
$region_content
=
drupal_get_region_content
(
$region_key
))
{
$variables
[
$region_key
][][
'#markup'
]
=
$region_content
;
}
}
// Setup layout variable.
$variables
[
'layout'
]
=
'none'
;
if
(
!
empty
(
$variables
[
'sidebar_first'
]))
{
$variables
[
'layout'
]
=
'first'
;
}
if
(
!
empty
(
$variables
[
'sidebar_second'
]))
{
$variables
[
'layout'
]
=
(
$variables
[
'layout'
]
==
'first'
)
?
'both'
:
'second'
;
}
$site_config
=
\
Drupal
::
config
(
'system.site'
);
$site_name
=
$site_config
->
get
(
'name'
);
$site_slogan
=
$site_config
->
get
(
'slogan'
);
// Construct the page title.
if
(
isset
(
$variables
[
'page'
][
'#title'
]))
{
$head_title
=
array
(
'title'
=>
strip_tags
(
$variables
[
'page'
][
'#title'
]),
'name'
=>
String
::
checkPlain
(
$site_config
->
get
(
'name'
)),
);
}
else
{
$head_title
=
array
(
'name'
=>
String
::
checkPlain
(
$site_name
));
if
(
$site_slogan
)
{
$head_title
[
'slogan'
]
=
strip_tags
(
filter_xss_admin
(
$site_slogan
));
}
}
// These are usually added from system_page_build() except maintenance.css.
// When the database is inactive it's not called so we add it here.
$default_css
[
'library'
][]
=
'core/normalize'
;
$default_css
[
'library'
][]
=
'system/maintenance'
;
$attached
=
array
(
'#attached'
=>
$default_css
);
drupal_render
(
$attached
);
$variables
[
'messages'
]
=
array
(
'#theme'
=>
'status_messages'
,
'#access'
=>
$variables
[
'show_messages'
],
);
$variables
[
'head_title_array'
]
=
$head_title
;
$variables
[
'head_title'
]
=
implode
(
' | '
,
$head_title
);
$variables
[
'front_page'
]
=
url
();
$variables
[
'help'
]
=
''
;
$variables
[
'language'
]
=
$language_interface
;
$variables
[
'logo'
]
=
theme_get_setting
(
'logo.url'
);
$variables
[
'site_name'
]
=
(
theme_get_setting
(
'features.name'
)
?
String
::
checkPlain
(
$site_name
)
:
''
);
$variables
[
'site_slogan'
]
=
(
theme_get_setting
(
'features.slogan'
)
?
filter_xss_admin
(
$site_slogan
)
:
''
);
// Compile a list of classes that are going to be applied to the body element.
$variables
[
'attributes'
][
'class'
][]
=
'maintenance-page'
;
$variables
[
'attributes'
][
'class'
][]
=
'in-maintenance'
;
// @todo Rename the templates to page--maintenance + page--install.
template_preprocess_page
(
$variables
);
$page_object
=
$variables
[
'page'
][
'#page'
];
$attributes
=
$page_object
->
getBodyAttributes
();
$classes
=
$attributes
[
'class'
];
$classes
[]
=
'maintenance-page'
;
$classes
[]
=
'in-maintenance'
;
if
(
isset
(
$variables
[
'db_is_active'
])
&&
!
$variables
[
'db_is_active'
])
{
$variables
[
'attributes'
][
'class'
][]
=
'db-offline'
;
}
if
(
$variables
[
'layout'
]
==
'both'
)
{
$variables
[
'attributes'
][
'class'
][]
=
'two-sidebars'
;
}
elseif
(
$variables
[
'layout'
]
==
'none'
)
{
$variables
[
'attributes'
][
'class'
][]
=
'no-sidebars'
;
}
else
{
$variables
[
'attributes'
][
'class'
][]
=
'one-sidebar'
;
$variables
[
'attributes'
][
'class'
][]
=
'sidebar-'
.
$variables
[
'layout'
];
$classes
[]
=
'db-offline'
;
}
$attributes
[
'class'
]
=
$classes
;
$variables
[
'head'
]
=
drupal_get_html_head
();
// While this code is used in the installer, the language module may not be
// enabled yet (even maybe no database set up yet), but an RTL language
// selected should result in RTL stylesheets loaded properly already.
$css
=
_drupal_add_css
();
include_once
DRUPAL_ROOT
.
'/core/modules/language/language.module'
;
// Wrapping drupal_get_css() and drupal_get_js() in an object so they can
// be called when printed.
$variables
[
'styles'
]
=
new
RenderWrapper
(
'drupal_get_css'
,
array
(
$css
));
$variables
[
'scripts'
]
=
new
RenderWrapper
(
'drupal_get_js'
);
// Allow the page to define a title.
if
(
isset
(
$variables
[
'page'
][
'#title'
]))
{
$variables
[
'title'
]
=
$variables
[
'page'
][
'#title'
];
}
// @see system_page_build()
$attached
=
array
(
'#attached'
=>
array
(
'library'
=>
array
(
'core/normalize'
,
'system/maintenance'
,
),
),
);
drupal_render
(
$attached
);
}
/**
...
...
@@ -2332,20 +2250,21 @@ function template_preprocess_maintenance_page(&$variables) {
*
* Default template: install-page.html.twig.
*
* The variables array generated here is a mirror of
* template_preprocess_page(). This preprocessor will run its course when
* theme_install_page() is invoked.
*
* @param array $variables
* An associative array containing:
* - content - An array of page content.
*
* @see template_preprocess_maintenance_page()
*
*/
function
template_preprocess_install_page
(
&
$variables
)
{
template_preprocess_maintenance_page
(
$variables
);
$variables
[
'attributes'
][
'class'
][]
=
'install-page'
;
$page_object
=
$variables
[
'page'
][
'#page'
];
$attributes
=
$page_object
->
getBodyAttributes
();
$classes
=
$attributes
[
'class'
];
$classes
[]
=
'install-page'
;
$attributes
[
'class'
]
=
$classes
;
// Override the site name that is displayed on the page, since Drupal is
// still in the process of being installed.
$distribution_name
=
String
::
checkPlain
(
drupal_install_profile_distribution_name
());
...
...
@@ -2643,11 +2562,11 @@ function drupal_common_theme() {
),
// From theme.maintenance.inc.
'maintenance_page'
=>
array
(
'
variables'
=>
array
(
'content'
=>
NULL
,
'show_messages'
=>
TRUE
,
'page'
=>
array
())
,
'
render element'
=>
'page'
,
'template'
=>
'maintenance-page'
,
),
'install_page'
=>
array
(
'
variables'
=>
array
(
'content'
=>
NULL
,
'show_messages'
=>
TRUE
,
'page'
=>
array
())
,
'
render element'
=>
'page'
,
'template'
=>
'install-page'
,
),
'task_list'
=>
array
(
...
...
core/includes/theme.maintenance.inc
View file @
10b03890
...
...
@@ -31,6 +31,7 @@ function _drupal_maintenance_theme() {
require_once
__DIR__
.
'/unicode.inc'
;
require_once
__DIR__
.
'/file.inc'
;
require_once
__DIR__
.
'/module.inc'
;
require_once
__DIR__
.
'/database.inc'
;
Unicode
::
check
();
// Install and update pages are treated differently to prevent theming overrides.
...
...
@@ -43,13 +44,6 @@ function _drupal_maintenance_theme() {
}
}
else
{
// The bootstrap was not complete. So we are operating in a crippled
// environment, we need to bootstrap just enough to allow hook invocations
// to work. See _drupal_log_error().
if
(
!
class_exists
(
'Drupal\Core\Database\Database'
,
FALSE
))
{
require_once
__DIR__
.
'/database.inc'
;
}
// Use the maintenance theme if specified, otherwise attempt to use the
// default site theme.
try
{
...
...
core/includes/update.inc
View file @
10b03890
...
...
@@ -14,6 +14,7 @@
use
Drupal\Core\Config\FileStorage
;
use
Drupal\Core\Config\ConfigException
;
use
Drupal\Core\DrupalKernel
;
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
use
Drupal\Core\Utility\Error
;
use
Drupal\Component\Uuid\Uuid
;
use
Drupal\Component\Utility\NestedArray
;
...
...
@@ -148,19 +149,13 @@ function update_check_requirements($skip_warnings = FALSE) {
// them if the caller has indicated they should be skipped.
if
(
$severity
==
REQUIREMENT_ERROR
||
(
$severity
==
REQUIREMENT_WARNING
&&
!
$skip_warnings
))
{
update_task_list
(
'requirements'
);
$status
=
array
(
$status
_report
=
array
(
'#theme'
=>
'status_report'
,
'#requirements'
=>
$requirements
,
);
$status_report
=
drupal_render
(
$status
);
$status_report
.
=
'Check the messages and <a href="'
.
check_url
(
drupal_requirements_url
(
$severity
))
.
'">try again</a>.'
;
$status_report
[
'#suffix'
]
=
'Check the messages and <a href="'
.
check_url
(
drupal_requirements_url
(
$severity
))
.
'">try again</a>.'
;
drupal_add_http_header
(
'Content-Type'
,
'text/html; charset=utf-8'
);
$maintenance_page
=
array
(
'#theme'
=>
'maintenance_page'
,
'#title'
=>
'Requirements problem'
,
'#content'
=>
$status_report
,
);
print
drupal_render
(
$maintenance_page
);
print
DefaultHtmlPageRenderer
::
renderPage
(
$status_report
,
'Requirements problem'
);
exit
();
}
}
...
...
core/lib/Drupal/Core/Controller/ExceptionController.php
View file @
10b03890
...
...
@@ -7,6 +7,7 @@
namespace
Drupal\Core\Controller
;
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
use
Drupal\Core\Page\HtmlPageRendererInterface
;
use
Drupal\Core\StringTranslation\TranslationInterface
;
use
Symfony\Component\DependencyInjection\ContainerAwareInterface
;
...
...
@@ -353,15 +354,8 @@ public function on500Html(FlattenException $exception, Request $request) {
drupal_set_message
(
$message
,
$class
,
TRUE
);
}
$page_content
=
array
(
'#theme'
=>
'maintenance_page'
,
'#content'
=>
t
(
'The website has encountered an error. Please try again later.'
),
'#page'
=>
array
(
'#title'
=>
t
(
'Error'
),
),
);
$output
=
drupal_render
(
$page_content
);
$content
=
t
(
'The website has encountered an error. Please try again later.'
);
$output
=
DefaultHtmlPageRenderer
::
renderPage
(
$content
,
t
(
'Error'
));
$response
=
new
Response
(
$output
);
$response
->
setStatusCode
(
500
,
'500 Service unavailable (with message)'
);
...
...
core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
View file @
10b03890
...
...
@@ -7,6 +7,8 @@
namespace
Drupal\Core\EventSubscriber
;
use
Drupal\Component\Utility\String
;
use
Drupal\Core\Page\DefaultHtmlPageRenderer
;
use
Symfony\Component\HttpFoundation\RedirectResponse
;
use
Symfony\Component\HttpFoundation\Response
;
use
Symfony\Component\HttpKernel\KernelEvents
;
...
...
@@ -44,14 +46,10 @@ public function onKernelRequestMaintenance(GetResponseEvent $event) {
if
(
$request
->
attributes
->
get
(
'_maintenance'
)
!=
MENU_SITE_ONLINE
&&
!
(
$response
instanceof
RedirectResponse
))
{
// Deliver the 503 page.
drupal_maintenance_theme
();
$maintenance_page
=
array
(
'#theme'
=>
'maintenance_page'
,
'#title'
=>
t
(
'Site under maintenance'
),
'#content'
=>
filter_xss_admin
(
t
(
\
Drupal
::
config
(
'system.maintenance'
)
->
get
(
'message'
),
array
(
'@site'
=>
\
Drupal
::
config
(
'system.site'
)
->
get
(
'name'
)))
),
);
$content
=
drupal_render
(
$maintenance_page
);
$content
=
filter_xss_admin
(
String
::
format
(
\
Drupal
::
config
(
'system.maintenance'
)
->
get
(
'message'
),
array
(
'@site'
=>
\
Drupal
::
config
(
'system.site'
)
->
get
(
'name'
),
)));
$content
=
DefaultHtmlPageRenderer
::
renderPage
(
$content
,
t
(
'Site under maintenance'
));
$response
=
new
Response
(
'Service unavailable'
,
503
);
$response
->
setContent
(
$content
);
$event
->
setResponse
(
$response
);
...
...
core/lib/Drupal/Core/Page/DefaultHtmlPageRenderer.php
View file @
10b03890
...
...
@@ -23,4 +23,87 @@ public function render(HtmlPage $page) {
return
drupal_render
(
$render
);
}
/**
* Renders a page using a custom page theme hook and optional region content.
*
* Temporary shim to facilitate modernization progress for special front
* contollers (install.php, update.php, authorize.php), maintenance mode, and
* the exception handler.
*
* Do NOT use this method in your code. This method will be removed as soon
* as architecturally possible.
*
* This is functionally very similar to DefaultHtmlFragmentRenderer::render()
* but with the following important differences:
*
* - drupal_prepare_page() and hook_page_build() cannot be invoked on the
* maintenance and install pages, since possibly enabled page layout/block
* modules would replace the main page content with configured region
* content.
* - This function composes a complete page render array including a page
* template theme suggestion (as opposed to the main page content only).
* - The render cache and cache tags is skipped.
*
* @param array|string $main
* A render array or string containing the main page content.
* @param string $title
* (optional) The page title.
* @param string $theme
* (optional) The theme hook to use for rendering the page. Defaults to
* 'maintenance'. The given value will be appended with '_page' to compose
* the #theme property for #type 'page' currently; e.g., 'maintenance'
* becomes 'maintenance_page'. Ultimately this parameter will be converted
* into a page template theme suggestion; i.e., 'page__$theme'.
* @param array $regions
* (optional) Additional region content to add to the page. The given array
* is added to the page render array, so this parameter may also be used to
* pass e.g. the #show_messages property for #type 'page'.
*
* @return string
* The rendered HTML page.
*
* @internal
*/
public
static
function
renderPage
(
$main
,
$title
=
''
,
$theme
=
'maintenance'
,
array
$regions
=
array
())
{
// Automatically convert the main page content into a render array.
if
(
!
is_array
(
$main
))
{
$main
=
array
(
'#markup'
=>
$main
);
}
$page
=
new
HtmlPage
(
''
,
array
(),
$title
);
$page_array
=
array
(
'#type'
=>
'page'
,
// @todo Change into theme suggestions "page__$theme".
'#theme'
=>
$theme
.
'_page'
,
'#title'
=>
$title
,
'content'
=>
array
(
'system_main'
=>
$main
,
),
);
// Append region content.
$page_array
+=
$regions
;
// Add default properties.
$page_array
+=
element_info
(
'page'
);
// hook_page_build() cannot be invoked on the maintenance and install pages,
// because the application is in an unknown or special state.
// In particular on the install page, invoking hook_page_build() directly
// after e.g. Block module has been installed would *replace* the installer
// output with the configured blocks of the installer theme (loaded from
// default configuration of the installation profile).
// Allow modules and themes to alter the page render array.
// This allows e.g. themes to attach custom libraries.
\
Drupal
::
moduleHandler
()
->
alter
(
'page'
,
$page_array
);
// @todo Move preparePage() before alter() above, so $page_array['#page'] is
// available in hook_page_alter(), so that HTML attributes can be altered.
$page
=
\
Drupal
::
service
(
'html_fragment_renderer'
)
->
preparePage
(
$page
,
$page_array
);
$page
->
setBodyTop
(
drupal_render
(
$page_array
[
'page_top'
]));
$page
->
setBodyBottom
(
drupal_render
(
$page_array
[
'page_bottom'
]));
$page
->
setContent
(
drupal_render
(
$page_array
));
return
\
Drupal
::
service
(
'html_page_renderer'
)
->
render
(
$page
);
}
}
core/modules/system/lib/Drupal/system/Tests/Common/RenderElementTypesTest.php
View file @
10b03890
...
...
@@ -8,10 +8,6 @@
namespace
Drupal\system\Tests\Common
;
use
Drupal\Component\Utility\String
;
use
Drupal\Component\Utility\UrlHelper
;
use
Drupal\Component\Utility\Xss
;
use
Drupal\Core\Language\Language
;
use
Drupal\Core\Template\Attribute
;
use
Drupal\simpletest\DrupalUnitTestBase
;
/**
...
...
@@ -44,216 +40,72 @@ protected function setUp() {
* Asserts that an array of elements is rendered properly.
*
* @param array $elements
* An array of associative arrays describing render elements and their
* expected markup. Each item in $elements must contain the following:
* - 'name': This human readable description will be displayed on the test
* results page.
* - 'value': This is the render element to test.
* - 'expected': This is the expected markup for the element in 'value'.
* The render element array to test.
* @param string $expected_html
* The expected markup.
* @param string $message
* Assertion message.
*/
function
assertElements
(
$elements
)
{
foreach
(
$elements
as
$element
)
{
// More complicated "expected" strings may contain placeholders.
if
(
!
empty
(
$element
[
'placeholders'
]))
{
$element
[
'expected'
]
=
String
::
format
(
$element
[
'expected'
],
$element
[
'placeholders'
]);
}
protected
function
assertElements
(
array
$elements
,
$expected_html
,
$message
)
{
$actual_html
=
drupal_render
(
$elements
);
// We don't care about whitespace for the sake of comparing markup.
$value
=
new
\
DOMDocument
();
$value
->
preserveWhiteSpace
=
FALSE
;
$value
->
loadXML
(
drupal_render
(
$element
[
'value'
]));
$out
=
'<table><tr>'
;
$out
.
=
'<td valign="top"><pre>'
.
String
::
checkPlain
(
$expected_html
)
.
'</pre></td>'
;
$out
.
=
'<td valign="top"><pre>'
.
String
::
checkPlain
(
$actual_html
)
.
'</pre></td>'
;
$out
.
=
'</tr></table>'
;
$this
->
verbose
(
$out
);
$expected
=
new
\
DOMDocument
();
$expected
->
preserveWhiteSpace
=
FALSE
;
$expected
->
loadXML
(
$element
[
'expected'
]);
$message
=
isset
(
$element
[
'name'
])
?
'"'
.
$element
[
'name'
]
.
'" input rendered correctly by drupal_render().'
:
NULL
;
$this
->
assertIdentical
(
$value
->
saveXML