Skip to content

Commit 5cf1f0b

Browse files
Merge branch 'MAGETWO-71366-fx' into 'SPRINT-41'
MAGETWO-71528: Add an ability to call methods through objects in email templates See merge request !268
2 parents daa8a3a + 5284f02 commit 5cf1f0b

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

lib/internal/Magento/Framework/Filter/Template.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ protected function getVariable($value, $default = '{no_value_defined}')
320320
} elseif (isset($stackVars[$i - 1]['variable'])
321321
&& $stackVars[$i - 1]['variable'] instanceof \Magento\Framework\DataObject
322322
) {
323-
// If object calling methods or getting properties
323+
// If data object calling methods or getting properties
324324
if ($stackVars[$i]['type'] == 'property') {
325325
$caller = 'get' . $this->string->upperCaseWords($stackVars[$i]['name'], '_', '');
326326
$stackVars[$i]['variable'] = method_exists(
@@ -330,7 +330,7 @@ protected function getVariable($value, $default = '{no_value_defined}')
330330
$stackVars[$i]['name']
331331
);
332332
} elseif ($stackVars[$i]['type'] == 'method') {
333-
// Calling of object method
333+
// Calling of data object method
334334
if (method_exists($stackVars[$i - 1]['variable'], $stackVars[$i]['name'])
335335
|| substr($stackVars[$i]['name'], 0, 3) == 'get'
336336
) {
@@ -342,6 +342,16 @@ protected function getVariable($value, $default = '{no_value_defined}')
342342
}
343343
}
344344
$last = $i;
345+
} elseif (isset($stackVars[$i - 1]['variable']) && $stackVars[$i]['type'] == 'method') {
346+
// Calling object methods
347+
if (method_exists($stackVars[$i - 1]['variable'], $stackVars[$i]['name'])) {
348+
$stackVars[$i]['args'] = $this->getStackArgs($stackVars[$i]['args']);
349+
$stackVars[$i]['variable'] = call_user_func_array(
350+
[$stackVars[$i - 1]['variable'], $stackVars[$i]['name']],
351+
$stackVars[$i]['args']
352+
);
353+
}
354+
$last = $i;
345355
}
346356
}
347357

lib/internal/Magento/Framework/Filter/Test/Unit/TemplateTest.php

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,23 @@ public function testVarDirective($construction, $variables, $expectedResult)
140140

141141
public function varDirectiveDataProvider()
142142
{
143-
/* @var $stub \Magento\Framework\DataObject|\PHPUnit_Framework_MockObject_MockObject */
144-
$stub = $this->getMockBuilder(\Magento\Framework\DataObject::class)
143+
/* @var $dataObjectVariable \Magento\Framework\DataObject|\PHPUnit_Framework_MockObject_MockObject */
144+
$dataObjectVariable = $this->getMockBuilder(\Magento\Framework\DataObject::class)
145145
->disableOriginalConstructor()
146146
->disableProxyingToOriginalMethods()
147147
->setMethods(['bar'])
148148
->getMock();
149-
150-
$stub->expects($this->once())
149+
$dataObjectVariable->expects($this->once())
151150
->method('bar')
152-
->willReturn('Mocked Method Return');
151+
->willReturn('DataObject Method Return');
152+
153+
/* @var $nonDataObjectVariable \Magento\Framework\Escaper|\PHPUnit_Framework_MockObject_MockObject */
154+
$nonDataObjectVariable = $this->getMockBuilder(\Magento\Framework\Escaper::class)
155+
->disableOriginalConstructor()
156+
->getMock();
157+
$nonDataObjectVariable->expects($this->once())
158+
->method('escapeHtml')
159+
->willReturnArgument(0);
153160

154161
return [
155162
'no variables' => [
@@ -170,12 +177,28 @@ public function varDirectiveDataProvider()
170177
'array argument to method' => [
171178
'{{var foo.bar([param_1:value_1, param_2:$value_2, param_3:[a:$b, c:$d]])}}',
172179
[
173-
'foo' => $stub,
180+
'foo' => $dataObjectVariable,
174181
'value_2' => 'lorem',
175182
'b' => 'bee',
176183
'd' => 'dee',
177184
],
178-
'Mocked Method Return'
185+
'DataObject Method Return'
186+
],
187+
'non DataObject method call' => [
188+
'{{var foo.escapeHtml($value)}}',
189+
[
190+
'foo' => $nonDataObjectVariable,
191+
'value' => 'lorem'
192+
],
193+
'lorem'
194+
],
195+
'non DataObject undefined method call' => [
196+
'{{var foo.undefinedMethod($value)}}',
197+
[
198+
'foo' => $nonDataObjectVariable,
199+
'value' => 'lorem'
200+
],
201+
''
179202
],
180203
];
181204
}

0 commit comments

Comments
 (0)