/** * Tests filling in the wizard with really long strings. */ public function testWizardFieldLength() { $view = array(); $view['label'] = $this->randomMachineName(256); $view['id'] = strtolower($this->randomMachineName(129)); $view['page[create]'] = TRUE; $view['page[path]'] = $this->randomMachineName(255); $view['page[title]'] = $this->randomMachineName(256); $view['page[feed]'] = TRUE; $view['page[feed_properties][path]'] = $this->randomMachineName(255); $view['block[create]'] = TRUE; $view['block[title]'] = $this->randomMachineName(256); $this->drupalPostForm('admin/structure/views/add', $view, t('Save and edit')); $this->assertText('Machine-readable name cannot be longer than 128 characters but is currently 129 characters long.'); $this->assertText('Path cannot be longer than 254 characters but is currently 255 characters long.'); $this->assertText('Page title cannot be longer than 255 characters but is currently 256 characters long.'); $this->assertText('View name cannot be longer than 255 characters but is currently 256 characters long.'); $this->assertText('Feed path cannot be longer than 254 characters but is currently 255 characters long.'); $this->assertText('Block title cannot be longer than 255 characters but is currently 256 characters long.'); $view['label'] = $this->randomMachineName(255); $view['id'] = strtolower($this->randomMachineName(128)); $view['page[create]'] = TRUE; $view['page[path]'] = $this->randomMachineName(254); $view['page[title]'] = $this->randomMachineName(255); $view['page[feed]'] = TRUE; $view['page[feed_properties][path]'] = $this->randomMachineName(254); $view['block[create]'] = TRUE; $view['block[title]'] = $this->randomMachineName(255); $this->drupalPostForm('admin/structure/views/add', $view, t('Save and edit')); $this->assertUrl('admin/structure/views/view/' . $view['id'], array(), 'Make sure the view saving was successful and the browser got redirected to the edit page.'); // Assert that the page title is correctly truncated. $this->assertText(views_ui_truncate($view['page[title]'], 32)); }
/** * {@inheritdoc} */ public function optionsSummary(&$categories, &$options) { parent::optionsSummary($categories, $options); $categories['display_test'] = array('title' => $this->t('Display test settings'), 'column' => 'second', 'build' => array('#weight' => -100)); $test_option = $this->getOption('test_option') ?: $this->t('Empty'); $options['test_option'] = array('category' => 'display_test', 'title' => $this->t('Test option'), 'value' => views_ui_truncate($test_option, 24)); }
/** * Overrides \Drupal\views\Plugin\views\display\DisplayPluginBase::optionsSummary(). */ public function optionsSummary(&$categories, &$options) { parent::optionsSummary($categories, $options); $menu = $this->getOption('menu'); if (!is_array($menu)) { $menu = array('type' => 'none'); } switch ($menu['type']) { case 'none': default: $menu_str = $this->t('No menu'); break; case 'normal': $menu_str = $this->t('Normal: @title', array('@title' => $menu['title'])); break; case 'tab': case 'default tab': $menu_str = $this->t('Tab: @title', array('@title' => $menu['title'])); break; } $options['menu'] = array('category' => 'page', 'title' => $this->t('Menu'), 'value' => views_ui_truncate($menu_str, 24)); // This adds a 'Settings' link to the style_options setting if the style // has options. if ($menu['type'] == 'default tab') { $options['menu']['setting'] = $this->t('Parent menu item'); $options['menu']['links']['tab_options'] = $this->t('Change settings for the parent menu'); } }
/** * {@inheritdoc} */ public function optionsSummary(&$categories, &$options) { $categories = array('title' => array('title' => $this->t('Title'), 'column' => 'first'), 'format' => array('title' => $this->t('Format'), 'column' => 'first'), 'filters' => array('title' => $this->t('Filters'), 'column' => 'first'), 'fields' => array('title' => $this->t('Fields'), 'column' => 'first'), 'pager' => array('title' => $this->t('Pager'), 'column' => 'second'), 'language' => array('title' => $this->t('Language'), 'column' => 'second'), 'exposed' => array('title' => $this->t('Exposed form'), 'column' => 'third', 'build' => array('#weight' => 1)), 'access' => array('title' => '', 'column' => 'second', 'build' => array('#weight' => -5)), 'other' => array('title' => $this->t('Other'), 'column' => 'third', 'build' => array('#weight' => 2))); if ($this->display['id'] != 'default') { $options['display_id'] = array('category' => 'other', 'title' => $this->t('Machine Name'), 'value' => !empty($this->display['new_id']) ? $this->display['new_id'] : $this->display['id'], 'desc' => $this->t('Change the machine name of this display.')); } $display_comment = views_ui_truncate($this->getOption('display_comment'), 80); $options['display_comment'] = array('category' => 'other', 'title' => $this->t('Administrative comment'), 'value' => !empty($display_comment) ? $display_comment : $this->t('None'), 'desc' => $this->t('Comment or document this display.')); $title = strip_tags($this->getOption('title')); if (!$title) { $title = $this->t('None'); } $options['title'] = array('category' => 'title', 'title' => $this->t('Title'), 'value' => views_ui_truncate($title, 32), 'desc' => $this->t('Change the title that this display will use.')); $style_plugin_instance = $this->getPlugin('style'); $style_summary = empty($style_plugin_instance->definition['title']) ? $this->t('Missing style plugin') : $style_plugin_instance->summaryTitle(); $style_title = empty($style_plugin_instance->definition['title']) ? $this->t('Missing style plugin') : $style_plugin_instance->pluginTitle(); $options['style'] = array('category' => 'format', 'title' => $this->t('Format'), 'value' => $style_title, 'setting' => $style_summary, 'desc' => $this->t('Change the way content is formatted.')); // This adds a 'Settings' link to the style_options setting if the style has // options. if ($style_plugin_instance->usesOptions()) { $options['style']['links']['style_options'] = $this->t('Change settings for this format'); } if ($style_plugin_instance->usesRowPlugin()) { $row_plugin_instance = $this->getPlugin('row'); $row_summary = empty($row_plugin_instance->definition['title']) ? $this->t('Missing row plugin') : $row_plugin_instance->summaryTitle(); $row_title = empty($row_plugin_instance->definition['title']) ? $this->t('Missing row plugin') : $row_plugin_instance->pluginTitle(); $options['row'] = array('category' => 'format', 'title' => $this->t('Show'), 'value' => $row_title, 'setting' => $row_summary, 'desc' => $this->t('Change the way each row in the view is styled.')); // This adds a 'Settings' link to the row_options setting if the row style // has options. if ($row_plugin_instance->usesOptions()) { $options['row']['links']['row_options'] = $this->t('Change settings for this style'); } } if ($this->usesAJAX()) { $options['use_ajax'] = array('category' => 'other', 'title' => $this->t('Use AJAX'), 'value' => $this->getOption('use_ajax') ? $this->t('Yes') : $this->t('No'), 'desc' => $this->t('Change whether or not this display will use AJAX.')); } if ($this->usesAttachments()) { $options['hide_attachment_summary'] = array('category' => 'other', 'title' => $this->t('Hide attachments in summary'), 'value' => $this->getOption('hide_attachment_summary') ? $this->t('Yes') : $this->t('No'), 'desc' => $this->t('Change whether or not to display attachments when displaying a contextual filter summary.')); } if (!isset($this->definition['contextual links locations']) || !empty($this->definition['contextual links locations'])) { $options['show_admin_links'] = array('category' => 'other', 'title' => $this->t('Contextual links'), 'value' => $this->getOption('show_admin_links') ? $this->t('Shown') : $this->t('Hidden'), 'desc' => $this->t('Change whether or not to display contextual links for this view.')); } $pager_plugin = $this->getPlugin('pager'); if (!$pager_plugin) { // Default to the no pager plugin. $pager_plugin = Views::pluginManager('pager')->createInstance('none'); } $pager_str = $pager_plugin->summaryTitle(); $options['pager'] = array('category' => 'pager', 'title' => $this->t('Use pager'), 'value' => $pager_plugin->pluginTitle(), 'setting' => $pager_str, 'desc' => $this->t("Change this display's pager setting.")); // If pagers aren't allowed, change the text of the item. if (!$this->usesPager()) { $options['pager']['title'] = $this->t('Items to display'); } if ($pager_plugin->usesOptions()) { $options['pager']['links']['pager_options'] = $this->t('Change settings for this pager type.'); } if ($this->usesMore()) { $options['use_more'] = array('category' => 'pager', 'title' => $this->t('More link'), 'value' => $this->getOption('use_more') ? $this->t('Yes') : $this->t('No'), 'desc' => $this->t('Specify whether this display will provide a "more" link.')); } $this->view->initQuery(); if ($this->view->query->getAggregationInfo()) { $options['group_by'] = array('category' => 'other', 'title' => $this->t('Use aggregation'), 'value' => $this->getOption('group_by') ? $this->t('Yes') : $this->t('No'), 'desc' => $this->t('Allow grouping and aggregation (calculation) of fields.')); } $options['query'] = array('category' => 'other', 'title' => $this->t('Query settings'), 'value' => $this->t('Settings'), 'desc' => $this->t('Allow to set some advanced settings for the query plugin')); if (\Drupal::languageManager()->isMultilingual() && $this->isBaseTableTranslatable()) { $rendering_language_options = $this->buildRenderingLanguageOptions(); $options['rendering_language'] = array('category' => 'language', 'title' => $this->t('Rendering Language'), 'value' => $rendering_language_options[$this->getOption('rendering_language')], 'desc' => $this->t('All content that supports translations will be displayed in the selected language.')); } $access_plugin = $this->getPlugin('access'); if (!$access_plugin) { // Default to the no access control plugin. $access_plugin = Views::pluginManager('access')->createInstance('none'); } $access_str = $access_plugin->summaryTitle(); $options['access'] = array('category' => 'access', 'title' => $this->t('Access'), 'value' => $access_plugin->pluginTitle(), 'setting' => $access_str, 'desc' => $this->t('Specify access control type for this display.')); if ($access_plugin->usesOptions()) { $options['access']['links']['access_options'] = $this->t('Change settings for this access type.'); } $cache_plugin = $this->getPlugin('cache'); if (!$cache_plugin) { // Default to the no cache control plugin. $cache_plugin = Views::pluginManager('cache')->createInstance('none'); } $cache_str = $cache_plugin->summaryTitle(); $options['cache'] = array('category' => 'other', 'title' => $this->t('Caching'), 'value' => $cache_plugin->pluginTitle(), 'setting' => $cache_str, 'desc' => $this->t('Specify caching type for this display.')); if ($cache_plugin->usesOptions()) { $options['cache']['links']['cache_options'] = $this->t('Change settings for this caching type.'); } if ($access_plugin->usesOptions()) { $options['access']['links']['access_options'] = $this->t('Change settings for this access type.'); } if ($this->usesLinkDisplay()) { $link_display_option = $this->getOption('link_display'); $link_display = $this->t('None'); if ($link_display_option == 'custom_url') { $link_display = $this->t('Custom URL'); } elseif (!empty($link_display_option)) { $display_id = $this->getLinkDisplay(); $displays = $this->view->storage->get('display'); if (!empty($displays[$display_id])) { $link_display = $displays[$display_id]['display_title']; } } $options['link_display'] = array('category' => 'pager', 'title' => $this->t('Link display'), 'value' => $link_display, 'desc' => $this->t('Specify which display or custom URL this display will link to.')); } if ($this->usesExposedFormInBlock()) { $options['exposed_block'] = array('category' => 'exposed', 'title' => $this->t('Exposed form in block'), 'value' => $this->getOption('exposed_block') ? $this->t('Yes') : $this->t('No'), 'desc' => $this->t('Allow the exposed form to appear in a block instead of the view.')); } $exposed_form_plugin = $this->getPlugin('exposed_form'); if (!$exposed_form_plugin) { // Default to the no cache control plugin. $exposed_form_plugin = Views::pluginManager('exposed_form')->createInstance('basic'); } $exposed_form_str = $exposed_form_plugin->summaryTitle(); $options['exposed_form'] = array('category' => 'exposed', 'title' => $this->t('Exposed form style'), 'value' => $exposed_form_plugin->pluginTitle(), 'setting' => $exposed_form_str, 'desc' => $this->t('Select the kind of exposed filter to use.')); if ($exposed_form_plugin->usesOptions()) { $options['exposed_form']['links']['exposed_form_options'] = $this->t('Exposed form settings for this exposed form style.'); } $css_class = trim($this->getOption('css_class')); if (!$css_class) { $css_class = $this->t('None'); } $options['css_class'] = array('category' => 'other', 'title' => $this->t('CSS class'), 'value' => $css_class, 'desc' => $this->t('Change the CSS class name(s) that will be added to this display.')); foreach ($this->extenders as $extender) { $extender->optionsSummary($categories, $options); } }
/** * Provide the summary for page options in the views UI. * * This output is returned as an array. */ public function optionsSummary(&$categories, &$options) { parent::optionsSummary($categories, $options); $categories['block'] = array('title' => $this->t('Block settings'), 'column' => 'second', 'build' => array('#weight' => -10)); $block_description = strip_tags($this->getOption('block_description')); if (empty($block_description)) { $block_description = $this->t('None'); } $block_category = $this->getOption('block_category'); $options['block_description'] = array('category' => 'block', 'title' => $this->t('Block name'), 'value' => views_ui_truncate($block_description, 24)); $options['block_category'] = array('category' => 'block', 'title' => $this->t('Block category'), 'value' => views_ui_truncate($block_category, 24)); $filtered_allow = array_filter($this->getOption('allow')); $options['allow'] = array('category' => 'block', 'title' => $this->t('Allow settings'), 'value' => empty($filtered_allow) ? $this->t('None') : $this->t('Items per page')); $options['block_hide_empty'] = array('category' => 'other', 'title' => $this->t('Hide block if the view output is empty'), 'value' => $this->getOption('block_hide_empty') ? $this->t('Yes') : $this->t('No')); }
/** * Overrides \Drupal\views\Plugin\views\display\DisplayPluginBase::optionsSummary(). */ public function optionsSummary(&$categories, &$options) { parent::optionsSummary($categories, $options); $categories['page'] = array('title' => $this->t('Page settings'), 'column' => 'second', 'build' => array('#weight' => -10)); $path = strip_tags($this->getOption('path')); if (empty($path)) { $path = $this->t('No path is set'); } else { $path = '/' . $path; } $options['path'] = array('category' => 'page', 'title' => $this->t('Path'), 'value' => views_ui_truncate($path, 24)); }
/** * Placeholder function for overriding $display['display_title']. * * @todo Remove this function once editing the display title is possible. */ public function getDisplayLabel(ViewUI $view, $display_id, $check_changed = TRUE) { $display = $view->get('display'); $title = $display_id == 'default' ? $this->t('Master') : $display[$display_id]['display_title']; $title = views_ui_truncate($title, 25); if ($check_changed && !empty($view->changed_display[$display_id])) { $changed = '*'; $title = $title . $changed; } return $title; }
/** * Ensures that no XSS is possible for buttons. */ public function testDisplayTitleInButtonsXss() { $xss_markup = '"><script>alert(123)</script>'; $view = $this->randomView(); $view = View::load($view['id']); \Drupal::configFactory()->getEditable('views.settings')->set('ui.show.master_display', TRUE)->save(); foreach ([$xss_markup, '"><script>alert(123)</script>'] as $input) { $display =& $view->getDisplay('page_1'); $display['display_title'] = $input; $view->save(); $this->drupalGet("admin/structure/views/view/{$view->id()}"); $escaped = views_ui_truncate($input, 25); $this->assertEscaped($escaped); $this->assertNoRaw($xss_markup); $this->drupalGet("admin/structure/views/view/{$view->id()}/edit/page_1"); $this->assertEscaped("View {$escaped}"); $this->assertNoRaw("View {$xss_markup}"); $this->assertEscaped("Duplicate {$escaped}"); $this->assertNoRaw("Duplicate {$xss_markup}"); $this->assertEscaped("Delete {$escaped}"); $this->assertNoRaw("Delete {$xss_markup}"); } }
/** * {@inheritdoc} */ public function optionsSummary(&$categories, &$options) { parent::optionsSummary($categories, $options); // Authentication. $auth = $this->getOption('auth') ? implode(', ', $this->getOption('auth')) : $this->t('No authentication is set'); unset($categories['page'], $categories['exposed']); // Hide some settings, as they aren't useful for pure data output. unset($options['show_admin_links'], $options['analyze-theme']); $categories['path'] = array('title' => $this->t('Path settings'), 'column' => 'second', 'build' => array('#weight' => -10)); $options['path']['category'] = 'path'; $options['path']['title'] = $this->t('Path'); $options['auth'] = array('category' => 'path', 'title' => $this->t('Authentication'), 'value' => views_ui_truncate($auth, 24)); // Remove css/exposed form settings, as they are not used for the data // display. unset($options['exposed_form']); unset($options['exposed_block']); unset($options['css_class']); }