View source
<?php
namespace Drupal\graphql_core\Plugin\GraphQL\Fields\Blocks;
use Drupal\block\Entity\Block;
use Drupal\block_content\Plugin\Block\BlockContentBlock;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Condition\ConditionInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Theme\ThemeManagerInterface;
use Drupal\Core\Url;
use Drupal\graphql\GraphQL\Buffers\SubRequestBuffer;
use Drupal\graphql\GraphQL\Cache\CacheableValue;
use Drupal\graphql\GraphQL\Execution\ResolveContext;
use Drupal\graphql\Plugin\GraphQL\Fields\FieldPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use GraphQL\Type\Definition\ResolveInfo;
class BlocksByRegion extends FieldPluginBase implements ContainerFactoryPluginInterface {
protected $themeManager;
protected $entityTypeManager;
protected $entityRepository;
protected $subRequestBuffer;
public static function create(ContainerInterface $container, array $configuration, $pluginId, $pluginDefinition) {
return new static($configuration, $pluginId, $pluginDefinition, $container
->get('graphql.buffer.subrequest'), $container
->get('theme.manager'), $container
->get('entity_type.manager'), $container
->get('entity.repository'));
}
public function __construct(array $configuration, $pluginId, $pluginDefinition, SubRequestBuffer $subRequestBuffer, ThemeManagerInterface $themeManager, EntityTypeManagerInterface $entityTypeManager, EntityRepositoryInterface $entityRepository) {
parent::__construct($configuration, $pluginId, $pluginDefinition);
$this->subRequestBuffer = $subRequestBuffer;
$this->themeManager = $themeManager;
$this->entityTypeManager = $entityTypeManager;
$this->entityRepository = $entityRepository;
}
protected function resolveValues($value, array $args, ResolveContext $context, ResolveInfo $info) {
if ($value instanceof Url) {
$activeTheme = $this->themeManager
->getActiveTheme();
$blockStorage = $this->entityTypeManager
->getStorage('block');
$blocks = $blockStorage
->loadByProperties([
'theme' => $activeTheme
->getName(),
'region' => $args['region'],
]);
$resolve = $this->subRequestBuffer
->add($value, function () use ($blocks) {
$blocks = array_filter($blocks, function (Block $block) {
return array_reduce(iterator_to_array($block
->getVisibilityConditions()), function ($value, ConditionInterface $condition) {
return $value && !$condition
->isNegated() == $condition
->evaluate();
}, TRUE);
});
uasort($blocks, '\\Drupal\\Block\\Entity\\Block::sort');
return $blocks;
});
return function ($value, array $args, ResolveContext $context, ResolveInfo $info) use ($resolve) {
$response = $resolve();
$blocks = array_map(function (Block $block) {
$plugin = $block
->getPlugin();
if ($plugin instanceof BlockContentBlock) {
return $this->entityRepository
->loadEntityByUuid('block_content', $plugin
->getDerivativeId());
}
else {
return $block;
}
}, $response
->getValue());
foreach ($blocks as $block) {
(yield new CacheableValue($block, [
$response,
]));
}
};
}
}
}