Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
project
drupal
Commits
118a4a02
Commit
118a4a02
authored
Feb 04, 2014
by
catch
Browse files
Issue
#2166195
by dawehner, Crell: Split HtmlPageRenderer in twain.
parent
4b4ef377
Changes
9
Hide whitespace changes
Inline
Side-by-side
core/core.services.yml
View file @
118a4a02
...
...
@@ -435,10 +435,12 @@ services:
class
:
Drupal\Core\EventSubscriber\HtmlViewSubscriber
tags
:
-
{
name
:
event_subscriber
}
arguments
:
[
'
@html_page_renderer'
]
arguments
:
[
'
@html_fragment_renderer'
,
'
@html_page_renderer'
]
html_fragment_renderer
:
class
:
Drupal\Core\Page\DefaultHtmlFragmentRenderer
arguments
:
[
'
@language_manager'
]
html_page_renderer
:
class
:
Drupal\Core\Page\DefaultHtmlPageRenderer
arguments
:
[
'
@language_manager'
]
private_key
:
class
:
Drupal\Core\PrivateKey
arguments
:
[
'
@state'
]
...
...
@@ -533,7 +535,7 @@ services:
arguments
:
[
'
@config.storage'
,
'
@config.storage.snapshot'
]
exception_controller
:
class
:
Drupal\Core\Controller\ExceptionController
arguments
:
[
'
@content_negotiation'
,
'
@string_translation'
,
'
@title_resolver'
,
'
@html_page_renderer'
]
arguments
:
[
'
@content_negotiation'
,
'
@string_translation'
,
'
@title_resolver'
,
'
@html_page_renderer'
,
'
@html_fragment_renderer'
]
calls
:
-
[
setContainer
,
[
'
@service_container'
]]
exception_listener
:
...
...
core/lib/Drupal/Core/Controller/ExceptionController.php
View file @
118a4a02
...
...
@@ -44,7 +44,14 @@ class ExceptionController extends HtmlControllerBase implements ContainerAwareIn
*
* @var \Drupal\Core\Page\HtmlPageRendererInterface
*/
protected
$renderer
;
protected
$htmlPageRenderer
;
/**
* The fragment rendering service.
*
* @var \Drupal\Core\Page\HtmlFragmentRendererInterface
*/
protected
$fragmentRenderer
;
/**
* Constructor.
...
...
@@ -58,11 +65,14 @@ class ExceptionController extends HtmlControllerBase implements ContainerAwareIn
* The title resolver.
* @param \Drupal\Core\Page\HtmlPageRendererInterface $renderer
* The page renderer.
* @param \Drupal\Core\Page\HtmlFragmentRendererInterface $fragment_renderer
* The fragment rendering service.
*/
public
function
__construct
(
ContentNegotiation
$negotiation
,
TranslationInterface
$translation_manager
,
TitleResolverInterface
$title_resolver
,
HtmlPageRendererInterface
$renderer
)
{
public
function
__construct
(
ContentNegotiation
$negotiation
,
TranslationInterface
$translation_manager
,
TitleResolverInterface
$title_resolver
,
HtmlPageRendererInterface
$renderer
,
$fragment_renderer
)
{
parent
::
__construct
(
$translation_manager
,
$title_resolver
);
$this
->
negotiation
=
$negotiation
;
$this
->
renderer
=
$renderer
;
$this
->
htmlPageRenderer
=
$renderer
;
$this
->
fragmentRenderer
=
$fragment_renderer
;
}
/**
...
...
@@ -164,8 +174,8 @@ public function on403Html(FlattenException $exception, Request $request) {
);
$fragment
=
$this
->
createHtmlFragment
(
$page_content
,
$request
);
$page
=
$this
->
r
enderer
->
render
(
$fragment
,
403
);
$response
=
new
Response
(
$this
->
r
enderer
->
render
Page
(
$page
),
$page
->
getStatusCode
());
$page
=
$this
->
fragmentR
enderer
->
render
(
$fragment
,
403
);
$response
=
new
Response
(
$this
->
htmlPageR
enderer
->
render
(
$page
),
$page
->
getStatusCode
());
return
$response
;
}
...
...
@@ -241,8 +251,8 @@ public function on404Html(FlattenException $exception, Request $request) {
);
$fragment
=
$this
->
createHtmlFragment
(
$page_content
,
$request
);
$page
=
$this
->
r
enderer
->
render
(
$fragment
,
404
);
$response
=
new
Response
(
$this
->
r
enderer
->
render
Page
(
$page
),
$page
->
getStatusCode
());
$page
=
$this
->
fragmentR
enderer
->
render
(
$fragment
,
404
);
$response
=
new
Response
(
$this
->
htmlPageR
enderer
->
render
(
$page
),
$page
->
getStatusCode
());
return
$response
;
}
...
...
core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
View file @
118a4a02
...
...
@@ -9,6 +9,7 @@
use
Drupal\Core\Page\HtmlFragment
;
use
Drupal\Core\Page\HtmlPage
;
use
Drupal\Core\Page\HtmlFragmentRendererInterface
;
use
Drupal\Core\Page\HtmlPageRendererInterface
;
use
Symfony\Component\EventDispatcher\EventSubscriberInterface
;
use
Symfony\Component\HttpFoundation\Response
;
...
...
@@ -20,21 +21,31 @@
*/
class
HtmlViewSubscriber
implements
EventSubscriberInterface
{
/**
* The fragment rendering service.
*
* @var \Drupal\Core\Page\HtmlFragmentRendererInterface
*/
protected
$fragmentRenderer
;
/**
* The page rendering service.
*
* @var \Drupal\Core\Page\HtmlPageRendererInterface
*/
protected
$
r
enderer
;
protected
$
pageR
enderer
;
/**
* Constructs a new HtmlViewSubscriber.
*
* @param \Drupal\Core\Page\HtmlPageRendererInterface $renderer
* @param \Drupal\Core\Page\HtmlFragmentRendererInterface $fragment_renderer
* The fragment rendering service.
* @param \Drupal\Core\Page\HtmlPageRendererInterface $page_renderer
* The page rendering service.
*/
public
function
__construct
(
HtmlPageRendererInterface
$renderer
)
{
$this
->
renderer
=
$renderer
;
public
function
__construct
(
HtmlFragmentRendererInterface
$fragment_renderer
,
HtmlPageRendererInterface
$page_renderer
)
{
$this
->
fragmentRenderer
=
$fragment_renderer
;
$this
->
pageRenderer
=
$page_renderer
;
}
/**
...
...
@@ -46,7 +57,7 @@ public function __construct(HtmlPageRendererInterface $renderer) {
public
function
onHtmlFragment
(
GetResponseForControllerResultEvent
$event
)
{
$fragment
=
$event
->
getControllerResult
();
if
(
$fragment
instanceof
HtmlFragment
&&
!
$fragment
instanceof
HtmlPage
)
{
$page
=
$this
->
r
enderer
->
render
(
$fragment
);
$page
=
$this
->
fragmentR
enderer
->
render
(
$fragment
);
$event
->
setControllerResult
(
$page
);
}
}
...
...
@@ -64,7 +75,7 @@ public function onHtmlPage(GetResponseForControllerResultEvent $event) {
// so as to not cause issues with Response. This also allows renderPage
// to return an object implementing __toString(), but that is not
// recommended.
$response
=
new
Response
((
string
)
$this
->
r
enderer
->
render
Page
(
$page
),
$page
->
getStatusCode
());
$response
=
new
Response
((
string
)
$this
->
pageR
enderer
->
render
(
$page
),
$page
->
getStatusCode
());
if
(
$tags
=
$page
->
getCacheTags
())
{
$response
->
headers
->
set
(
'cache_tags'
,
serialize
(
$tags
));
}
...
...
core/lib/Drupal/Core/Page/DefaultHtmlFragmentRenderer.php
0 → 100644
View file @
118a4a02
<?php
/**
* @file
* Contains \Drupal\Core\Page\DefaultHtmlFragmentRenderer
*/
namespace
Drupal\Core\Page
;
use
Drupal\Core\Language\Language
;
use
Drupal\Core\Language\LanguageManager
;
/**
* Default page rendering engine.
*/
class
DefaultHtmlFragmentRenderer
implements
HtmlFragmentRendererInterface
{
/**
* The language manager.
*
* @var \Drupal\Core\Language\LanguageManager
*/
protected
$languageManager
;
/**
* Constructs a new DefaultHtmlPageRenderer.
*
* @param \Drupal\Core\Language\LanguageManager $language_manager
* The language manager service.
*/
public
function
__construct
(
LanguageManager
$language_manager
)
{
$this
->
languageManager
=
$language_manager
;
}
/**
* {@inheritdoc}
*/
public
function
render
(
HtmlFragment
$fragment
,
$status_code
=
200
)
{
// Converts the given HTML fragment which represents the main content region
// of the page into a render array.
$page_content
[
'main'
]
=
array
(
'#markup'
=>
$fragment
->
getContent
(),
'#cache'
=>
array
(
'tags'
=>
$fragment
->
getCacheTags
()),
);
$page_content
[
'#title'
]
=
$fragment
->
getTitle
();
// Build the full page array by calling drupal_prepare_page(), which invokes
// hook_page_build(). This adds the other regions to the page.
$page_array
=
drupal_prepare_page
(
$page_content
);
// Collect cache tags for all the content in all the regions on the page.
$tags
=
drupal_render_collect_cache_tags
(
$page_array
);
// Build the HtmlPage object.
$page
=
new
HtmlPage
(
''
,
array
(
'tags'
=>
$tags
),
$fragment
->
getTitle
());
$page
=
$this
->
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
));
$page
->
setStatusCode
(
$status_code
);
return
$page
;
}
/**
* Enhances a page object based on a render array.
*
* @param \Drupal\Core\Page\HtmlPage $page
* The page object to enhance.
* @param array $page_array
* The page array to extract onto the page object.
*
* @return \Drupal\Core\Page\HtmlPage
* The modified page object.
*/
public
function
preparePage
(
HtmlPage
$page
,
&
$page_array
)
{
// @todo Remove this one drupal_get_title() has been eliminated.
if
(
!
$page
->
hasTitle
())
{
$title
=
drupal_get_title
();
// drupal_set_title() already ensured security, so not letting the
// title pass through would cause double escaping.
$page
->
setTitle
(
$title
,
PASS_THROUGH
);
}
$page_array
[
'#page'
]
=
$page
;
// HTML element attributes.
$language_interface
=
$this
->
languageManager
->
getCurrentLanguage
();
$html_attributes
=
$page
->
getHtmlAttributes
();
$html_attributes
[
'lang'
]
=
$language_interface
->
id
;
$html_attributes
[
'dir'
]
=
$language_interface
->
direction
?
'rtl'
:
'ltr'
;
return
$page
;
}
}
core/lib/Drupal/Core/Page/DefaultHtmlPageRenderer.php
View file @
118a4a02
...
...
@@ -7,65 +7,15 @@
namespace
Drupal\Core\Page
;
use
Drupal\Core\Language\Language
;
use
Drupal\Core\Language\LanguageManager
;
/**
* Default page rendering engine.
*/
class
DefaultHtmlPageRenderer
implements
HtmlPageRendererInterface
{
/**
* The language manager.
*
* @var \Drupal\Core\Language\LanguageManager
*/
protected
$languageManager
;
/**
* Constructs a new DefaultHtmlPageRenderer.
*
* @param \Drupal\Core\Language\LanguageManager $language_manager
* The language manager service.
*/
public
function
__construct
(
LanguageManager
$language_manager
)
{
$this
->
languageManager
=
$language_manager
;
}
/**
* {@inheritdoc}
*/
public
function
render
(
HtmlFragment
$fragment
,
$status_code
=
200
)
{
// Converts the given HTML fragment which represents the main content region
// of the page into a render array.
$page_content
[
'main'
]
=
array
(
'#markup'
=>
$fragment
->
getContent
(),
'#cache'
=>
array
(
'tags'
=>
$fragment
->
getCacheTags
()),
);
$page_content
[
'#title'
]
=
$fragment
->
getTitle
();
// Build the full page array by calling drupal_prepare_page(), which invokes
// hook_page_build(). This adds the other regions to the page.
$page_array
=
drupal_prepare_page
(
$page_content
);
// Collect cache tags for all the content in all the regions on the page.
$tags
=
drupal_render_collect_cache_tags
(
$page_array
);
// Build the HtmlPage object.
$page
=
new
HtmlPage
(
''
,
array
(
'tags'
=>
$tags
),
$fragment
->
getTitle
());
$page
=
$this
->
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
));
$page
->
setStatusCode
(
$status_code
);
return
$page
;
}
/**
* {@inheritdoc}
*/
public
function
renderPage
(
HtmlPage
$page
)
{
public
function
render
(
HtmlPage
$page
)
{
$render
=
array
(
'#theme'
=>
'html'
,
'#page_object'
=>
$page
,
...
...
@@ -73,35 +23,4 @@ public function renderPage(HtmlPage $page) {
return
drupal_render
(
$render
);
}
/**
* Enhances a page object based on a render array.
*
* @param \Drupal\Core\Page\HtmlPage $page
* The page object to enhance.
* @param array $page_array
* The page array to extract onto the page object.
*
* @return \Drupal\Core\Page\HtmlPage
* The modified page object.
*/
public
function
preparePage
(
HtmlPage
$page
,
&
$page_array
)
{
// @todo Remove this one drupal_get_title() has been eliminated.
if
(
!
$page
->
hasTitle
())
{
$title
=
drupal_get_title
();
// drupal_set_title() already ensured security, so not letting the
// title pass through would cause double escaping.
$page
->
setTitle
(
$title
,
PASS_THROUGH
);
}
$page_array
[
'#page'
]
=
$page
;
// HTML element attributes.
$language_interface
=
$this
->
languageManager
->
getCurrentLanguage
();
$html_attributes
=
$page
->
getHtmlAttributes
();
$html_attributes
[
'lang'
]
=
$language_interface
->
id
;
$html_attributes
[
'dir'
]
=
$language_interface
->
direction
?
'rtl'
:
'ltr'
;
return
$page
;
}
}
core/lib/Drupal/Core/Page/HtmlFragmentRendererInterface.php
0 → 100644
View file @
118a4a02
<?php
/**
* @file
* Contains \Drupal\Core\Page\HtmlFragmentRendererInterface
*/
namespace
Drupal\Core\Page
;
/**
* Interface for HTML Fragment Renderers.
*
* An HTML Fragment Renderer is responsible for translating an HtmlFragment
* object into an HtmlPage object.
*/
interface
HtmlFragmentRendererInterface
{
/**
* Renders an HtmlFragment into an HtmlPage.
*
* An HtmlFragment represents only a portion of an HTML page, along with
* some attached information (assets, metatags, etc.) An HtmlPage represents
* an entire page. This method will create an HtmlPage containing the
* metadata from the fragment and using the body of the fragment as the main
* content region of the page.
*
* @param \Drupal\Core\Page\HtmlFragment $fragment
* The HTML fragment object to convert up to a page.
* @param int $status_code
* (optional) The status code of the page. May be any legal HTTP response
* code. Default is 200 OK.
*
* @return \Drupal\Core\Page\HtmlPage
* An HtmlPage object derived from the provided fragment.
*/
public
function
render
(
HtmlFragment
$fragment
,
$status_code
=
200
);
}
core/lib/Drupal/Core/Page/HtmlPageRendererInterface.php
View file @
118a4a02
...
...
@@ -10,31 +10,11 @@
/**
* Interface for HTML Page Renderers.
*
* An HTML Page Renderer is responsible for translating an Html
Fragment
object
* into
an HtmlPage object, and from a page object into
a string.
* An HTML Page Renderer is responsible for translating an Html
Page
object
* into a string.
*/
interface
HtmlPageRendererInterface
{
/**
* Renders an HtmlFragment into an HtmlPage.
*
* An HtmlFragment represents only a portion of an HTML page, along with
* some attached information (assets, metatags, etc.) An HtmlPage represents
* an entire page. This method will create an HtmlPage containing the
* metadata from the fragment and using the body of the fragment as the main
* content region of the page.
*
* @param \Drupal\Core\Page\HtmlFragment $fragment
* The HTML fragment object to convert up to a page.
* @param int $status_code
* (optional) The status code of the page. May be any legal HTTP response
* code. Default is 200 OK.
*
* @return \Drupal\Core\Page\HtmlPage
* An HtmlPage object derived from the provided fragment.
*/
public
function
render
(
HtmlFragment
$fragment
,
$status_code
=
200
);
/**
* Renders an HtmlPage object to an HTML string.
*
...
...
@@ -44,6 +24,6 @@ public function render(HtmlFragment $fragment, $status_code = 200);
* @return string
* A complete HTML page as a string.
*/
public
function
render
Page
(
HtmlPage
$page
);
public
function
render
(
HtmlPage
$page
);
}
core/modules/system/lib/Drupal/system/Controller/BatchController.php
View file @
118a4a02
...
...
@@ -9,7 +9,7 @@
use
Drupal\Core\Controller\TitleResolverInterface
;
use
Drupal\Core\DependencyInjection\ContainerInjectionInterface
;
use
Drupal\Core\Page\DefaultHtml
Page
Renderer
;
use
Drupal\Core\Page\DefaultHtml
Fragment
Renderer
;
use
Drupal\Core\Page\HtmlPage
;
use
Symfony\Cmf\Component\Routing\RouteObjectInterface
;
use
Symfony\Component\DependencyInjection\ContainerInterface
;
...
...
@@ -23,11 +23,11 @@
class
BatchController
implements
ContainerInjectionInterface
{
/**
* The
HTML page renderer
.
* The
fragment rendering service
.
*
* @var \Drupal\Core\Page\DefaultHtml
Page
Renderer
* @var \Drupal\Core\Page\DefaultHtml
Fragment
Renderer
*/
protected
$
htmlPage
Renderer
;
protected
$
fragment
Renderer
;
/**
* The title resolver.
...
...
@@ -39,13 +39,13 @@ class BatchController implements ContainerInjectionInterface {
/**
* Constructs a new BatchController.
*
* @param \Drupal\Core\Page\DefaultHtml
Page
Renderer $html_
page
_renderer
* The
HTML page renderer
.
* @param \Drupal\Core\Page\DefaultHtml
Fragment
Renderer $html_
fragment
_renderer
* The
fragment rendering service
.
* @param \Drupal\Core\Controller\TitleResolverInterface $title_resolver
* The title resolver.
*/
public
function
__construct
(
DefaultHtml
Page
Renderer
$html_
page
_renderer
,
TitleResolverInterface
$title_resolver
)
{
$this
->
htmlPage
Renderer
=
$html_
page
_renderer
;
public
function
__construct
(
DefaultHtml
Fragment
Renderer
$html_
fragment
_renderer
,
TitleResolverInterface
$title_resolver
)
{
$this
->
fragment
Renderer
=
$html_
fragment
_renderer
;
$this
->
titleResolver
=
$title_resolver
;
}
...
...
@@ -54,7 +54,7 @@ public function __construct(DefaultHtmlPageRenderer $html_page_renderer, TitleRe
*/
public
static
function
create
(
ContainerInterface
$container
)
{
return
new
static
(
$container
->
get
(
'html_
page
_renderer'
),
$container
->
get
(
'html_
fragment
_renderer'
),
$container
->
get
(
'title_resolver'
)
);
}
...
...
@@ -106,7 +106,7 @@ public function render(array $output, $status_code = 200) {
$page_array
=
drupal_prepare_page
(
$output
);
$page
=
$this
->
htmlPage
Renderer
->
preparePage
(
$page
,
$page_array
);
$page
=
$this
->
fragment
Renderer
->
preparePage
(
$page
,
$page_array
);
$page
->
setBodyTop
(
drupal_render
(
$page_array
[
'page_top'
]));
$page
->
setBodyBottom
(
drupal_render
(
$page_array
[
'page_bottom'
]));
...
...
core/tests/Drupal/Tests/Core/Controller/ExceptionControllerTest.php
View file @
118a4a02
...
...
@@ -36,7 +36,8 @@ public function test405HTML() {
$exception
=
new
\
Exception
(
'Test exception'
);
$flat_exception
=
FlattenException
::
create
(
$exception
,
405
);
$translation_manager
=
$this
->
getStringTranslationStub
();
$renderer
=
$this
->
getMock
(
'Drupal\Core\Page\HtmlPageRendererInterface'
);
$html_page_renderer
=
$this
->
getMock
(
'Drupal\Core\Page\HtmlPageRendererInterface'
);
$html_fragment_renderer
=
$this
->
getMock
(
'Drupal\Core\Page\HtmlFragmentRendererInterface'
);
$title_resolver
=
$this
->
getMock
(
'Drupal\Core\Controller\TitleResolverInterface'
);
$content_negotiation
=
$this
->
getMock
(
'Drupal\Core\ContentNegotiation'
);
...
...
@@ -44,7 +45,7 @@ public function test405HTML() {
->
method
(
'getContentType'
)
->
will
(
$this
->
returnValue
(
'html'
));
$exception_controller
=
new
ExceptionController
(
$content_negotiation
,
$translation_manager
,
$title_resolver
,
$renderer
);
$exception_controller
=
new
ExceptionController
(
$content_negotiation
,
$translation_manager
,
$title_resolver
,
$
html_page_renderer
,
$html_fragment_
renderer
);
$response
=
$exception_controller
->
execute
(
$flat_exception
,
new
Request
());
$this
->
assertEquals
(
$response
->
getStatusCode
(),
405
,
'HTTP status of response is correct.'
);
$this
->
assertEquals
(
$response
->
getContent
(),
'Method Not Allowed'
,
'HTTP response body is correct.'
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment