Commit 064c8178 authored by catch's avatar catch

Issue #1975462 by thedavidmeister, alexpott, chx, joelpittet: Fixed Allow and...

Issue #1975462 by thedavidmeister, alexpott, chx, joelpittet: Fixed Allow and test for NULL and integer 0 values in Twig templates.
parent f576a16f
......@@ -41,8 +41,9 @@ abstract class TwigTemplate extends \Twig_Template {
*/
final protected function getContextReference(&$context, $item)
{
// Optimized version
if (!isset($context[$item])) {
// Optimized version. NULL is a valid value for $context[$item], we only
// want to error if it hasn't been defined at all.
if (!isset($context[$item]) && !array_key_exists($item, $context)) {
// We don't want to throw an exception, but issue a warning instead.
// This is the easiest way to do so.
// @todo Decide based on prod vs. dev setting
......
......@@ -2,7 +2,7 @@
/**
* @file
* Definition of Drupal\system\Tests\Theme\ThemeTest.
* Contains \Drupal\system\Tests\Theme\ThemeTestTwig.
*/
namespace Drupal\system\Tests\Theme;
......@@ -10,7 +10,7 @@
use Drupal\simpletest\WebTestBase;
/**
* Tests low-level theme functions.
* Tests theme functions with the Twig engine.
*/
class ThemeTestTwig extends WebTestBase {
......@@ -19,7 +19,7 @@ class ThemeTestTwig extends WebTestBase {
*
* @var array
*/
public static $modules = array('theme_test');
public static $modules = array('theme_test', 'twig_theme_test');
public static function getInfo() {
return array(
......@@ -69,4 +69,18 @@ function testFindThemeTemplates() {
$templates = drupal_find_theme_templates($cache, '.html.twig', drupal_get_path('theme', 'test_theme_twig'));
$this->assertEqual($templates['node__1']['template'], 'node--1', 'Template node--1.html.twig was found in test_theme_twig.');
}
/**
* Tests that the Twig engine handles PHP data correctly.
*/
function testTwigVariableDataTypes() {
config('system.theme')
->set('default', 'test_theme_twig')
->save();
$this->drupalGet('twig-theme-test/php-variables');
foreach (_test_theme_twig_php_values() as $type => $value) {
$this->assertRaw('<li>' . $type . ': ' . $value['expected'] . '</li>');
}
}
}
<?php
/**
* @file
* Contains \Drupal\twig_theme_test\TwigThemeTestController.
*/
namespace Drupal\twig_theme_test;
use Drupal\Core\ControllerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Controller routines for Twig theme test routes.
*/
class TwigThemeTestController implements ControllerInterface {
/**
* Creates the controller.
*/
public static function create(ContainerInterface $container) {
return new static();
}
/**
* Menu callback for testing PHP variables in a Twig template.
*/
public function phpVariablesRender() {
return theme('twig_theme_test_php_variables');
}
}
{# Output for Twig Theme PHP variables test. #}
<ul>
{% for key, php_value in php_values %}
<li>{{ key }}: {{ php_value.value }}</li>
{% endfor %}
</ul>
name: 'Twig theme test'
description: 'Support module for Twig theme system testing.'
package: Testing
version: VERSION
core: 8.x
hidden: true
<?php
/**
* Implements hook_theme().
*/
function twig_theme_test_theme($existing, $type, $theme, $path) {
$items['twig_theme_test_php_variables'] = array(
'template' => 'twig_theme_test.php_variables',
);
return $items;
}
/*
* Helper function to test PHP variables in the Twig engine.
*/
function _test_theme_twig_php_values() {
// Prefix each variable with "twig_" so that Twig doesn't get confused
// between a variable and a primitive. Arrays are not tested since they should
// be a Drupal render array.
return array(
'twig_null' => array(
'value' => NULL,
'expected' => '',
),
'twig_bool_false' => array(
'value' => FALSE,
'expected' => '',
),
'twig_bool_true' => array(
'value' => TRUE,
'expected' => '1',
),
'twig_int' => array(
'value' => 1,
'expected' => '1',
),
'twig_int_0' => array(
'value' => 0,
'expected' => '0',
),
'twig_float' => array(
'value' => 122.34343,
'expected' => '122.34343',
),
'twig_string' => array(
'value' => 'Hello world!',
'expected' => 'Hello world!',
),
);
}
twig_theme_test_php_variables:
pattern: '/twig-theme-test/php-variables'
defaults:
_content: '\Drupal\twig_theme_test\TwigThemeTestController::phpVariablesRender'
requirements:
_permission: 'access content'
<?php
/**
* @file
* Theme to help test the Twig engine.
*/
/**
* Implements THEME_preprocess_twig_theme_test_php_variables().
*/
function test_theme_twig_preprocess_twig_theme_test_php_variables(&$variables) {
$variables['php_values'] = _test_theme_twig_php_values();
}
......@@ -98,6 +98,11 @@ function twig_render_var($arg) {
$arg = &$arg->getReference();
}
// Check for numeric zero.
if ($arg === 0) {
return 0;
}
// == is true also for empty arrays
if ($arg == NULL) {
return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment