Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AlternativeSource.php
Go to the documentation of this file.
1 <?php
7 
13 
20 {
24  const PROCESSOR_CLASS = 'class';
25 
29  private $sorter;
30 
34  private $alternatives;
35 
39  private $objectManager;
40 
44  private $alternativesSorted;
45 
49  private $lockerProcess;
50 
54  private $lockName;
55 
59  private $assetBuilder;
60 
64  private $filenameResolver;
65 
77  public function __construct(
78  FilenameResolverInterface $filenameResolver,
79  ObjectManagerInterface $objectManager,
80  LockerProcessInterface $lockerProcess,
81  Helper\SortInterface $sorter,
82  AssetBuilder $assetBuilder,
83  $lockName,
84  array $alternatives = []
85  ) {
86  $this->objectManager = $objectManager;
87  $this->lockerProcess = $lockerProcess;
88  $this->sorter = $sorter;
89  $this->alternatives = $alternatives;
90  $this->lockName = $lockName;
91  $this->assetBuilder = $assetBuilder;
92  $this->filenameResolver = $filenameResolver;
93  }
94 
99  public function process(Chain $chain)
100  {
101  $path = $chain->getAsset()->getFilePath();
102  $content = $chain->getContent();
103  if (trim($content) !== '') {
104  return;
105  }
106 
107  try {
108  $this->lockerProcess->lockProcess($this->lockName);
109 
110  $module = $chain->getAsset()->getModule();
111 
113  $context = $chain->getAsset()->getContext();
114  $chain->setContent($this->processContent($path, $content, $module, $context));
115  } finally {
116  $this->lockerProcess->unlockProcess();
117  }
118  }
119 
130  private function processContent($path, $content, $module, FallbackContext $context)
131  {
132  if ($this->alternativesSorted === null) {
133  $this->alternativesSorted = $this->sorter->sort($this->alternatives);
134  }
135 
136  $path = $this->filenameResolver->resolve($path);
137  foreach ($this->alternativesSorted as $name => $alternative) {
138  $asset = $this->assetBuilder->setArea($context->getAreaCode())
139  ->setTheme($context->getThemePath())
140  ->setLocale($context->getLocale())
141  ->setModule($module)
142  ->setPath(preg_replace(
143  '#\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION)) . '$#',
144  '.' . $name,
145  $path
146  ))->build();
147 
148  $processor = $this->objectManager->get($alternative[self::PROCESSOR_CLASS]);
149  if (!$processor instanceof ContentProcessorInterface) {
150  throw new \UnexpectedValueException(
151  '"' . $alternative[self::PROCESSOR_CLASS] . '" has to implement the ContentProcessorInterface.'
152  );
153  }
154  $content = $processor->processContent($asset);
155 
156  if (trim($content) !== '') {
157  return $content;
158  }
159  }
160 
161  return $content;
162  }
163 
168  {
169  return array_keys($this->alternatives);
170  }
171 }
$objectManager
Definition: bootstrap.php:17
$processor
Definition: 404.php:10
__construct(FilenameResolverInterface $filenameResolver, ObjectManagerInterface $objectManager, LockerProcessInterface $lockerProcess, Helper\SortInterface $sorter, AssetBuilder $assetBuilder, $lockName, array $alternatives=[])
if(!isset($_GET['name'])) $name
Definition: log.php:14