Commit bbcc4623 authored by alexpott's avatar alexpott

Issue #2381973 by Gábor Hojtsy, vijaycs85, dawehner: View wizard creates...

Issue #2381973 by Gábor Hojtsy, vijaycs85, dawehner: View wizard creates 'invalid' views out of the box, missing plugin_ids, insecure permissions
parent ec465933
# Schema for the views plugins of the Aggregator module.
"views.row.entity:aggregator_feed":
type: views_entity_row
label: 'Entity options'
"views.row.entity:aggregator_item":
type: views_entity_row
label: 'Entity options'
views.argument.aggregator_fid:
type: views.argument.numeric
label: 'Aggregator feed ID'
......
......@@ -98,20 +98,6 @@ views.filter.comment_user_uid:
type: views_filter
label: 'Node user posted comment'
"views.row.entity:comment":
type: mapping
label: 'Entity options'
mapping:
view_mode:
type: string
label: 'View mode'
relationship:
type: string
label: 'Relationship'
links:
type: boolean
label: 'Display links'
views.row.comment_rss:
type: views_row
label: 'Comment'
......@@ -119,9 +105,6 @@ views.row.comment_rss:
view_mode:
type: string
label: 'Display type'
links:
type: boolean
label: 'Display links'
views.sort.comment_ces_last_comment_name:
type: views_sort
......
......@@ -43,6 +43,7 @@ class Comment extends WizardPluginBase {
'alter_text' => TRUE,
'text' => 'comment/[cid]#comment-[cid]'
),
'plugin_id' => 'comment',
);
/**
......@@ -53,15 +54,15 @@ class Comment extends WizardPluginBase {
'value' => TRUE,
'table' => 'comment_field_data',
'field' => 'status',
'provider' => 'comment'
'plugin_id' => 'boolean',
),
'status_node' => array(
'value' => TRUE,
'table' => 'node_field_data',
'field' => 'status',
'provider' => 'node',
'plugin_id' => 'boolean',
'relationship' => 'node',
)
),
);
/**
......@@ -74,31 +75,6 @@ protected function rowStyleOptions() {
return $options;
}
protected function buildFormStyle(array &$form, FormStateInterface $form_state, $type) {
parent::buildFormStyle($form, $form_state, $type);
$style_form =& $form['displays'][$type]['options']['style'];
// Some style plugins don't support row plugins so stop here if that's the
// case.
if (!isset($style_form['row_plugin']['#default_value'])) {
return;
}
$row_plugin = $style_form['row_plugin']['#default_value'];
switch ($row_plugin) {
case 'comment':
$style_form['row_options']['links'] = array(
'#type' => 'select',
'#title' => $this->t('Should links be displayed below each comment'),
'#title_display' => 'invisible',
'#options' => array(
1 => $this->t('with links (allow users to reply to the comment, etc.)'),
0 => $this->t('without links'),
),
'#default_value' => 1,
);
break;
}
}
/**
* {@inheritdoc}
*/
......@@ -128,7 +104,6 @@ protected function display_options_row(&$display_options, $row_plugin, $row_opt
switch ($row_plugin) {
case 'comment':
$display_options['row']['type'] = 'entity:comment';
$display_options['row']['options']['links'] = !empty($row_options['links']);
break;
}
}
......@@ -168,6 +143,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['subject']['hide_empty'] = 0;
$display_options['fields']['subject']['empty_zero'] = 0;
$display_options['fields']['subject']['link_to_comment'] = 1;
$display_options['fields']['subject']['plugin_id'] = 'comment';
return $display_options;
}
......
......@@ -33,7 +33,8 @@ class File extends WizardPluginBase {
'table' => 'file_managed',
'field' => 'uri',
'exclude' => TRUE,
'file_download_path' => TRUE
'file_download_path' => TRUE,
'plugin_id' => 'file_uri',
);
/**
......@@ -64,6 +65,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['filename']['hide_empty'] = 0;
$display_options['fields']['filename']['empty_zero'] = 0;
$display_options['fields']['filename']['link_to_file'] = 1;
$display_options['fields']['filename']['plugin_id'] = 'file';
return $display_options;
}
......
......@@ -153,7 +153,6 @@ display:
type: 'entity:node'
options:
view_mode: teaser
comments: false
header: { }
footer: { }
empty: { }
......
......@@ -182,8 +182,6 @@ display:
row:
type: 'entity:node'
options:
build_mode: teaser
comments: false
view_mode: teaser
sorts:
sticky:
......
# Schema for the views plugins of the Node module.
"views.row.entity:node":
type: views_entity_row
label: 'Entity options'
mapping:
comments:
type: boolean
label: 'Show comments'
build_mode:
type: string
label: 'Build mode'
views.area.node_listing_empty:
type: views_area
label: 'Node link'
......@@ -157,7 +146,7 @@ views.field.node_path:
label: 'Use absolute link (begins with "http://")'
views.field.node_revision:
type: views_field
type: views.field.node
label: 'Node revision'
mapping:
link_to_node_revision:
......@@ -234,8 +223,8 @@ views.filter_value.node_status:
label: 'Status'
views.row.node_rss:
type: "views.row.entity:node"
label: 'Content'
type: views_row
label: 'Content options'
mapping:
view_mode:
type: string
......
......@@ -42,7 +42,8 @@ class Node extends WizardPluginBase {
'alter' => array(
'alter_text' => TRUE,
'text' => 'node/[nid]'
)
),
'plugin_id' => 'node',
);
/**
......@@ -53,7 +54,7 @@ class Node extends WizardPluginBase {
'value' => TRUE,
'table' => 'node_field_data',
'field' => 'status',
'provider' => 'node'
'plugin_id' => 'boolean'
)
);
......@@ -82,42 +83,6 @@ protected function rowStyleOptions() {
return $options;
}
/**
* Adds the style options to the wizard form.
*
* @param array $form
* The full wizard form array.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the wizard form.
* @param string $type
* The display ID (e.g. 'page' or 'block').
*/
protected function buildFormStyle(array &$form, FormStateInterface $form_state, $type) {
parent::buildFormStyle($form, $form_state, $type);
$style_form =& $form['displays'][$type]['options']['style'];
// Some style plugins don't support row plugins so stop here if that's the
// case.
if (!isset($style_form['row_plugin']['#default_value'])) {
return;
}
$row_plugin = $style_form['row_plugin']['#default_value'];
switch ($row_plugin) {
case 'full_posts':
case 'teasers':
$style_form['row_options']['links'] = array(
'#type' => 'select',
'#title' => $this->t('Should links be displayed below each node'),
'#title_display' => 'invisible',
'#options' => array(
1 => $this->t('with links (allow users to add comments, etc.)'),
0 => $this->t('without links'),
),
'#default_value' => 1,
);
break;
}
}
/**
* Overrides Drupal\views\Plugin\views\wizard\WizardPluginBase::defaultDisplayOptions().
*/
......@@ -148,6 +113,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['title']['hide_empty'] = 0;
$display_options['fields']['title']['empty_zero'] = 0;
$display_options['fields']['title']['link_to_node'] = 1;
$display_options['fields']['title']['plugin_id'] = 'node';
return $display_options;
}
......@@ -165,7 +131,8 @@ protected function defaultDisplayFiltersUser(array $form, FormStateInterface $fo
'table' => 'taxonomy_index',
'field' => 'tid',
'value' => $tids,
'vocabulary' => $form_state->getValue(array('show', 'tagged_with', 'vocabulary')),
'vid' => $form_state->getValue(array('show', 'tagged_with', 'vocabulary')),
'plugin_id' => 'taxonomy_index_tid',
);
// If the user entered more than one valid term in the autocomplete
// field, they probably intended both of them to be applied.
......@@ -209,21 +176,20 @@ protected function display_options_row(&$display_options, $row_plugin, $row_opt
switch ($row_plugin) {
case 'full_posts':
$display_options['row']['type'] = 'entity:node';
$display_options['row']['options']['build_mode'] = 'full';
$display_options['row']['options']['links'] = !empty($row_options['links']);
$display_options['row']['options']['view_mode'] = 'full';
break;
case 'teasers':
$display_options['row']['type'] = 'entity:node';
$display_options['row']['options']['build_mode'] = 'teaser';
$display_options['row']['options']['links'] = !empty($row_options['links']);
$display_options['row']['options']['view_mode'] = 'teaser';
break;
case 'titles_linked':
$display_options['row']['type'] = 'fields';
$display_options['field']['title']['link_to_node'] = 1;
break;
case 'titles':
$display_options['row']['type'] = 'fields';
$display_options['field']['title']['link_to_node'] = 0;
$display_options['fields']['title']['id'] = 'title';
$display_options['fields']['title']['table'] = 'node_field_data';
$display_options['fields']['title']['field'] = 'title';
$display_options['fields']['title']['link_to_node'] = ($row_plugin == 'titles_linked');
$display_options['fields']['title']['plugin_id'] = 'node';
break;
}
}
......
......@@ -40,7 +40,8 @@ class NodeRevision extends WizardPluginBase {
'alter' => array(
'alter_text' => TRUE,
'text' => 'node/[nid]/revisions/[vid]/view'
)
),
'plugin_id' => 'node_revision',
);
/**
......@@ -52,7 +53,8 @@ class NodeRevision extends WizardPluginBase {
'table' => 'node',
'field' => 'nid',
'exclude' => TRUE,
'link_to_node' => FALSE
'link_to_node' => FALSE,
'plugin_id' => 'node',
)
);
......@@ -64,7 +66,7 @@ class NodeRevision extends WizardPluginBase {
'value' => TRUE,
'table' => 'node_field_revision',
'field' => 'status',
'provider' => 'node'
'plugin_id' => 'boolean'
)
);
......@@ -88,7 +90,7 @@ protected function defaultDisplayOptions() {
// Add permission-based access control.
$display_options['access']['type'] = 'perm';
$display_options['access']['perm'] = 'view revisions';
$display_options['access']['options']['perm'] = 'view revisions';
// Remove the default fields, since we are customizing them here.
unset($display_options['fields']);
......@@ -107,6 +109,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['changed']['alter']['html'] = FALSE;
$display_options['fields']['changed']['hide_empty'] = FALSE;
$display_options['fields']['changed']['empty_zero'] = FALSE;
$display_options['fields']['changed']['plugin_id'] = 'date';
/* Field: Content revision: Title */
$display_options['fields']['title']['id'] = 'title';
......@@ -125,6 +128,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['title']['empty_zero'] = 0;
$display_options['fields']['title']['link_to_node'] = 0;
$display_options['fields']['title']['link_to_node_revision'] = 1;
$display_options['fields']['title']['plugin_id'] = 'node_revision';
return $display_options;
}
......
......@@ -54,8 +54,6 @@ display:
row:
type: 'entity:node'
options:
build_mode: teaser
comments: false
view_mode: teaser
style:
type: default
......
......@@ -54,8 +54,6 @@ display:
row:
type: 'entity:node'
options:
build_mode: teaser
links: false
view_mode: teaser
rendering_language: translation_language_renderer
fields:
......
......@@ -39,8 +39,7 @@ display:
type: views_query
row:
options:
build_mode: teaser
comments: false
view_mode: teaser
type: 'entity:node'
sorts: { }
style:
......
......@@ -4,10 +4,6 @@ views.display.rest_export:
type: views_display_path
label: 'REST display options'
views.row.data_entity:
type: views_row
label: 'Entity row'
views.row.data_field:
type: views_row
label: 'Field row'
......@@ -27,7 +23,7 @@ views.row.data_field:
label: 'Raw output for ID'
views.style.serializer:
type: viwes_style
type: views_style
label: 'Serialized output format'
mapping:
formats:
......
......@@ -24,7 +24,7 @@ views.filter.search:
label: 'On empty input'
views.row.search_view:
type: views.field.numeric
type: views_row
label: 'Source link'
mapping:
score:
......
......@@ -215,7 +215,6 @@ display:
type: 'entity:node'
options:
view_mode: teaser
comments: false
header:
entity_taxonomy_term:
id: entity_taxonomy_term
......
......@@ -31,7 +31,8 @@ class TaxonomyTerm extends WizardPluginBase {
'alter' => array(
'alter_text' => TRUE,
'text' => 'taxonomy/term/[tid]'
)
),
'plugin_id' => 'taxonomy',
);
/**
......@@ -62,6 +63,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['name']['hide_empty'] = 0;
$display_options['fields']['name']['empty_zero'] = 0;
$display_options['fields']['name']['link_to_taxonomy'] = 1;
$display_options['fields']['name']['plugin_id'] = 'taxonomy';
return $display_options;
}
......
......@@ -60,10 +60,6 @@ views.argument_default.node:
type: boolean
label: 'Content ID from URL'
"views.row.entity:user":
type: views_entity_row
label: 'Entity options'
views_field_user:
type: views_field
mapping:
......
......@@ -41,7 +41,8 @@ class Users extends WizardPluginBase {
'alter' => array(
'alter_text' => TRUE,
'text' => 'user/[uid]'
)
),
'plugin_id' => 'user',
);
/**
......@@ -52,7 +53,7 @@ class Users extends WizardPluginBase {
'value' => TRUE,
'table' => 'users_field_data',
'field' => 'status',
'provider' => 'user'
'plugin_id' => 'boolean',
)
);
......@@ -64,7 +65,7 @@ protected function defaultDisplayOptions() {
// Add permission-based access control.
$display_options['access']['type'] = 'perm';
$display_options['access']['perm'] = 'access user profiles';
$display_options['access']['options']['perm'] = 'access user profiles';
// Remove the default fields, since we are customizing them here.
unset($display_options['fields']);
......@@ -86,6 +87,7 @@ protected function defaultDisplayOptions() {
$display_options['fields']['name']['empty_zero'] = 0;
$display_options['fields']['name']['link_to_user'] = 1;
$display_options['fields']['name']['overwrite_anonymous'] = 0;
$display_options['fields']['name']['plugin_id'] = 'user_name';
return $display_options;
}
......
......@@ -823,7 +823,7 @@ views_query:
views_row:
type: mapping
label: 'Row'
label: 'Row options'
mapping:
relationship:
type: string
......@@ -835,6 +835,9 @@ views_entity_row:
view_mode:
type: string
label: 'View mode'
rendering_language:
type: string
label: 'Rendering language'
views_cache:
type: mapping
......
# Schema for the views row.
views.row.*:
type: views_row
"views.row.entity:*":
type: views_entity_row
label: 'Entity options'
views.row.fields:
type: views_row
label: 'Field options'
......@@ -21,7 +28,7 @@ views.row.fields:
label: 'Hide empty'
views.row.rss_fields:
type: mapping
type: views_row
label: 'RSS field options'
mapping:
title_field:
......
......@@ -114,3 +114,14 @@ views.view.*:
label: 'Position'
display_options:
type: views.display.[%parent.display_plugin]
block.settings.views_block:*:
type: block_settings
label: 'View block'
mapping:
views_label:
type: label
lable: 'Title'
items_per_page:
type: string
label: 'Items per block'
......@@ -171,6 +171,7 @@ public function blockSubmit($form, FormStateInterface $form_state) {
else {
$this->configuration['views_label'] = '';
}
$form_state->unsetValue('views_label_checkbox');
}
/**
......
......@@ -332,6 +332,7 @@ public function blockSubmit(ViewsBlock $block, $form, FormStateInterface $form_s
if ($items_per_page = $form_state->getValue(array('override', 'items_per_page'))) {
$block->setConfigurationValue('items_per_page', $items_per_page);
}
$form_state->unsetValue(array('override', 'items_per_page'));
}
/**
......
......@@ -848,9 +848,16 @@ protected function defaultDisplayOptions() {
// Add a least one field so the view validates and the user has a preview.
// The base field can provide a default in its base settings; otherwise,
// choose the first field with a field handler.
$data = Views::viewsData()->get($this->base_table);
$default_table = $this->base_table;
$data = Views::viewsData()->get($default_table);
if (isset($data['table']['base']['defaults']['field'])) {
$default_field = $data['table']['base']['defaults']['field'];
// If the table for the default field is different to the base table,
// load the view table data for this table.
if (isset($data['table']['base']['defaults']['table']) && $data['table']['base']['defaults']['table'] != $default_table) {
$default_table = $data['table']['base']['defaults']['table'];
$data = Views::viewsData()->get($default_table);
}
}
else {
foreach ($data as $default_field => $field_data) {
......@@ -860,15 +867,12 @@ protected function defaultDisplayOptions() {
}
}
$display_options['fields'][$default_field] = array(
'table' => $this->base_table,
'table' => $default_table,
'field' => $default_field,
'id' => $default_field,
'plugin_id' => $data[$default_field]['field']['id'],
);
// Load the plugin ID and module.
$base_field = $data['table']['base']['field'];
$display_options['fields'][$base_field]['plugin_id'] = $data[$base_field]['field']['id'];
return $display_options;
}
......@@ -951,6 +955,7 @@ protected function defaultDisplayFiltersUser(array $form, FormStateInterface $fo
'table' => $table,
'field' => $bundle_key,
'value' => $value,
'plugin_id' => $handler,
);
}
......@@ -1027,6 +1032,7 @@ protected function defaultDisplaySortsUser($form, FormStateInterface $form_state
'table' => $table,
'field' => $column,
'order' => $sort,
'plugin_id' => $data[$column]['sort']['id'],
);
}
}
......
......@@ -14,6 +14,15 @@
*/
abstract class WizardTestBase extends ViewTestBase {
/**
* Set to TRUE to strict check all configuration saved.
*
* @see \Drupal\Core\Config\Testing\ConfigSchemaChecker
*