com web/bugs: Add variables import to included templates: docs/templates.md src/Template/Context.php tests/Unit/Template/ContextTest.php
tests/fixtures/templates/forms/form_2.php tests/fixture s/templates/pages/including.php
| From: | Peter Kokot | Date: | Thu, 23 May 2019 00:10:03 +0000 |
| Subject: | com web/bugs: Add variables import to included templates: docs/templates.md src/Template/Context.php tests/Unit/Template/ContextTest.php tests/fixtures/templates/forms/form_2.php tests/fixture s/templates/pages/including.php |
||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-28067@lists.php.net to get a copy of this message | ||
Commit: e8bab3538a9d05d0da584c2ff8b18c7d9eea2fdd
Author: Peter Kokot <peterkokot@gmail.com> Thu, 23 May 2019 02:10:03 +0200
Parents: fe351f79ddc962b22235f00e66a13d8b4f4034f5
Branches: master
Link: http://git.php.net/?p=web/bugs.git;a=commitdiff;h=e8bab3538a9d05d0da584c2ff8b18c7d9eea2fdd
Log:
Add variables import to included templates
Changed paths:
M docs/templates.md
M src/Template/Context.php
M tests/Unit/Template/ContextTest.php
A tests/fixtures/templates/forms/form_2.php
M tests/fixtures/templates/pages/including.php
Diff:
diff --git a/docs/templates.md b/docs/templates.md
index cea0976..0623d91 100644
--- a/docs/templates.md
+++ b/docs/templates.md
@@ -73,8 +73,13 @@ To include a partial template snippet file:
<?php $this->include('forms/report_bug.php') ?>
```
-which is equivalent to
<?php include __DIR__.'/../forms/report_bug.php'
?>.
-The variable scope is inherited by the template that included the file.
+which is equivalent to <?php include __DIR__.'/../forms/contact.php'
?>,
+except that the variable scope is not inherited by the template that included
+the file. To import variables into the included template snippet file:
+
+```php
+<?php $this->include('forms/contact.php', ['formHeading' =>
'value', 'foo' => 'bar']) ?>
+```
## Blocks
diff --git a/src/Template/Context.php b/src/Template/Context.php
index eaf9403..98994f4 100644
--- a/src/Template/Context.php
+++ b/src/Template/Context.php
@@ -141,8 +141,14 @@ class Context
*
* @return mixed
*/
- public function include(string $template)
+ public function include(string $template, array $variables = [])
{
+ if (count($variables) > extract($variables, EXTR_SKIP)) {
+ throw new \Exception(
+ 'Variables with numeric names $0, $1... cannot be imported to scope
'.$template
+ );
+ }
+
return include $this->dir.'/'.$template;
}
diff --git a/tests/Unit/Template/ContextTest.php b/tests/Unit/Template/ContextTest.php
index 8b82de7..c4d2252 100644
--- a/tests/Unit/Template/ContextTest.php
+++ b/tests/Unit/Template/ContextTest.php
@@ -52,6 +52,14 @@ class ContextTest extends TestCase
$this->assertEquals(include TEST_FIXTURES_DIRECTORY .
'/templates/includes/variable.php', $variable);
}
+ public function testIncludeOnInvalidVariableCounts(): void
+ {
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Variables with numeric names $0, $1... cannot be
imported to scope includes/variable.php');
+
+ $this->context->include('includes/variable.php', ['var1',
'var2', 'var3']);
+ }
+
/**
* @dataProvider attacksProvider
*/
diff --git a/tests/fixtures/templates/forms/form_2.php b/tests/fixtures/templates/forms/form_2.php
new file mode 100644
index 0000000..ba4a660
--- /dev/null
+++ b/tests/fixtures/templates/forms/form_2.php
@@ -0,0 +1,10 @@
+<?php $this->append('scripts'); ?>
+<script src="/path/to/file_2.js"></script>
+<?php $this->end('scripts'); ?>
+
+<?= $this->e($importedVariable) ?>
+
+<form method="post">
+<input type="text" name="foo">
+<input type="submit" value="Submit">
+</form>
diff --git a/tests/fixtures/templates/pages/including.php
b/tests/fixtures/templates/pages/including.php
index 746b59a..fd157bd 100644
--- a/tests/fixtures/templates/pages/including.php
+++ b/tests/fixtures/templates/pages/including.php
@@ -1,5 +1,6 @@
<?php $this->extends('layout.php', ['title' => 'Testing blocks
appends']) ?>
<?php $this->start('content') ?>
-<?php $this->include('forms/form.php') ?>
+<?php $someVariable = 'foobarbaz' ?>
+<?php $this->include('forms/form_2.php', ['importedVariable' =>
$someVariable]) ?>
<?php $this->end('content') ?>