2009-05-17 11:16:51 +00:00
<?php
/**
* @file
* Provide structure for the administrative interface to Views.
*/
2014-10-24 21:22:33 +00:00
use Drupal\Component\Utility\Unicode;
2014-06-30 03:33:08 +00:00
use Drupal\Core\Routing\RouteMatchInterface;
2014-10-09 06:39:37 +00:00
use Drupal\Core\Url;
2012-09-18 19:41:58 +00:00
use Drupal\views\ViewExecutable;
2012-09-26 20:02:06 +00:00
use Drupal\views\Analyzer;
2012-06-16 10:45:11 +00:00
2013-12-31 23:10:47 +00:00
/**
* Implements hook_help().
*/
2014-06-30 03:33:08 +00:00
function views_ui_help($route_name, RouteMatchInterface $route_match) {
2014-05-07 02:04:53 +00:00
switch ($route_name) {
case 'help.page.views_ui':
2013-12-31 23:10:47 +00:00
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
Issue #2560783 by stefan.r, joelpittet, lauriii, Cottser, Sutharsan, kgoel, justAChris, Gábor Hojtsy, dawehner, jhodgdon, effulgentsia, xjm, andypost, googletorp: Replace !placeholder with :placeholder for URLs in hook_help() implementations
2015-09-21 11:38:19 +00:00
$output .= '<p>' . t('The Views UI module provides an interface for managing views for the <a href=":views">Views module</a>. For more information, see the <a href=":handbook">online documentation for the Views UI module</a>.', array(':views' => \Drupal::url('help.page', array('name' => 'views')), ':handbook' => 'https://www.drupal.org/documentation/modules/views_ui')) . '</p>';
2013-12-31 23:10:47 +00:00
$output .= '<h3>' . t('Uses') . '</h3>';
$output .= '<dl>';
2015-10-06 18:33:04 +00:00
$output .= '<dt>' . t('Creating and managing views') . '</dt>';
Issue #2560783 by stefan.r, joelpittet, lauriii, Cottser, Sutharsan, kgoel, justAChris, Gábor Hojtsy, dawehner, jhodgdon, effulgentsia, xjm, andypost, googletorp: Replace !placeholder with :placeholder for URLs in hook_help() implementations
2015-09-21 11:38:19 +00:00
$output .= '<dd>' . t('Views can be created from the <a href=":list">Views list page</a> by using the "Add new view" action. Existing views can be managed from the <a href=":list">Views list page</a> by locating the view in the "Enabled" or "Disabled" list and selecting the desired operation action, for example "Edit".', array(':list' => \Drupal::url('entity.view.collection', array('name' => 'views_ui')))) . '</dd>';
2015-10-06 18:33:04 +00:00
$output .= '<dt>' . t('Enabling and disabling views') . '<dt>';
Issue #2560783 by stefan.r, joelpittet, lauriii, Cottser, Sutharsan, kgoel, justAChris, Gábor Hojtsy, dawehner, jhodgdon, effulgentsia, xjm, andypost, googletorp: Replace !placeholder with :placeholder for URLs in hook_help() implementations
2015-09-21 11:38:19 +00:00
$output .= '<dd>' . t('Views can be enabled or disabled from the <a href=":list">Views list page</a>. To enable a view, find the view within the "Disabled" list and select the "Enable" operation. To disable a view find the view within the "Enabled" list and select the "Disable" operation.', array(':list' => \Drupal::url('entity.view.collection', array('name' => 'views_ui')))) . '</dd>';
2015-10-06 18:33:04 +00:00
$output .= '<dt>' . t('Exporting and importing views') . '</dt>';
Issue #2560783 by stefan.r, joelpittet, lauriii, Cottser, Sutharsan, kgoel, justAChris, Gábor Hojtsy, dawehner, jhodgdon, effulgentsia, xjm, andypost, googletorp: Replace !placeholder with :placeholder for URLs in hook_help() implementations
2015-09-21 11:38:19 +00:00
$output .= '<dd>' . t('Views can be exported and imported as configuration files by using the <a href=":config">Configuration Manager module</a>.', array(':config' => (\Drupal::moduleHandler()->moduleExists('config')) ? \Drupal::url('help.page', array('name' => 'config')) : '#')) . '</dd>';
2013-12-31 23:10:47 +00:00
$output .= '</dl>';
return $output;
}
}
2013-05-03 17:25:44 +00:00
/**
2014-02-20 10:04:54 +00:00
* Implements hook_entity_type_build().
2013-05-03 17:25:44 +00:00
*/
2014-02-20 10:04:54 +00:00
function views_ui_entity_type_build(array &$entity_types) {
/** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
$entity_types['view']
2014-04-25 23:12:39 +00:00
->setFormClass('edit', 'Drupal\views_ui\ViewEditForm')
->setFormClass('add', 'Drupal\views_ui\ViewAddForm')
->setFormClass('preview', 'Drupal\views_ui\ViewPreviewForm')
2014-06-11 10:35:46 +00:00
->setFormClass('duplicate', 'Drupal\views_ui\ViewDuplicateForm')
2015-01-30 10:46:14 +00:00
->setFormClass('delete', 'Drupal\Core\Entity\EntityDeleteForm')
2014-01-22 07:32:29 +00:00
->setFormClass('break_lock', 'Drupal\views_ui\Form\BreakLockForm')
2014-03-23 22:25:46 +00:00
->setListBuilderClass('Drupal\views_ui\ViewListBuilder')
2015-01-13 10:32:23 +00:00
->setLinkTemplate('edit-form', '/admin/structure/views/view/{view}')
->setLinkTemplate('edit-display-form', '/admin/structure/views/view/{view}/edit/{display_id}')
->setLinkTemplate('preview-form', '/admin/structure/views/view/{view}/preview/{display_id}')
->setLinkTemplate('duplicate-form', '/admin/structure/views/view/{view}/duplicate')
->setLinkTemplate('delete-form', '/admin/structure/views/view/{view}/delete')
->setLinkTemplate('enable', '/admin/structure/views/view/{view}/enable')
->setLinkTemplate('disable', '/admin/structure/views/view/{view}/disable')
2015-01-19 09:37:11 +00:00
->setLinkTemplate('break-lock-form', '/admin/structure/views/view/{view}/break-lock')
->setLinkTemplate('collection', '/admin/structure/views');
2013-05-03 17:25:44 +00:00
}
2009-05-17 11:16:51 +00:00
/**
* Implements hook_theme().
*/
function views_ui_theme() {
return array(
// edit a view
'views_ui_display_tab_setting' => array(
'variables' => array('description' => '', 'link' => '', 'settings_links' => array(), 'overridden' => FALSE, 'defaulted' => FALSE, 'description_separator' => TRUE, 'class' => array()),
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
'views_ui_display_tab_bucket' => array(
'render element' => 'element',
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
'views_ui_rearrange_filter_form' => array(
'render element' => 'form',
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
'views_ui_expose_filter_form' => array(
'render element' => 'form',
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
// list views
'views_ui_view_info' => array(
2013-06-16 23:58:58 +00:00
'variables' => array('view' => NULL, 'displays' => NULL),
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
2012-08-17 15:09:47 +00:00
// Group of filters.
'views_ui_build_group_filter_form' => array(
'render element' => 'form',
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2012-08-17 15:09:47 +00:00
),
2009-05-17 11:16:51 +00:00
// On behalf of a plugin
'views_ui_style_plugin_table' => array(
'render element' => 'form',
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
// When previewing a view.
'views_ui_view_preview_section' => array(
'variables' => array('view' => NULL, 'section' => NULL, 'content' => NULL, 'links' => ''),
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
// Generic container wrapper, to use instead of theme_container when an id
// is not desired.
2012-09-30 21:53:21 +00:00
'views_ui_container' => array(
Issue #1915026 by steveoliver, 2ndmile, damiankloip, echeese, eromero1, joelpittet, rvilar, waynethayer, Hydra, drupalninja99, dsdeiz: Convert theme_views_ui_container() to Twig.
2013-07-25 14:08:22 +00:00
'variables' => array('children' => NULL, 'attributes' => array()),
2012-12-11 20:51:50 +00:00
'file' => 'views_ui.theme.inc',
2009-05-17 11:16:51 +00:00
),
);
}
/**
2013-10-03 20:55:34 +00:00
* Implements hook_preprocess_HOOK() for views templates.
2009-05-17 11:16:51 +00:00
*/
2013-07-13 10:29:57 +00:00
function views_ui_preprocess_views_view(&$variables) {
$view = $variables['view'];
2014-09-11 16:08:26 +00:00
// Render title for the admin preview.
if (!empty($view->live_preview)) {
2015-07-11 08:10:48 +00:00
$variables['title']['#markup'] = $view->getTitle();
2014-09-11 16:08:26 +00:00
}
2013-09-16 03:58:06 +00:00
if (!empty($view->live_preview) && \Drupal::moduleHandler()->moduleExists('contextual')) {
2013-04-20 03:41:20 +00:00
$view->setShowAdminLinks(FALSE);
2009-05-17 11:16:51 +00:00
foreach (array('title', 'header', 'exposed', 'rows', 'pager', 'more', 'footer', 'empty', 'attachment_after', 'attachment_before') as $section) {
2013-07-13 10:29:57 +00:00
if (!empty($variables[$section])) {
$variables[$section] = array(
2009-05-17 11:16:51 +00:00
'#theme' => 'views_ui_view_preview_section',
'#view' => $view,
'#section' => $section,
2013-07-13 10:29:57 +00:00
'#content' => $variables[$section],
2012-09-30 21:53:21 +00:00
'#theme_wrappers' => array('views_ui_container'),
2014-07-28 21:30:41 +00:00
'#attributes' => array('class' => array('contextual-region')),
2009-05-17 11:16:51 +00:00
);
}
}
}
}
/**
* Returns contextual links for each handler of a certain section.
*
* @TODO
* Bring in relationships
* Refactor this function to use much stuff of views_ui_edit_form_get_bucket.
*
* @param $title
* Add a bolded title of this section.
*/
2012-12-17 22:35:26 +00:00
function views_ui_view_preview_section_handler_links(ViewExecutable $view, $type, $title = FALSE) {
$display = $view->display_handler->display;
$handlers = $view->display_handler->getHandlers($type);
2009-05-17 11:16:51 +00:00
$links = array();
2014-03-25 19:52:54 +00:00
$types = ViewExecutable::getHandlerTypes();
2009-05-17 11:16:51 +00:00
if ($title) {
$links[$type . '-title'] = array(
'title' => $types[$type]['title'],
);
}
foreach ($handlers as $id => $handler) {
2012-09-03 18:44:24 +00:00
$field_name = $handler->adminLabel(TRUE);
2009-05-17 11:16:51 +00:00
$links[$type . '-edit-' . $id] = array(
'title' => t('Edit @section', array('@section' => $field_name)),
2014-10-09 06:39:37 +00:00
'url' => Url::fromRoute('views_ui.form_handler', ['js' => 'nojs', 'view' => $view->storage->id(), 'display_id' => $display['id'], 'type' => $type, 'id' => $id]),
2009-05-17 11:16:51 +00:00
'attributes' => array('class' => array('views-ajax-link')),
);
}
$links[$type . '-add'] = array(
'title' => t('Add new'),
2014-10-09 06:39:37 +00:00
'url' => Url::fromRoute('views_ui.form_add_handler', ['js' => 'nojs', 'view' => $view->storage->id(), 'display_id' => $display['id'], 'type' => $type]),
2009-05-17 11:16:51 +00:00
'attributes' => array('class' => array('views-ajax-link')),
);
return $links;
}
/**
* Returns a link to editing a certain display setting.
*/
2012-12-17 22:35:26 +00:00
function views_ui_view_preview_section_display_category_links(ViewExecutable $view, $type, $title) {
2009-05-17 11:16:51 +00:00
$display = $view->display_handler->display;
$links = array(
$type . '-edit' => array(
'title' => t('Edit @section', array('@section' => $title)),
2014-10-09 06:39:37 +00:00
'url' => Url::fromRoute('views_ui.form_display', ['js' => 'nojs', 'view' => $view->storage->id(), 'display_id' => $display['id'], 'type' => $type]),
2009-05-17 11:16:51 +00:00
'attributes' => array('class' => array('views-ajax-link')),
),
);
return $links;
}
/**
* Returns all contextual links for the main content part of the view.
*/
2012-12-17 22:35:26 +00:00
function views_ui_view_preview_section_rows_links(ViewExecutable $view) {
2009-05-17 11:16:51 +00:00
$links = array();
$links = array_merge($links, views_ui_view_preview_section_handler_links($view, 'filter', TRUE));
$links = array_merge($links, views_ui_view_preview_section_handler_links($view, 'field', TRUE));
$links = array_merge($links, views_ui_view_preview_section_handler_links($view, 'sort', TRUE));
$links = array_merge($links, views_ui_view_preview_section_handler_links($view, 'argument', TRUE));
$links = array_merge($links, views_ui_view_preview_section_handler_links($view, 'relationship', TRUE));
return $links;
}
/**
2012-10-04 20:27:16 +00:00
* Implements hook_views_plugins_display_alter().
2009-05-17 11:16:51 +00:00
*/
2012-10-04 20:27:16 +00:00
function views_ui_views_plugins_display_alter(&$plugins) {
2009-05-17 11:16:51 +00:00
// Attach contextual links to each display plugin. The links will point to
2013-01-19 05:10:42 +00:00
// paths underneath "admin/structure/views/view/{$view->id()}" (i.e., paths
2009-05-17 11:16:51 +00:00
// for editing and performing other contextual actions on the view).
2012-10-04 20:27:16 +00:00
foreach ($plugins as &$display) {
2014-08-29 06:53:38 +00:00
$display['contextual links']['entity.view.edit_form'] = array(
'route_name' => 'entity.view.edit_form',
2013-11-06 19:45:16 +00:00
'route_parameters_names' => array('view' => 'id'),
2009-05-17 11:16:51 +00:00
);
}
}
/**
* Implements hook_contextual_links_view_alter().
*/
function views_ui_contextual_links_view_alter(&$element, $items) {
// Remove contextual links from being rendered, when so desired, such as
// within a View preview.
if (views_ui_contextual_links_suppress()) {
$element['#links'] = array();
}
// Append the display ID to the Views UI edit links, so that clicking on the
// contextual link takes you directly to the correct display tab on the edit
// screen.
2014-08-29 06:53:38 +00:00
elseif (!empty($element['#links']['entityviewedit-form'])) {
$display_id = $items['entity.view.edit_form']['metadata']['display_id'];
2014-10-09 06:39:37 +00:00
$route_parameters = $element['#links']['entityviewedit-form']['url']->getRouteParameters() + ['display_id' => $display_id];
$element['#links']['entityviewedit-form']['url'] = Url::fromRoute('entity.view.edit_display_form', $route_parameters);
2009-05-17 11:16:51 +00:00
}
}
/**
* Sets a static variable for controlling whether contextual links are rendered.
*
* @see views_ui_contextual_links_view_alter()
*/
function views_ui_contextual_links_suppress($set = NULL) {
$suppress = &drupal_static(__FUNCTION__);
if (isset($set)) {
$suppress = $set;
}
return $suppress;
}
/**
* Increments the views_ui_contextual_links_suppress() static variable.
*
* When this function is added to the #pre_render of an element, and
* 'views_ui_contextual_links_suppress_pop' is added to the #post_render of the
* same element, then all contextual links within the element and its
* descendants are suppressed from being rendered. This is used, for example,
* during a View preview, when it is not desired for nodes in the Views result
* to have contextual links.
*
* @see views_ui_contextual_links_suppress_pop()
*/
function views_ui_contextual_links_suppress_push() {
views_ui_contextual_links_suppress(((int) views_ui_contextual_links_suppress())+1);
}
/**
* Decrements the views_ui_contextual_links_suppress() static variable.
*
* @see views_ui_contextual_links_suppress_push()
*/
function views_ui_contextual_links_suppress_pop() {
views_ui_contextual_links_suppress(((int) views_ui_contextual_links_suppress())-1);
}
2012-09-26 20:02:06 +00:00
/**
* Implements hook_views_analyze().
*
* This is the basic views analysis that checks for very minimal problems.
* There are other analysis tools in core specific sections, such as
* node.views.inc as well.
*/
2013-01-10 17:14:16 +00:00
function views_ui_views_analyze(ViewExecutable $view) {
2012-09-26 20:02:06 +00:00
$ret = array();
// Check for something other than the default display:
if (count($view->displayHandlers) < 2) {
$ret[] = Analyzer::formatMessage(t('This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display.'), 'warning');
}
// You can give a page display the same path as an alias existing in the
// system, so the alias will not work anymore. Report this to the user,
// because he probably wanted something else.
foreach ($view->displayHandlers as $display) {
if (empty($display)) {
continue;
}
if ($display->hasPath() && $path = $display->getOption('path')) {
2014-05-28 09:44:50 +00:00
$normal_path = \Drupal::service('path.alias_manager')->getPathByAlias($path);
2012-09-26 20:02:06 +00:00
if ($path != $normal_path) {
2013-01-10 17:14:16 +00:00
$ret[] = Analyzer::formatMessage(t('You have configured display %display with a path which is an path alias as well. This might lead to unwanted effects so better use an internal path.', array('%display' => $display->display['display_title'])), 'warning');
2012-09-26 20:02:06 +00:00
}
}
}
return $ret;
}
2009-05-17 11:16:51 +00:00
/**
2015-06-08 22:40:25 +00:00
* Truncate strings to a set length and provide a '...' if they truncated.
2009-05-17 11:16:51 +00:00
*
* This is often used in the UI to ensure long strings fit.
*/
function views_ui_truncate($string, $length) {
2014-11-05 09:24:11 +00:00
if (Unicode::strlen($string) > $length) {
2014-10-24 21:22:33 +00:00
$string = Unicode::substr($string, 0, $length);
2009-05-17 11:16:51 +00:00
$string .= '...';
}
return $string;
}