41 const LOOP_PATTERN =
'/{{for(?P<loopItem>.*? )(in)(?P<loopData>.*?)}}(?P<loopBody>.*?){{\/for}}/si';
44 private $afterFilterCallbacks = [];
97 $this->templateProcessor = $callback;
108 return is_callable($this->templateProcessor) ? $this->templateProcessor :
null;
123 self::CONSTRUCTION_DEPEND_PATTERN =>
'dependDirective',
124 self::CONSTRUCTION_IF_PATTERN =>
'ifDirective',
125 self::CONSTRUCTION_TEMPLATE_PATTERN =>
'templateDirective',
127 if (preg_match_all(
$pattern,
$value, $constructions, PREG_SET_ORDER)) {
128 foreach ($constructions as $construction) {
129 $callback = [$this, $directive];
130 if (!is_callable($callback)) {
135 }
catch (\Exception $e) {
138 $value = str_replace($construction[0], $replacedValue,
$value);
145 if (preg_match_all(self::CONSTRUCTION_PATTERN,
$value, $constructions, PREG_SET_ORDER)) {
146 foreach ($constructions as $construction) {
147 $callback = [$this, $construction[1] .
'Directive'];
148 if (!is_callable($callback)) {
153 }
catch (\Exception $e) {
156 $value = str_replace($construction[0], $replacedValue,
$value);
172 private function filterFor(
$value)
174 if (preg_match_all(self::LOOP_PATTERN,
$value, $constructions, PREG_SET_ORDER)) {
175 foreach ($constructions as $construction) {
176 if (!$this->isValidLoop($construction)) {
180 $fullTextToReplace = $construction[0];
181 $loopData = $this->
getVariable($construction[
'loopData'],
'');
183 $loopTextToReplace = $construction[
'loopBody'];
184 $loopItemVariableName = preg_replace(
'/\s+/',
'', $construction[
'loopItem']);
186 if (is_array($loopData) || $loopData instanceof \Traversable) {
187 $replaceText = $this->getLoopReplacementText($loopData, $loopItemVariableName, $loopTextToReplace);
188 $value = str_replace($fullTextToReplace, $replaceText,
$value);
202 private function isValidLoop(array $construction)
204 $requiredFields = [
'loopBody',
'loopItem',
'loopData'];
205 $validFields = array_filter(
207 function ($field) use ($construction) {
208 return isset($construction[$field]) && strlen(trim($construction[$field]));
211 return count($requiredFields) == count($validFields);
222 foreach ($this->afterFilterCallbacks as $callback) {
241 if (in_array($afterFilterCallback, $this->afterFilterCallbacks)) {
245 $this->afterFilterCallbacks[] = $afterFilterCallback;
256 $this->afterFilterCallbacks = [];
266 if (count($this->templateVars) == 0) {
268 return $construction[0];
271 $replacedValue = $this->
getVariable($construction[2],
'');
272 return $replacedValue;
291 $templateParameters = $this->
getParameters($construction[2]);
294 $replacedValue =
'{Error in template processing}';
297 $configPath = $templateParameters[
'config_path'];
298 unset($templateParameters[
'config_path']);
299 $templateParameters = array_merge_recursive($templateParameters, $this->templateVars);
302 return $replacedValue;
311 if (count($this->templateVars) == 0) {
313 return $construction[0];
316 if ($this->
getVariable($construction[1],
'') ==
'') {
319 return $construction[2];
329 if (count($this->templateVars) == 0) {
330 return $construction[0];
333 if ($this->
getVariable($construction[1],
'') ==
'') {
334 if (isset($construction[3]) && isset($construction[4])) {
335 return $construction[4];
339 return $construction[2];
351 $tokenizer =
new Template\Tokenizer\Parameter();
352 $tokenizer->setString(
$value);
353 $params = $tokenizer->tokenize();
355 if (substr(
$value, 0, 1) ===
'$') {
372 \Magento\Framework\Profiler::start(
'email_template_processing_variables');
373 $tokenizer =
new Template\Tokenizer\Variable();
374 $tokenizer->setString(
$value);
375 $stackVars = $tokenizer->tokenize();
378 for (
$i = 0;
$i < count($stackVars);
$i++) {
379 if (
$i == 0 && isset($this->templateVars[$stackVars[
$i][
'name']])) {
381 $stackVars[
$i][
'variable'] = & $this->templateVars[$stackVars[
$i][
'name']];
382 }
elseif (isset($stackVars[
$i - 1][
'variable'])
386 if ($stackVars[
$i][
'type'] ==
'property') {
387 $caller =
'get' . $this->
string->upperCaseWords($stackVars[
$i][
'name'],
'_',
'');
388 $stackVars[
$i][
'variable'] = method_exists(
389 $stackVars[
$i - 1][
'variable'],
391 ) ? $stackVars[
$i - 1][
'variable']->{$caller}() : $stackVars[
$i - 1][
'variable']->getData(
392 $stackVars[
$i][
'name']
394 }
elseif ($stackVars[
$i][
'type'] ==
'method') {
396 if (method_exists($stackVars[
$i - 1][
'variable'], $stackVars[
$i][
'name'])
397 || substr($stackVars[
$i][
'name'], 0, 3) ==
'get' 400 $stackVars[
$i][
'variable'] = call_user_func_array(
401 [$stackVars[
$i - 1][
'variable'], $stackVars[
$i][
'name']],
402 $stackVars[
$i][
'args']
407 }
elseif (isset($stackVars[
$i - 1][
'variable']) && $stackVars[
$i][
'type'] ==
'method') {
409 if (method_exists($stackVars[
$i - 1][
'variable'], $stackVars[
$i][
'name'])) {
411 $stackVars[
$i][
'variable'] = call_user_func_array(
412 [$stackVars[
$i - 1][
'variable'], $stackVars[
$i][
'name']],
413 $stackVars[
$i][
'args']
420 if (isset($stackVars[$last][
'variable'])) {
422 $result = $stackVars[$last][
'variable'];
424 \Magento\Framework\Profiler::stop(
'email_template_processing_variables');
438 $stack[
$i] = $this->getStackArgs(
$value);
440 $stack[
$i] = $this->getVariable(substr(
$value, 1),
null);
454 private function getLoopReplacementText(array $loopData, $loopItemVariableName, $loopTextToReplace)
458 $loopDataObject = new \Magento\Framework\DataObject();
460 foreach ($loopData as $loopItemDataObject) {
465 if (!is_array($loopItemDataObject)) {
468 $loopItemDataObject = new \Magento\Framework\DataObject($loopItemDataObject);
471 $loopDataObject->setData(
'index', $loopIndex++);
472 $this->templateVars[
'loop'] = $loopDataObject;
473 $this->templateVars[$loopItemVariableName] = $loopItemDataObject;
476 self::CONSTRUCTION_PATTERN,
482 $subText = $loopTextToReplace;
487 $loopText[] = $subText;
489 unset($this->templateVars[$loopItemVariableName]);
491 $replaceText = implode(
'', $loopText);
elseif(isset( $params[ 'redirect_parent']))
const CONSTRUCTION_TEMPLATE_PATTERN
call_user_func($callable, $param)
setTemplateProcessor(callable $callback)
resetAfterFilterCallbacks()
ifDirective($construction)
const CONSTRUCTION_PATTERN
__construct(\Magento\Framework\Stdlib\StringUtils $string, $variables=[])
varDirective($construction)
const CONSTRUCTION_IF_PATTERN
setVariables(array $variables)
addAfterFilterCallback(callable $afterFilterCallback)
const CONSTRUCTION_DEPEND_PATTERN
getVariable($value, $default='{no_value_defined}')
templateDirective($construction)
dependDirective($construction)
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE]
if(!isset($_GET['name'])) $name