Skip to content

Commit fe47b7b

Browse files
AC-7093: Legitimate nested directive use cases broken
1 parent 13c070e commit fe47b7b

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

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

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ public function getTemplateProcessor()
189189
*
190190
* @param string $value
191191
* @return string
192+
*
192193
* @throws \Exception
193194
*/
194195
public function filter($value)
@@ -203,19 +204,21 @@ public function filter($value)
203204
$this->filteringDepthMeter->descend();
204205

205206
// Processing of template directives.
206-
$templateDirectivesResults = $this->processDirectives($value);
207+
$templateDirectivesResults = array_unique(
208+
$this->processDirectives($value),
209+
SORT_REGULAR
210+
);
207211

208-
foreach ($templateDirectivesResults as $result) {
209-
$value = str_replace($result['directive'], $result['output'], $value);
210-
}
212+
$value = $this->applyDirectivesResults($value, $templateDirectivesResults);
211213

212214
// Processing of deferred directives received from child templates
213215
// or nested directives.
214-
$deferredDirectivesResults = $this->processDirectives($value, true);
216+
$deferredDirectivesResults = array_unique(
217+
$this->processDirectives($value, true),
218+
SORT_REGULAR
219+
);
215220

216-
foreach ($deferredDirectivesResults as $result) {
217-
$value = str_replace($result['directive'], $result['output'], $value);
218-
}
221+
$value = $this->applyDirectivesResults($value, $deferredDirectivesResults);
219222

220223
if ($this->filteringDepthMeter->showMark() > 1) {
221224
// Signing own deferred directives (if any).
@@ -282,6 +285,35 @@ private function processDirectives($value, $isSigned = false): array
282285
return $results;
283286
}
284287

288+
/**
289+
* Applies results produced by directives.
290+
*
291+
* @param string $value
292+
* @param array $results
293+
*
294+
* @return string
295+
*/
296+
private function applyDirectivesResults(string $value, array $results): string
297+
{
298+
$processedResults = [];
299+
300+
foreach ($results as $result) {
301+
foreach ($processedResults as $processedResult) {
302+
$result['directive'] = str_replace(
303+
$processedResult['directive'],
304+
$processedResult['output'],
305+
$result['directive']
306+
);
307+
}
308+
309+
$value = str_replace($result['directive'], $result['output'], $value);
310+
311+
$processedResults[] = $result;
312+
}
313+
314+
return $value;
315+
}
316+
285317
/**
286318
* Modifies given regular expression pattern to be able to recognize signed directives.
287319
*

0 commit comments

Comments
 (0)