Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 109 |
ViewsUIController | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
756 | |
0.00% |
0 / 109 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
reportFields | |
0.00% |
0 / 1 |
156 | |
0.00% |
0 / 45 |
|||
reportPlugins | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 21 |
|||
ajaxOperation | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 9 |
|||
autocompleteTag | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 18 |
|||
edit | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 10 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\views_ui\Controller\ViewsUIController. | |
*/ | |
namespace Drupal\views_ui\Controller; | |
use Drupal\Core\Controller\ControllerBase; | |
use Drupal\Core\Url; | |
use Drupal\views\ViewExecutable; | |
use Drupal\views\ViewEntityInterface; | |
use Drupal\views\Views; | |
use Drupal\views_ui\ViewUI; | |
use Drupal\views\ViewsData; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Drupal\Core\Ajax\AjaxResponse; | |
use Drupal\Core\Ajax\ReplaceCommand; | |
use Drupal\Component\Utility\Html; | |
/** | |
* Returns responses for Views UI routes. | |
*/ | |
class ViewsUIController extends ControllerBase { | |
/** | |
* Stores the Views data cache object. | |
* | |
* @var \Drupal\views\ViewsData | |
*/ | |
protected $viewsData; | |
/** | |
* Constructs a new \Drupal\views_ui\Controller\ViewsUIController object. | |
* | |
* @param \Drupal\views\ViewsData views_data | |
* The Views data cache object. | |
*/ | |
public function __construct(ViewsData $views_data) { | |
$this->viewsData = $views_data; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function create(ContainerInterface $container) { | |
return new static( | |
$container->get('views.views_data') | |
); | |
} | |
/** | |
* Lists all instances of fields on any views. | |
* | |
* @return array | |
* The Views fields report page. | |
*/ | |
public function reportFields() { | |
$views = $this->entityManager()->getStorage('view')->loadMultiple(); | |
// Fetch all fieldapi fields which are used in views | |
// Therefore search in all views, displays and handler-types. | |
$fields = array(); | |
$handler_types = ViewExecutable::getHandlerTypes(); | |
foreach ($views as $view) { | |
$executable = $view->getExecutable(); | |
$executable->initDisplay(); | |
foreach ($executable->displayHandlers as $display_id => $display) { | |
if ($executable->setDisplay($display_id)) { | |
foreach ($handler_types as $type => $info) { | |
foreach ($executable->getHandlers($type, $display_id) as $item) { | |
$table_data = $this->viewsData->get($item['table']); | |
if (isset($table_data[$item['field']]) && isset($table_data[$item['field']][$type]) | |
&& $field_data = $table_data[$item['field']][$type]) { | |
// The final check that we have a fieldapi field now. | |
if (isset($field_data['field_name'])) { | |
$fields[$field_data['field_name']][$view->id()] = $view->id(); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
$header = array(t('Field name'), t('Used in')); | |
$rows = array(); | |
foreach ($fields as $field_name => $views) { | |
$rows[$field_name]['data'][0]['data']['#plain_text'] = $field_name; | |
foreach ($views as $view) { | |
$rows[$field_name]['data'][1][] = $this->l($view, new Url('entity.view.edit_form', array('view' => $view))); | |
} | |
$item_list = [ | |
'#theme' => 'item_list', | |
'#items' => $rows[$field_name]['data'][1], | |
'#context' => ['list_style' => 'comma-list'], | |
]; | |
$rows[$field_name]['data'][1] = ['data' => $item_list]; | |
} | |
// Sort rows by field name. | |
ksort($rows); | |
$output = array( | |
'#type' => 'table', | |
'#header' => $header, | |
'#rows' => $rows, | |
'#empty' => t('No fields have been used in views yet.'), | |
); | |
return $output; | |
} | |
/** | |
* Lists all plugins and what enabled Views use them. | |
* | |
* @return array | |
* The Views plugins report page. | |
*/ | |
public function reportPlugins() { | |
$rows = Views::pluginList(); | |
foreach ($rows as &$row) { | |
$views = []; | |
// Link each view name to the view itself. | |
foreach ($row['views'] as $row_name => $view) { | |
$views[] = $this->l($view, new Url('entity.view.edit_form', array('view' => $view))); | |
} | |
unset($row['views']); | |
$row['views']['data'] = [ | |
'#theme' => 'item_list', | |
'#items' => $views, | |
'#context' => ['list_style' => 'comma-list'], | |
]; | |
} | |
// Sort rows by field name. | |
ksort($rows); | |
return array( | |
'#type' => 'table', | |
'#header' => array(t('Type'), t('Name'), t('Provided by'), t('Used in')), | |
'#rows' => $rows, | |
'#empty' => t('There are no enabled views.'), | |
); | |
} | |
/** | |
* Calls a method on a view and reloads the listing page. | |
* | |
* @param \Drupal\views\ViewEntityInterface $view | |
* The view being acted upon. | |
* @param string $op | |
* The operation to perform, e.g., 'enable' or 'disable'. | |
* @param \Symfony\Component\HttpFoundation\Request $request | |
* The current request. | |
* | |
* @return \Drupal\Core\Ajax\AjaxResponse|\Symfony\Component\HttpFoundation\RedirectResponse | |
* Either returns a rebuilt listing page as an AJAX response, or redirects | |
* back to the listing page. | |
* | |
*/ | |
public function ajaxOperation(ViewEntityInterface $view, $op, Request $request) { | |
// Perform the operation. | |
$view->$op()->save(); | |
// If the request is via AJAX, return the rendered list as JSON. | |
if ($request->request->get('js')) { | |
$list = $this->entityManager()->getListBuilder('view')->render(); | |
$response = new AjaxResponse(); | |
$response->addCommand(new ReplaceCommand('#views-entity-list', $list)); | |
return $response; | |
} | |
// Otherwise, redirect back to the page. | |
return $this->redirect('entity.view.collection'); | |
} | |
/** | |
* Menu callback for Views tag autocompletion. | |
* | |
* Like other autocomplete functions, this function inspects the 'q' query | |
* parameter for the string to use to search for suggestions. | |
* | |
* @return \Symfony\Component\HttpFoundation\JsonResponse | |
* A JSON response containing the autocomplete suggestions for Views tags. | |
*/ | |
public function autocompleteTag(Request $request) { | |
$matches = array(); | |
$string = $request->query->get('q'); | |
// Get matches from default views. | |
$views = $this->entityManager()->getStorage('view')->loadMultiple(); | |
// Keep track of previously processed tags so they can be skipped. | |
$tags = []; | |
foreach ($views as $view) { | |
$tag = $view->get('tag'); | |
if ($tag && !in_array($tag, $tags)) { | |
$tags[] = $tag; | |
if (strpos($tag, $string) === 0) { | |
$matches[] = ['value' => $tag, 'label' => Html::escape($tag)]; | |
if (count($matches) >= 10) { | |
break; | |
} | |
} | |
} | |
} | |
return new JsonResponse($matches); | |
} | |
/** | |
* Returns the form to edit a view. | |
* | |
* @param \Drupal\views_ui\ViewUI $view | |
* The view to be edited. | |
* @param string|null $display_id | |
* (optional) The display ID being edited. Defaults to NULL, which will load | |
* the first available display. | |
* | |
* @return array | |
* An array containing the Views edit and preview forms. | |
*/ | |
public function edit(ViewUI $view, $display_id = NULL) { | |
$name = $view->label(); | |
$data = $this->viewsData->get($view->get('base_table')); | |
if (isset($data['table']['base']['title'])) { | |
$name .= ' (' . $data['table']['base']['title'] . ')'; | |
} | |
$build['#title'] = $name; | |
$build['edit'] = $this->entityFormBuilder()->getForm($view, 'edit', array('display_id' => $display_id)); | |
$build['preview'] = $this->entityFormBuilder()->getForm($view, 'preview', array('display_id' => $display_id)); | |
return $build; | |
} | |
} |