summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Pott2013-06-24 11:08:43 +0100
committerAlex Pott2013-06-24 11:08:43 +0100
commitaca60072f283a94bbbd71426df6c31237b2878f1 (patch)
treee14e1f335a8afb3daf618fe5f90b1c3302be4138
parent9873c74069e673d92555602c7c2ec42bf2846e6b (diff)
Revert "Issue #2012812 by thedavidmeister, pwieck: drupal_render() can't distinguish between empty strings from theme() from an implemented hook and no hook being matched."8.0-alpha2
This reverts commit 431dc2e3f1371611fc243ef30df26802806670fc.
-rw-r--r--core/includes/common.inc35
-rw-r--r--core/includes/theme.inc10
-rw-r--r--core/modules/system/lib/Drupal/system/Tests/Common/RenderTest.php53
-rw-r--r--core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php2
-rw-r--r--core/modules/system/tests/modules/common_test/common_test.module17
5 files changed, 18 insertions, 99 deletions
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 8a8ea0e..711d8d3 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -4683,32 +4683,25 @@ function drupal_render(&$elements) {
// element have to be rendered there. If the internal #render_children
// property is set, do not call the #theme function to prevent infinite
// recursion.
- $theme_is_implemented = FALSE;
if (isset($elements['#theme']) && !isset($elements['#render_children'])) {
$elements['#children'] = theme($elements['#theme'], $elements);
- // If theme() returns FALSE this means that the hook in #theme was not found
- // in the registry. This is common for theme suggestions.
- $theme_is_implemented = ($elements['#children'] !== FALSE);
- }
- // #theme is either not set or does not exist in the registry.
- if (!$theme_is_implemented) {
- // If #theme is not implemented and the element has children, render them
- // now. This is the same process as drupal_render_children() but is inlined
- // for speed.
+ }
+ // If #theme was not set and the element has children, render them now.
+ // This is the same process as drupal_render_children() but is inlined
+ // for speed.
+ if ($elements['#children'] === '') {
foreach ($children as $key) {
$elements['#children'] .= drupal_render($elements[$key]);
}
-
- // If #theme is not implemented and the element has raw #markup as a
- // fallback, prepend the content in #markup to #children. In this case
- // #children will contain whatever is provided by #pre_render prepended to
- // what is rendered recursively above. If #theme is implemented then it is
- // the responsibility of that theme implementation to render #markup if
- // required. Eventually #theme_wrappers will expect both #markup and
- // #children to be a single string as #children.
- if (isset($elements['#markup'])) {
- $elements['#children'] = $elements['#markup'] . $elements['#children'];
- }
+ }
+ // If #theme was not set, but the element has raw #markup, prepend the content
+ // in #markup to #children. #children may contain the rendered content
+ // supplied by #theme, or the rendered child elements, as processed above. If
+ // both #theme and #markup are set, then #theme is responsible for rendering
+ // the element. Eventually assigned #theme_wrappers will expect both the
+ // element's #markup and the rendered content of child elements in #children.
+ if (!isset($elements['#theme']) && isset($elements['#markup'])) {
+ $elements['#children'] = $elements['#markup'] . $elements['#children'];
}
// Add any JavaScript state information associated with the element.
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index df03ad6..45737c5 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -932,9 +932,8 @@ function drupal_find_base_themes($themes, $key, $used_keys = array()) {
* properties are mapped to variables expected by the theme hook
* implementations.
*
- * @return string|false
- * An HTML string representing the themed output or FALSE if the passed $hook
- * is not implemented.
+ * @return
+ * An HTML string representing the themed output.
*
* @see themeable
* @see hook_theme()
@@ -983,10 +982,7 @@ function theme($hook, $variables = array()) {
if (!isset($candidate)) {
watchdog('theme', 'Theme hook %hook not found.', array('%hook' => $hook), WATCHDOG_WARNING);
}
- // There is no theme implementation for the hook passed. Return FALSE so
- // the function calling theme() can differentiate between a hook that
- // exists and renders an empty string and a hook that is not implemented.
- return FALSE;
+ return '';
}
}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/RenderTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/RenderTest.php
index fac11fa..31e4f34 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/RenderTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/RenderTest.php
@@ -84,59 +84,6 @@ class RenderTest extends WebTestBase {
}
/**
- * Tests fallback rendering behaviour when #theme is not implemented.
- *
- * If #theme is set and is an implemented theme hook then theme() is 100%
- * responsible for rendering the array including children and #markup.
- *
- * If #theme is not set or is not found in the registry then drupal_render()
- * should recursively render child attributes of the array and #markup.
- *
- * This dual rendering behaviour is only relevant to the internal processing
- * of drupal_render() before #theme_wrappers are called, so not #prefix and
- * #suffix for example.
- */
- function testDrupalRenderFallbackRender() {
- // Theme suggestion is not implemented, #markup should be rendered.
- $theme_suggestion_not_implemented_has_markup = array(
- '#theme' => array('suggestionnotimplemented'),
- '#markup' => 'foo',
- );
- $rendered = drupal_render($theme_suggestion_not_implemented_has_markup);
- $this->assertIdentical($rendered, 'foo');
-
- // Theme suggestion is not implemented, children should be rendered.
- $theme_suggestion_not_implemented_has_children = array(
- '#theme' => array('suggestionnotimplemented'),
- 'child' => array(
- '#markup' => 'foo',
- ),
- );
- $rendered = drupal_render($theme_suggestion_not_implemented_has_children);
- $this->assertIdentical($rendered, 'foo');
-
- // Theme suggestion is implemented but returns empty string, #markup should
- // not be rendered.
- $theme_implemented_is_empty_has_markup = array(
- '#theme' => array('common_test_empty'),
- '#markup' => 'foo',
- );
- $rendered = drupal_render($theme_implemented_is_empty_has_markup);
- $this->assertIdentical($rendered, '');
-
- // Theme suggestion is implemented but returns empty string, children should
- // not be rendered.
- $theme_implemented_is_empty_has_children = array(
- '#theme' => array('common_test_empty'),
- 'child' => array(
- '#markup' => 'foo',
- ),
- );
- $rendered = drupal_render($theme_implemented_is_empty_has_children);
- $this->assertIdentical($rendered, '');
- }
-
- /**
* Tests sorting by weight.
*/
function testDrupalRenderSorting() {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
index 072bfb0..32f9321 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
@@ -204,7 +204,7 @@ class ThemeTest extends WebTestBase {
// throws an exception.
$this->rebuildContainer();
$this->container->get('module_handler')->loadAll();
- $this->assertIdentical(theme('theme_test_foo', array('foo' => 'b')), FALSE, 'The theme registry does not contain theme_test_foo, because the module is disabled.');
+ $this->assertIdentical(theme('theme_test_foo', array('foo' => 'b')), '', 'The theme registry does not contain theme_test_foo, because the module is disabled.');
module_enable(array('theme_test'), FALSE);
// After enabling/disabling a module during a test, we need to rebuild the
diff --git a/core/modules/system/tests/modules/common_test/common_test.module b/core/modules/system/tests/modules/common_test/common_test.module
index 175cd5a..83d19e0 100644
--- a/core/modules/system/tests/modules/common_test/common_test.module
+++ b/core/modules/system/tests/modules/common_test/common_test.module
@@ -164,27 +164,10 @@ function common_test_theme() {
'variables' => array('foo' => 'foo', 'bar' => 'bar'),
'template' => 'common-test-foo',
),
- 'common_test_empty' => array(
- 'variables' => array('foo' => 'foo'),
- ),
);
}
/**
- * Provides a theme function for drupal_render().
- */
-function theme_common_test_foo($variables) {
- return $variables['foo'] . $variables['bar'];
-}
-
-/**
- * Always returns an empty string.
- */
-function theme_common_test_empty($variables) {
- return '';
-}
-
-/**
* Implements hook_library_info_alter().
*/
function common_test_library_info_alter(&$libraries, $module) {