HandleChannelLanguages.php in Acquia Content Hub 8.2
File
src/EventSubscriber/PruneCdf/HandleChannelLanguages.php
View source
<?php
namespace Drupal\acquia_contenthub\EventSubscriber\PruneCdf;
use Acquia\ContentHubClient\CDF\CDFObject;
use Acquia\ContentHubClient\CDFDocument;
use Acquia\ContentHubClient\Settings;
use Drupal\acquia_contenthub\AcquiaContentHubEvents;
use Drupal\acquia_contenthub\Event\PruneCdfEntitiesEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class HandleChannelLanguages implements EventSubscriberInterface {
protected $clientSettings;
public function __construct(Settings $client_settings) {
$this->clientSettings = $client_settings;
}
public static function getSubscribedEvents() {
$events[AcquiaContentHubEvents::PRUNE_CDF][] = 'onPruneCdf';
return $events;
}
public function onPruneCdf(PruneCdfEntitiesEvent $event) {
$cdf = $event
->getCdf();
$allLanguages = $this
->getCdfConfigurableLanguages($cdf);
$channelLanguages = $this
->getChannelLanguages($allLanguages);
$removedLanguages = [];
foreach ($allLanguages as $langcode => $language) {
if (!isset($channelLanguages[$langcode])) {
$cdf
->removeCdfEntity($language
->getUuid());
$removedLanguages[$langcode] = $language;
}
}
if (empty($removedLanguages)) {
return;
}
foreach ($cdf
->getEntities() as $cdfEntity) {
$this
->removeDependenciesToNotChannelLanguages($cdfEntity, $removedLanguages);
}
}
protected function getChannelLanguages(array $languages) {
$name = $this->clientSettings
->getName();
$channelLanguages = [];
foreach ($languages as $language) {
$channelName = $this
->getLanguageChannelName($language);
if (empty($channelName) || $channelName === $name) {
$channelLanguages[$language
->getMetadata()['langcode']] = $language;
}
}
return $this
->removeGlobalLanguagesIfChannelLanguageExist($channelLanguages);
}
protected function removeGlobalLanguagesIfChannelLanguageExist(array $channelLanguages) {
$langcodes = array_keys($channelLanguages);
foreach ($channelLanguages as $langcode => $language) {
$channelName = $this
->getLanguageChannelName($language);
if (empty($channelName) && !empty(preg_grep("/^{$langcode}_/", $langcodes))) {
unset($channelLanguages[$langcode]);
}
}
return $channelLanguages;
}
protected function getLanguageChannelName(CDFObject $language) {
$channelNameAttribute = $language
->getAttribute('channel_name');
return $channelNameAttribute ? $channelNameAttribute
->getValue()['und'] : '';
}
protected function getCdfConfigurableLanguages(CDFDocument $cdf) {
$languages = [];
foreach ($cdf
->getEntities() as $cdfEntity) {
$entity_type = $cdfEntity
->getAttribute('entity_type')
->getValue()['und'];
if ($entity_type !== 'configurable_language') {
continue;
}
if (isset($cdfEntity
->getMetadata()['langcode'])) {
$languages[$cdfEntity
->getMetadata()['langcode']] = $cdfEntity;
}
}
return $languages;
}
protected function removeDependenciesToNotChannelLanguages(CDFObject $cdfEntity, array $removedLanguages) {
$metadata = $cdfEntity
->getMetadata();
$bundle = $cdfEntity
->getAttribute('bundle');
if (isset($bundle)) {
$value = $bundle
->getValue();
if (isset($value['und']) && $value['und'] === 'user') {
return;
}
}
if (!isset($metadata['languages'])) {
return;
}
foreach ($removedLanguages as $languageCdf) {
$removedLangcode = $languageCdf
->getMetadata()['langcode'];
if (($langcodeKey = array_search($removedLangcode, $metadata['languages'], TRUE)) !== FALSE) {
unset($metadata['languages'][$langcodeKey]);
}
if (!in_array($metadata['default_language'], $metadata['languages'], TRUE)) {
$metadata['default_language'] = current($metadata['languages']);
}
unset($metadata['dependencies']['entity'][$languageCdf
->getUuid()]);
}
$cdfEntity
->setMetadata($metadata);
}
}