View source
<?php
namespace Drupal\search_api_saved_searches\Plugin\Block;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\search_api\Utility\QueryHelperInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class SaveSearch extends BlockBase implements ContainerFactoryPluginInterface {
protected $entityTypeManager;
protected $formBuilder;
protected $queryHelper;
protected $requestStack;
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$block = new static($configuration, $plugin_id, $plugin_definition);
$block
->setStringTranslation($container
->get('string_translation'));
$block
->setEntityTypeManager($container
->get('entity_type.manager'));
$block
->setFormBuilder($container
->get('form_builder'));
$block
->setQueryHelper($container
->get('search_api.query_helper'));
$block
->setRequestStack($container
->get('request_stack'));
return $block;
}
public function getEntityTypeManager() {
return $this->entityTypeManager ?: \Drupal::entityTypeManager();
}
public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager) {
$this->entityTypeManager = $entity_type_manager;
return $this;
}
public function getFormBuilder() {
return $this->formBuilder ?: \Drupal::formBuilder();
}
public function setFormBuilder(FormBuilderInterface $form_builder) {
$this->formBuilder = $form_builder;
return $this;
}
public function getQueryHelper() {
return $this->queryHelper ?: \Drupal::service('search_api.query_helper');
}
public function setQueryHelper(QueryHelperInterface $query_helper) {
$this->queryHelper = $query_helper;
return $this;
}
public function getRequestStack() {
return $this->requestStack ?: \Drupal::service('request_stack');
}
public function setRequestStack(RequestStack $request_stack) {
$this->requestStack = $request_stack;
return $this;
}
public function defaultConfiguration() {
return [
'type' => NULL,
];
}
public function blockForm($form, FormStateInterface $form_state) {
$types = $this
->getEntityTypeManager()
->getStorage('search_api_saved_search_type')
->loadMultiple();
$type_options = [];
foreach ($types as $type_id => $type) {
$type_options[$type_id] = $type
->label();
}
$form['type'] = [
'#type' => 'select',
'#title' => $this
->t('Saved search type'),
'#description' => $this
->t('The type/bundle of saved searches that should be created by this block.'),
'#options' => $type_options,
'#default_value' => $this->configuration['type'] ?: key($type_options),
'#required' => TRUE,
];
return $form;
}
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['type'] = $form_state
->getValue('type');
}
public function access(AccountInterface $account, $return_as_object = FALSE) {
$access = parent::access($account, TRUE);
$create_access = $this
->getEntityTypeManager()
->getAccessControlHandler('search_api_saved_search')
->createAccess($this->configuration['type'], $account, [], TRUE);
$access = $access
->andIf($create_access);
return $return_as_object ? $access : $access
->isAllowed();
}
public function build() {
$build = [];
$cacheability = new CacheableMetadata();
$type = $this
->getSavedSearchType();
if (!$type) {
$tags = $this
->getEntityTypeManager()
->getDefinition('search_api_saved_search_type')
->getListCacheTags();
$cacheability
->addCacheTags($tags);
$cacheability
->applyTo($build);
return $build;
}
$cacheability
->addCacheableDependency($type);
if (!$type
->status()) {
$cacheability
->applyTo($build);
return $build;
}
$cacheability
->setCacheMaxAge(0);
$cacheability
->applyTo($build);
$query = $type
->getActiveQuery($this
->getQueryHelper());
if (!$query) {
return $build;
}
$description = $type
->getOption('description');
if ($description) {
$build['description']['#markup'] = Xss::filterAdmin($description);
}
$values = [
'type' => $type
->id(),
'index_id' => $query
->getIndex()
->id(),
'query' => $query,
'path' => $this
->getCurrentPath(),
];
$saved_search = $this
->getEntityTypeManager()
->getStorage('search_api_saved_search')
->create($values);
$form_object = $this
->getEntityTypeManager()
->getFormObject('search_api_saved_search', 'create');
$form_object
->setEntity($saved_search);
$build['form'] = $this
->getFormBuilder()
->getForm($form_object);
return $build;
}
public function calculateDependencies() {
$dependencies = parent::calculateDependencies();
$type = $this
->getSavedSearchType();
if ($type) {
$dependencies['config'][] = $type
->getConfigDependencyName();
}
return $dependencies;
}
protected function getSavedSearchType() {
if (!$this->configuration['type']) {
return NULL;
}
$type = $this
->getEntityTypeManager()
->getStorage('search_api_saved_search_type')
->load($this->configuration['type']);
return $type;
}
protected function getCurrentPath() {
$path = $this
->getRequestStack()
->getCurrentRequest()
->getRequestUri();
$base_path = rtrim(base_path(), '/');
$base_path_length = strlen($base_path);
if ($base_path && substr($path, 0, $base_path_length) === $base_path) {
$path = substr($path, $base_path_length);
}
$path = preg_replace('/([?&])(ajax_form|_wrapper_format)=[^&#]+/', '$1', $path);
$path = preg_replace('/\\?(#|$)/', '$1', $path);
return $path;
}
}