View source
<?php
namespace Drupal\styleguide\Plugin\Styleguide;
use Drupal\styleguide\GeneratorInterface;
use Drupal\styleguide\Plugin\StyleguidePluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormBuilder;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\Entity\Node;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\search\SearchPluginManager;
class SearchStyleguide extends StyleguidePluginBase {
protected $generator;
protected $moduleHandler;
protected $formBuilder;
protected $currentUser;
protected $entityTypeManager;
protected $renderer;
protected $searchManager;
public function __construct(array $configuration, $plugin_id, array $plugin_definition, GeneratorInterface $styleguide_generator, ModuleHandlerInterface $module_handler, FormBuilder $form_builder, AccountInterface $current_user, EntityTypeManagerInterface $entityTypeManager, RendererInterface $renderer, SearchPluginManager $search_manager = NULL) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->generator = $styleguide_generator;
$this->moduleHandler = $module_handler;
$this->formBuilder = $form_builder;
$this->currentUser = $current_user;
$this->entityTypeManager = $entityTypeManager;
$this->renderer = $renderer;
$this->searchManager = $search_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$search_manager = $container
->has('plugin.manager.search') ? $container
->get('plugin.manager.search') : NULL;
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('styleguide.generator'), $container
->get('module_handler'), $container
->get('form_builder'), $container
->get('current_user'), $container
->get('entity_type.manager'), $container
->get('renderer'), $search_manager);
}
public function items() {
$items = [];
if ($this->moduleHandler
->moduleExists('search')) {
$items['search_block_form'] = [
'title' => $this
->t('Search block form'),
'content' => $this->formBuilder
->getForm('Drupal\\search\\Form\\SearchBlockForm'),
'group' => $this
->t('Search'),
];
$items['search_no_results'] = [
'title' => $this
->t('Search, no results'),
'content' => [
'#theme' => 'item_list__search_results',
'#items' => [],
'#empty' => [
'#markup' => '<h3>' . $this
->t('Your search yielded no results.') . '</h3>',
],
],
'group' => $this
->t('Search'),
];
$this
->searchResults($items);
}
return $items;
}
private function searchResults(array &$items) {
$results = [];
if (!empty($this->searchManager)) {
$definitions = $this->searchManager
->getDefinitions();
if (in_array('user_search', array_keys($definitions))) {
$definitions['user_search_admin'] = [
'id' => 'user_search_admin',
'provider' => 'user_admin',
];
}
foreach ($definitions as $definition) {
$search_provider = $definition['provider'];
for ($i = 0; $i < 5; $i++) {
if ($search_provider == 'node') {
$title = $this
->t('Node Search, results');
$result = $this
->searchNodePrepare($i);
}
else {
if ($search_provider == 'user_admin') {
$title = $this
->t('User Search, results (Has permission "administer users")');
$result = [
'title' => $this->generator
->words(1) . " (user_{$i}@email.com)",
];
}
else {
$title = $this
->t('@type Search, results', [
'@type' => ucfirst($search_provider),
]);
$result = [
'title' => $this->generator
->words(1),
];
}
}
$results[$i] = [
'#theme' => 'search_result',
'#result' => [
'link' => '#',
],
'#plugin_id' => $definition['id'],
];
$results[$i]['#result'] = array_merge($results[$i]['#result'], $result);
}
$items["{$definition['id']}_search_results"] = [
'title' => $title,
'content' => [
'#theme' => 'item_list__search_results',
'#items' => $results,
'#empty' => [
'#markup' => '<h3>' . $this
->t('Your search yielded no results.') . '</h3>',
],
'#list_type' => 'ol',
'#context' => [
'plugin' => $definition['id'],
],
],
'group' => $this
->t('Search'),
];
}
}
}
private function searchNodePrepare($i) {
$node = Node::create([
'type' => 'article',
'title' => "Title {$i}",
'body' => $this->generator
->words(20),
'in_preview' => TRUE,
]);
$build = $this->entityTypeManager
->getViewBuilder('node')
->view($node, 'search_result');
unset($build['#theme']);
$rendered = $this->renderer
->renderPlain($build);
return [
'title' => $node
->label(),
'node' => $node,
'extra' => $this->moduleHandler
->invokeAll('node_search_result', [
$node,
]),
'snippet' => search_excerpt('title', $rendered),
'date' => time(),
'user' => [
'#theme' => 'username',
'#account' => $this->currentUser,
],
];
}
}