IconsetFinderService.php in Social Media Links Block and Field 8.2
Namespace
Drupal\social_media_linksFile
src/IconsetFinderService.phpView source
<?php
namespace Drupal\social_media_links;
use Drupal\Core\DrupalKernelInterface;
/**
* Service class to detect the files of the iconsets/ in various directories.
*/
class IconsetFinderService {
/**
* {@inheritdoc}
*/
protected $installDirs = [];
/**
* {@inheritdoc}
*/
protected $searchDirs = [];
/**
* {@inheritdoc}
*/
protected $iconsets = [];
/**
* {@inheritdoc}
*/
protected $kernel;
/**
* Define inital state if the service class is constructed.
*/
public function __construct(DrupalKernelInterface $kernel) {
$this->kernel = $kernel;
$this
->setSearchDirs();
$this
->setIconsets();
}
/**
* Get the path to a iconset.
*
* @param string $id
* The id of the iconset.
*
* @return string|null
* The path to the iconset or NULL if the iconset is not installed.
*/
public function getPath($id) {
return isset($this->iconsets[$id]) ? $this->iconsets[$id] : NULL;
}
/**
* Get the directories where to look for the iconsets.
*
* @return array
* The paths to the directories.
*/
public function getSearchDirs() {
return $this->searchDirs;
}
/**
* Defines a list of the locations, where icon sets are searched.
*/
protected function setSearchDirs() {
// Similar to 'modules' and 'themes' directories inside an installation
// profile, installation profiles may want to place libraries into a
// 'libraries' directory.
$profile = \Drupal::installProfile();
if ($profile && strpos($profile, "core") === FALSE) {
$profile_path = drupal_get_path('profile', $profile);
$searchdirs[] = "{$profile_path}/libraries";
}
// Search sites/all/libraries for backwars-compatibility.
$searchdirs[] = 'sites/all/libraries';
// Always search the root 'libraries' directory.
$searchdirs[] = 'libraries';
// Also search sites/<domain>/*.
$site_path = $this->kernel
->getSitePath();
$searchdirs[] = "{$site_path}/libraries";
// Add the social_media_links module directory.
$searchdirs[] = drupal_get_path('module', 'social_media_links') . '/libraries';
$this->searchDirs = $searchdirs;
}
/**
* Get the directories where iconsets should be saved.
*
* @return array
* The paths to the directories where iconsets should be saved.
*/
public function getInstallDirs() {
if (empty($this->installDirs)) {
$this
->setInstallDirs();
}
return $this->installDirs;
}
/**
* Set the directores where iconsets should be saved.
*
* This differs to the "searchDirs" that if a icon should be printed,
* we are searching for the iconset path in all "searchDirs". But the user
* should only install new iconsets in the directories, that are defined in
* "installDirs".
*/
protected function setInstallDirs() {
$searchdirs = $this->searchDirs;
// Remove the core and social_media_links module directory from the possible
// target directories for installation.
foreach ($searchdirs as $key => $dir) {
if (preg_match("/core|social_media_links/", $dir)) {
unset($searchdirs[$key]);
}
}
$this->installDirs = $searchdirs;
}
/**
* Returns the iconsets that are installed.
*
* @return array
* The installed iconsets.
*/
public function getIconsets() {
return (array) $this->iconsets;
}
/**
* Searches the directories for libraries (e.g. Icon Sets).
*
* Sets an array of library directories from the all-sites directory
* (i.e. sites/all/libraries/), the profiles directory, and site-specific
* directory (i.e. sites/somesite/libraries/). The returned array will be
* keyed by the library name. Site-specific libraries are prioritized over
* libraries in the default directories. That is, if a library with the same
* name appears in both the site-wide directory and site-specific directory,
* only the site-specific version will be listed.
*
* Most of the code in this function are borrowed from the libraries module
* (http://drupal.org/project/libraries).
*/
protected function setIconsets() {
// Retrieve a list of directories.
$directories = [];
$nomask = [
'CVS',
];
foreach ($this->searchDirs as $dir) {
if (is_dir($dir) && ($handle = opendir($dir))) {
while (FALSE !== ($file = readdir($handle))) {
if (!in_array($file, $nomask) && $file[0] != '.') {
if (is_dir("{$dir}/{$file}")) {
$directories[$file] = "{$dir}/{$file}";
}
}
}
closedir($handle);
}
}
$this->iconsets = (array) $directories;
}
}
Classes
Name | Description |
---|---|
IconsetFinderService | Service class to detect the files of the iconsets/ in various directories. |