Same filename in this branch
- 10 core/modules/help_topics/src/HelpTopicDiscovery.php
- 10 core/modules/help/src/HelpTopicDiscovery.php
Namespace
Drupal\help
File
core/modules/help/src/HelpTopicDiscovery.php
View source
<?php
namespace Drupal\help;
use Drupal\Component\Discovery\DiscoveryException;
use Drupal\Component\FileCache\FileCacheFactory;
use Drupal\Component\FileSystem\RegexDirectoryIterator;
use Drupal\Component\FrontMatter\FrontMatter;
use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
use Drupal\Component\Plugin\Discovery\DiscoveryTrait;
use Drupal\Component\Serialization\Exception\InvalidDataTypeException;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\StringTranslation\TranslatableMarkup;
class HelpTopicDiscovery implements DiscoveryInterface {
use DiscoveryTrait;
const FILE_KEY = '_discovered_file_path';
protected $directories = [];
public function __construct(array $directories) {
$this->directories = $directories;
}
public function getDefinitions() {
$plugins = $this
->findAll();
$definitions = [];
foreach ($plugins as $list) {
foreach ($list as $id => $definition) {
$definitions[$id] = $definition;
}
}
return $definitions;
}
public function findAll() {
$all = [];
$files = $this
->findFiles();
$file_cache = FileCacheFactory::get('help_topic_discovery:help_topics');
foreach ($file_cache
->getMultiple(array_keys($files)) as $file => $data) {
$all[$files[$file]][$data['id']] = $data;
unset($files[$file]);
}
if ($files) {
foreach ($files as $file => $provider) {
$plugin_id = substr(basename($file), 0, -10);
[
$file_name_provider,
] = explode('.', $plugin_id, 2);
$data = [
'id' => $plugin_id,
'provider' => $file_name_provider,
'class' => HelpTopicTwig::class,
static::FILE_KEY => $file,
];
try {
$front_matter = FrontMatter::create(file_get_contents($file), Yaml::class)
->getData();
} catch (InvalidDataTypeException $e) {
throw new DiscoveryException(sprintf('Malformed YAML in help topic "%s": %s.', $file, $e
->getMessage()));
}
foreach ($front_matter as $key => $value) {
switch ($key) {
case 'related':
if (!is_array($value)) {
throw new DiscoveryException("{$file} contains invalid value for 'related' key, the value must be an array of strings");
}
$data[$key] = $value;
break;
case 'top_level':
if (!is_bool($value)) {
throw new DiscoveryException("{$file} contains invalid value for 'top_level' key, the value must be a Boolean");
}
$data[$key] = $value;
break;
case 'label':
$data[$key] = new TranslatableMarkup($value);
break;
default:
throw new DiscoveryException("{$file} contains invalid key='{$key}'");
}
}
if (!isset($data['label'])) {
throw new DiscoveryException("{$file} does not contain the required key with name='label'");
}
$all[$provider][$data['id']] = $data;
$file_cache
->set($file, $data);
}
}
return $all;
}
protected function findFiles() {
$file_list = [];
foreach ($this->directories as $provider => $directories) {
$directories = (array) $directories;
foreach ($directories as $directory) {
if (is_dir($directory)) {
$iterator = new RegexDirectoryIterator($directory, '/\\.html\\.twig$/i');
foreach ($iterator as $fileInfo) {
$file_list[$fileInfo
->getPathname()] = $provider;
}
}
}
}
return $file_list;
}
}
Classes