2015-08-17 17:00:26 -07:00
< ? php
/**
* @ file
* Preprocessors and theme functions for the Views UI .
*/
use Drupal\Component\Utility\SafeMarkup ;
use Drupal\Core\Form\FormState ;
use Drupal\Core\Render\Element ;
use Drupal\Core\Url ;
/**
* Prepares variables for Views UI display tab setting templates .
*
* Default template : views - ui - display - tab - setting . html . twig .
*
* @ param array $variables
* An associative array containing :
* - link : The setting ' s primary link .
* - settings_links : An array of links for this setting .
* - defaulted : A boolean indicating the setting is in its default state .
* - overridden : A boolean indicating the setting has been overridden from
* the default .
* - description : The setting ' s description .
* - description_separator : A boolean indicating a separator colon should be
* appended to the setting ' s description .
*/
function template_preprocess_views_ui_display_tab_setting ( & $variables ) {
// Put the primary link to the left side.
array_unshift ( $variables [ 'settings_links' ], $variables [ 'link' ]);
if ( ! empty ( $variables [ 'overridden' ])) {
$variables [ 'attributes' ][ 'title' ][] = t ( 'Overridden' );
}
// Append a colon to the description, if requested.
if ( $variables [ 'description' ] && $variables [ 'description_separator' ]) {
$variables [ 'description' ] .= t ( ':' );
}
}
/**
* Prepares variables for Views UI display tab bucket templates .
*
* Default template : views - ui - display - tab - bucket . html . twig .
*
* @ param array $variables
* An associative array containing :
* - element : An associative array containing the properties of the element .
* Properties used : #name, #overridden, #children, #title, #actions.
*/
function template_preprocess_views_ui_display_tab_bucket ( & $variables ) {
$element = $variables [ 'element' ];
if ( ! empty ( $element [ '#overridden' ])) {
$variables [ 'attributes' ][ 'title' ][] = t ( 'Overridden' );
}
$variables [ 'name' ] = isset ( $element [ '#name' ]) ? $element [ '#name' ] : NULL ;
$variables [ 'overridden' ] = isset ( $element [ '#overridden' ]) ? $element [ '#overridden' ] : NULL ;
$variables [ 'content' ] = $element [ '#children' ];
$variables [ 'title' ] = $element [ '#title' ];
$variables [ 'actions' ] = ! empty ( $element [ '#actions' ]) ? $element [ '#actions' ] : array ();
}
/**
2015-08-27 12:03:05 -07:00
* Prepares variables for Views UI build group filter form templates .
2015-08-17 17:00:26 -07:00
*
2015-08-27 12:03:05 -07:00
* Default template : views - ui - build - group - filter - form . html . twig .
*
* @ param array $variables
* An associative array containing :
* - form : A render element representing the form .
2015-08-17 17:00:26 -07:00
*/
2015-08-27 12:03:05 -07:00
function template_preprocess_views_ui_build_group_filter_form ( & $variables ) {
2015-08-17 17:00:26 -07:00
$form = $variables [ 'form' ];
2015-08-27 12:03:05 -07:00
// Prepare table of options.
2015-08-17 17:00:26 -07:00
$header = array (
t ( 'Default' ),
t ( 'Weight' ),
t ( 'Label' ),
t ( 'Operator' ),
t ( 'Value' ),
t ( 'Operations' ),
);
2015-08-27 12:03:05 -07:00
// Prepare default selectors.
2015-08-17 17:00:26 -07:00
$form_state = new FormState ();
$form [ 'default_group' ] = Element\Radios :: processRadios ( $form [ 'default_group' ], $form_state , $form );
$form [ 'default_group_multiple' ] = Element\Checkboxes :: processCheckboxes ( $form [ 'default_group_multiple' ], $form_state , $form );
$form [ 'default_group' ][ 'All' ][ '#title' ] = '' ;
$rows [] = array (
2015-08-27 12:03:05 -07:00
[ 'data' => $form [ 'default_group' ][ 'All' ]],
2015-08-17 17:00:26 -07:00
'' ,
array (
'data' => \Drupal :: config ( 'views.settings' ) -> get ( 'ui.exposed_filter_any_label' ) == 'old_any' ? t ( '<Any>' ) : t ( '- Any -' ),
'colspan' => 4 ,
'class' => array ( 'class' => 'any-default-radios-row' ),
),
);
2015-08-27 12:03:05 -07:00
// Remove the 'All' default_group form element because it's added to the
// table row.
unset ( $variables [ 'form' ][ 'default_group' ][ 'All' ]);
2015-08-17 17:00:26 -07:00
foreach ( Element :: children ( $form [ 'group_items' ]) as $group_id ) {
$form [ 'group_items' ][ $group_id ][ 'value' ][ '#title' ] = '' ;
$default = [
$form [ 'default_group' ][ $group_id ],
$form [ 'default_group_multiple' ][ $group_id ],
];
2015-08-27 12:03:05 -07:00
// Remove these fields from the form since they are moved into the table.
unset ( $variables [ 'form' ][ 'default_group' ][ $group_id ]);
unset ( $variables [ 'form' ][ 'default_group_multiple' ][ $group_id ]);
2015-08-17 17:00:26 -07:00
$link = [
'#type' => 'link' ,
'#url' => Url :: fromRoute ( '<none>' , [], [
'attributes' => [
'id' => 'views-remove-link-' . $group_id ,
'class' => [
'views-hidden' ,
'views-button-remove' ,
'views-groups-remove-link' ,
'views-remove-link' ,
],
'alt' => t ( 'Remove this item' ),
'title' => t ( 'Remove this item' ),
],
]),
'#title' => SafeMarkup :: format ( '<span>@text</span>' , [ '@text' => t ( 'Remove' )]),
];
$remove = [ $form [ 'group_items' ][ $group_id ][ 'remove' ], $link ];
$data = array (
'default' => [ 'data' => $default ],
2015-08-27 12:03:05 -07:00
'weight' => [ 'data' => $form [ 'group_items' ][ $group_id ][ 'weight' ]],
'title' => [ 'data' => $form [ 'group_items' ][ $group_id ][ 'title' ]],
'operator' => [ 'data' => $form [ 'group_items' ][ $group_id ][ 'operator' ]],
'value' => [ 'data' => $form [ 'group_items' ][ $group_id ][ 'value' ]],
2015-08-17 17:00:26 -07:00
'remove' => [ 'data' => $remove ],
);
$rows [] = array ( 'data' => $data , 'id' => 'views-row-' . $group_id , 'class' => array ( 'draggable' ));
}
2015-08-27 12:03:05 -07:00
$variables [ 'table' ] = array (
2015-08-17 17:00:26 -07:00
'#type' => 'table' ,
'#header' => $header ,
'#rows' => $rows ,
'#attributes' => array (
'class' => array ( 'views-filter-groups' ),
'id' => 'views-filter-groups' ,
),
'#tabledrag' => array (
array (
'action' => 'order' ,
'relationship' => 'sibling' ,
'group' => 'weight' ,
)
),
);
2015-08-27 12:03:05 -07:00
// Hide fields used in table.
unset ( $variables [ 'form' ][ 'group_items' ]);
2015-08-17 17:00:26 -07:00
}
/**
* Prepares variables for Views UI rearrange filter form templates .
*
* Default template : views - ui - rearrange - filter - form . html . twig .
*
* @ param array $variables
* An associative array containing :
* - form : A render element representing the form .
*/
function template_preprocess_views_ui_rearrange_filter_form ( & $variables ) {
$form = & $variables [ 'form' ];
$rows = $ungroupable_rows = array ();
// Enable grouping only if > 1 group.
$variables [ 'grouping' ] = count ( array_keys ( $form [ '#group_options' ])) > 1 ;
foreach ( $form [ '#group_renders' ] as $group_id => $contents ) {
// Header row for the group.
if ( $group_id !== 'ungroupable' ) {
// Set up tabledrag so that it changes the group dropdown when rows are
// dragged between groups.
$options = array (
'table_id' => 'views-rearrange-filters' ,
'action' => 'match' ,
'relationship' => 'sibling' ,
'group' => 'views-group-select' ,
'subgroup' => 'views-group-select-' . $group_id ,
);
drupal_attach_tabledrag ( $form [ 'override' ], $options );
// Title row, spanning all columns.
$row = array ();
// Add a cell to the first row, containing the group operator.
$row [] = array (
'class' => array ( 'group' , 'group-operator' , 'container-inline' ),
'data' => $form [ 'filter_groups' ][ 'groups' ][ $group_id ],
'rowspan' => max ( array ( 2 , count ( $contents ) + 1 )),
);
// Title.
$row [] = array (
'class' => array ( 'group' , 'group-title' ),
'data' => array (
'#prefix' => '<span>' ,
'#markup' => $form [ '#group_options' ][ $group_id ],
'#suffix' => '</span>' ,
),
'colspan' => 4 ,
);
$rows [] = array (
'class' => array ( 'views-group-title' ),
'data' => $row ,
'id' => 'views-group-title-' . $group_id ,
);
// Row which will only appear if the group has nothing in it.
$row = array ();
$class = 'group-' . ( count ( $contents ) ? 'populated' : 'empty' );
$instructions = '<span>' . t ( 'No filters have been added.' ) . '</span> <span class="js-only">' . t ( 'Drag to add filters.' ) . '</span>' ;
// When JavaScript is enabled, the button for removing the group (if it's
// present) should be hidden, since it will be replaced by a link on the
// client side.
if ( ! empty ( $form [ 'remove_groups' ][ $group_id ][ '#type' ]) && $form [ 'remove_groups' ][ $group_id ][ '#type' ] == 'submit' ) {
$form [ 'remove_groups' ][ $group_id ][ '#attributes' ][ 'class' ][] = 'js-hide' ;
}
$row [] = array (
'colspan' => 5 ,
'data' => array (
array ( '#markup' => $instructions ),
$form [ 'remove_groups' ][ $group_id ],
),
);
$rows [] = array (
'class' => array (
'group-message' ,
'group-' . $group_id . '-message' ,
$class ,
),
'data' => $row ,
'id' => 'views-group-' . $group_id ,
);
}
foreach ( $contents as $id ) {
if ( isset ( $form [ 'filters' ][ $id ][ 'name' ])) {
$row = array ();
$row [][ 'data' ] = $form [ 'filters' ][ $id ][ 'name' ];
$form [ 'filters' ][ $id ][ 'weight' ][ '#attributes' ][ 'class' ] = array ( 'weight' );
$row [][ 'data' ] = $form [ 'filters' ][ $id ][ 'weight' ];
$form [ 'filters' ][ $id ][ 'group' ][ '#attributes' ][ 'class' ] = array ( 'views-group-select views-group-select-' . $group_id );
$row [][ 'data' ] = $form [ 'filters' ][ $id ][ 'group' ];
$form [ 'filters' ][ $id ][ 'removed' ][ '#attributes' ][ 'class' ][] = 'js-hide' ;
$remove_link = array (
'#type' => 'link' ,
'#url' => Url :: fromRoute ( '<none>' ),
'#title' => SafeMarkup :: format ( '<span>@text</span>' , array ( '@text' => t ( 'Remove' ))),
'#weight' => '1' ,
'#options' => array (
'attributes' => array (
'id' => 'views-remove-link-' . $id ,
'class' => array (
'views-hidden' ,
'views-button-remove' ,
'views-groups-remove-link' ,
'views-remove-link' ,
),
'alt' => t ( 'Remove this item' ),
'title' => t ( 'Remove this item' ),
),
),
);
$row [][ 'data' ] = array (
$form [ 'filters' ][ $id ][ 'removed' ],
$remove_link ,
);
$row = array (
'data' => $row ,
'class' => array ( 'draggable' ),
'id' => 'views-row-' . $id ,
);
if ( $group_id !== 'ungroupable' ) {
$rows [] = $row ;
}
else {
$ungroupable_rows [] = $row ;
}
}
}
}
if ( ! $variables [ 'grouping' ]) {
$form [ 'filter_groups' ][ 'groups' ][ 0 ][ '#title' ] = t ( 'Operator' );
}
if ( ! empty ( $ungroupable_rows )) {
$header = array (
t ( 'Ungroupable filters' ),
t ( 'Weight' ),
array (
'data' => t ( 'Group' ),
'class' => array ( 'views-hide-label' ),
),
array (
'data' => t ( 'Remove' ),
'class' => array ( 'views-hide-label' ),
),
);
$variables [ 'ungroupable_table' ] = array (
'#type' => 'table' ,
'#header' => $header ,
'#rows' => $ungroupable_rows ,
'#attributes' => array (
'id' => 'views-rearrange-filters-ungroupable' ,
'class' => array ( 'arrange' ),
),
'#tabledrag' => array (
array (
'action' => 'order' ,
'relationship' => 'sibling' ,
'group' => 'weight' ,
)
),
);
}
if ( empty ( $rows )) {
$rows [] = array ( array ( 'data' => t ( 'No fields available.' ), 'colspan' => '2' ));
}
// Set up tabledrag so that the weights are changed when rows are dragged.
$variables [ 'table' ] = array (
'#type' => 'table' ,
'#rows' => $rows ,
'#attributes' => array (
'id' => 'views-rearrange-filters' ,
'class' => array ( 'arrange' ),
),
'#tabledrag' => array (
array (
'action' => 'order' ,
'relationship' => 'sibling' ,
'group' => 'weight' ,
),
),
);
// When JavaScript is enabled, the button for adding a new group should be
// hidden, since it will be replaced by a link on the client side.
$form [ 'actions' ][ 'add_group' ][ '#attributes' ][ 'class' ][] = 'js-hide' ;
}
/**
* Prepares variables for style plugin table templates .
*
* Default template : views - ui - style - plugin - table . html . twig .
*
* @ param array $variables
* An associative array containing :
* - form : A render element representing the form .
*/
function template_preprocess_views_ui_style_plugin_table ( & $variables ) {
$form = $variables [ 'form' ];
$header = array (
t ( 'Field' ),
t ( 'Column' ),
t ( 'Align' ),
t ( 'Separator' ),
array (
'data' => t ( 'Sortable' ),
'align' => 'center' ,
),
array (
'data' => t ( 'Default order' ),
'align' => 'center' ,
),
array (
'data' => t ( 'Default sort' ),
'align' => 'center' ,
),
array (
'data' => t ( 'Hide empty column' ),
'align' => 'center' ,
),
array (
'data' => t ( 'Responsive' ),
'align' => 'center' ,
),
);
$rows = array ();
foreach ( Element :: children ( $form [ 'columns' ]) as $id ) {
$row = array ();
$row [][ 'data' ] = $form [ 'info' ][ $id ][ 'name' ];
$row [][ 'data' ] = $form [ 'columns' ][ $id ];
$row [][ 'data' ] = $form [ 'info' ][ $id ][ 'align' ];
$row [][ 'data' ] = $form [ 'info' ][ $id ][ 'separator' ];
if ( ! empty ( $form [ 'info' ][ $id ][ 'sortable' ])) {
$row [] = array (
'data' => $form [ 'info' ][ $id ][ 'sortable' ],
'align' => 'center' ,
);
$row [] = array (
'data' => $form [ 'info' ][ $id ][ 'default_sort_order' ],
'align' => 'center' ,
);
$row [] = array (
'data' => $form [ 'default' ][ $id ],
'align' => 'center' ,
);
}
else {
$row [] = '' ;
$row [] = '' ;
$row [] = '' ;
}
$row [] = array (
'data' => $form [ 'info' ][ $id ][ 'empty_column' ],
'align' => 'center' ,
);
$row [] = array (
'data' => $form [ 'info' ][ $id ][ 'responsive' ],
'align' => 'center' ,
);
$rows [] = $row ;
}
// Add the special 'None' row.
$rows [] = array ( array ( 'data' => t ( 'None' ), 'colspan' => 6 ), array ( 'align' => 'center' , 'data' => $form [ 'default' ][ - 1 ]), array ( 'colspan' => 2 ));
// Unset elements from the form array that are used to build the table so that
// they are not rendered twice.
unset ( $form [ 'default' ]);
unset ( $form [ 'info' ]);
unset ( $form [ 'columns' ]);
$variables [ 'table' ] = array (
'#type' => 'table' ,
'#theme' => 'table__views_ui_style_plugin_table' ,
'#header' => $header ,
'#rows' => $rows ,
);
$variables [ 'form' ] = $form ;
}
/**
* Prepares variables for views UI view preview section templates .
*
* Default template : views - ui - view - preview - section . html . twig .
*
* @ param array $variables
* An associative array containing :
* - view : The view object .
* - section : The section name of a View ( e . g . title , rows or pager ) .
*/
function template_preprocess_views_ui_view_preview_section ( & $variables ) {
switch ( $variables [ 'section' ]) {
case 'title' :
$variables [ 'title' ] = t ( 'Title' );
$links = views_ui_view_preview_section_display_category_links ( $variables [ 'view' ], 'title' , $variables [ 'title' ]);
break ;
case 'header' :
$variables [ 'title' ] = t ( 'Header' );
$links = views_ui_view_preview_section_handler_links ( $variables [ 'view' ], $variables [ 'section' ]);
break ;
case 'empty' :
$variables [ 'title' ] = t ( 'No results behavior' );
$links = views_ui_view_preview_section_handler_links ( $variables [ 'view' ], $variables [ 'section' ]);
break ;
case 'exposed' :
// @todo Sorts can be exposed too, so we may need a better title.
$variables [ 'title' ] = t ( 'Exposed Filters' );
$links = views_ui_view_preview_section_display_category_links ( $variables [ 'view' ], 'exposed_form_options' , $variables [ 'title' ]);
break ;
case 'rows' :
// @todo The title needs to depend on what is being viewed.
$variables [ 'title' ] = t ( 'Content' );
$links = views_ui_view_preview_section_rows_links ( $variables [ 'view' ]);
break ;
case 'pager' :
$variables [ 'title' ] = t ( 'Pager' );
$links = views_ui_view_preview_section_display_category_links ( $variables [ 'view' ], 'pager_options' , $variables [ 'title' ]);
break ;
case 'more' :
$variables [ 'title' ] = t ( 'More' );
$links = views_ui_view_preview_section_display_category_links ( $variables [ 'view' ], 'use_more' , $variables [ 'title' ]);
break ;
case 'footer' :
$variables [ 'title' ] = t ( 'Footer' );
$links = views_ui_view_preview_section_handler_links ( $variables [ 'view' ], $variables [ 'section' ]);
break ;
case 'attachment_before' :
// @todo: Add links to the attachment configuration page.
$variables [ 'title' ] = t ( 'Attachment before' );
break ;
case 'attachment_after' :
// @todo: Add links to the attachment configuration page.
$variables [ 'title' ] = t ( 'Attachment after' );
break ;
}
if ( isset ( $links )) {
$build = array (
'#theme' => 'links__contextual' ,
'#links' => $links ,
'#attributes' => array ( 'class' => array ( 'contextual-links' )),
'#attached' => array (
'library' => array ( 'contextual/drupal.contextual-links' ),
),
);
$variables [ 'links' ] = $build ;
}
}
/**
* Implements hook_theme_suggestions_HOOK () .
*/
function views_ui_theme_suggestions_views_ui_view_preview_section ( array $variables ) {
return array ( 'views_ui_view_preview_section__' . $variables [ 'section' ]);
}