<?php/** * @file * Describe the file * * @author Mathew Winstone <mwinstone@coldfrontlabs.ca> *//** * Implements hook_views_api(). */functionbvt_views_api(){returnarray('api'=>3,);}/** * Implements hook_theme(). */functionbvt_theme($existing,$type,$theme,$path){// Default arguments for views plugins (see Views module)$arguments=array(// For displays, we pass in a dummy array as the first parameter, since// $view is an object but the core contextual_preprocess() function only// attaches contextual links when the primary theme argument is an array.'display'=>array('view_array'=>array(),'view'=>NULL),'style'=>array('view'=>NULL,'options'=>NULL,'rows'=>NULL,'title'=>NULL),'row'=>array('view'=>NULL,'options'=>NULL,'row'=>NULL,'field_alias'=>NULL),);returnarray('bvt_style_plugin_ui_table'=>array('render element'=>'form',),);}/** * Preprocess function for bvt table style */functiontemplate_preprocess_views_view_bvt_tables(&$vars){$view=$vars['view'];// We need the raw data for this grouping, which is passed in as $vars['rows'].// However, the template also needs to use for the rendered fields. We// therefore swap the raw data out to a new variable and reset $vars['rows']// so that it can get rebuilt.// Store rows so that they may be used by further preprocess functions.$result=$vars['result']=$vars['rows'];$vars['rows']=array();$vars['field_classes']=array();$vars['header']=array();$options=$view->style_plugin->options;$handler=$view->style_plugin;// Set the caption text$vars['caption']=filter_xss($options['caption']);$default_row_class=isset($options['default_row_class'])?$options['default_row_class']:TRUE;$row_class_special=isset($options['row_class_special'])?$options['row_class_special']:TRUE;$fields=&$view->field;$columns=$handler->sanitize_columns($options['columns'],$fields);$active=!empty($handler->active)?$handler->active:'';$order=!empty($handler->order)?$handler->order:'asc';$query=tablesort_get_query_parameters();if(isset($view->exposed_raw_input)){$query+=$view->exposed_raw_input;}// Fields must be rendered in order as of Views 2.3, so we will pre-render// everything.$renders=$handler->render_fields($result);foreach($columnsas$field=>$column){// Create a second variable so we can easily find what fields we have and what the// CSS classes should be.$vars['fields'][$field]=drupal_clean_css_identifier($field);if($active==$field){$vars['fields'][$field].=' active';}// render the header labelsif($field==$column&&empty($fields[$field]->options['exclude'])){$label=check_plain(!empty($fields[$field])?$fields[$field]->label():'');if(empty($options['info'][$field]['sortable'])||!$fields[$field]->click_sortable()){$vars['header'][$field]=$label;}else{$initial=!empty($options['info'][$field]['default_sort_order'])?$options['info'][$field]['default_sort_order']:'asc';if($active==$field){$initial=($order=='asc')?'desc':'asc';}$title=t('sort by @s',array('@s'=>$label));if($active==$field){$label.=theme('tablesort_indicator',array('style'=>$initial));}$query['order']=$field;$query['sort']=$initial;$link_options=array('html'=>TRUE,'attributes'=>array('title'=>$title),'query'=>$query,);$vars['header'][$field]=l($label,$_GET['q'],$link_options);}$vars['header_classes'][$field]='';// Set up the header label class.if($fields[$field]->options['element_default_classes']){$vars['header_classes'][$field].="views-field views-field-".$vars['fields'][$field];}$class=$fields[$field]->element_label_classes(0);if($class){if($vars['header_classes'][$field]){$vars['header_classes'][$field].=' ';}$vars['header_classes'][$field].=$class;}// Add a CSS align class to each field if one was setif(!empty($options['info'][$field]['align'])){$vars['header_classes'][$field].=' '.drupal_clean_css_identifier($options['info'][$field]['align']);}// Add responsify classesif(isset($options['info'][$field]['responsify_priority'])){$responsify_priority=$options['info'][$field]['responsify_priority'];if($responsify_priority){if($responsify_priority==3){$vars['header_classes'][$field].=' '."persist".' '."essential";}elseif($responsify_priority==2){$vars['header_classes'][$field].=' '."essential";}elseif($responsify_priority==1){$vars['header_classes'][$field].=' '."optional";}}}// Add a header label wrapper if one was selected.if($vars['header'][$field]){$element_label_type=$fields[$field]->element_label_type(TRUE,TRUE);if($element_label_type){$vars['header'][$field]='<'.$element_label_type.'>'.$vars['header'][$field].'</'.$element_label_type.'>';}}}// Add a CSS align class to each field if one was setif(!empty($options['info'][$field]['align'])){$vars['fields'][$field].=' '.drupal_clean_css_identifier($options['info'][$field]['align']);}// Render each field into its appropriate column.foreach($resultas$num=>$row){// Add to the set of header columnsif(TRUE==$options['info'][$field]['header_column']){$vars['header_columns'][$field]=$field;}// Add field classes$vars['field_classes'][$field][$num]='';if($fields[$field]->options['element_default_classes']){$vars['field_classes'][$field][$num]="views-field views-field-".$vars['fields'][$field];}if($classes=$fields[$field]->element_classes($num)){if($vars['field_classes'][$field][$num]){$vars['field_classes'][$field][$num].=' ';}$vars['field_classes'][$field][$num].=$classes;}// Add responsify classesif(isset($options['info'][$field]['responsify_priority'])){$responsify_priority=$options['info'][$field]['responsify_priority'];if($responsify_priority){if($responsify_priority==3){$vars['field_classes'][$field][$num].=' '."persist".' '."essential";}elseif($responsify_priority==2){$vars['field_classes'][$field][$num].=' '."essential";}elseif($responsify_priority==1){$vars['field_classes'][$field][$num].=' '."optional";}}}$vars['field_attributes'][$field][$num]=array();// Add scope attributesif(isset($vars['header_columns'][$field])andTRUE==$vars['header_columns'][$field]){$vars['field_attributes'][$field][$num]['scope']='row';}if(!empty($fields[$field])&&empty($fields[$field]->options['exclude'])){$field_output=$renders[$num][$field];$element_type=$fields[$field]->element_type(TRUE,TRUE);if($element_type){$field_output='<'.$element_type.'>'.$field_output.'</'.$element_type.'>';}// Don't bother with separators and stuff if the field does not show up.if(empty($field_output)&&!empty($vars['rows'][$num][$column])){continue;}// Place the field into the column, along with an optional separator.if(!empty($vars['rows'][$num][$column])){if(!empty($options['info'][$column]['separator'])){$vars['rows'][$num][$column].=filter_xss_admin($options['info'][$column]['separator']);}}else{$vars['rows'][$num][$column]='';}$vars['rows'][$num][$column].=$field_output;}}// Remove columns if the option is hide empty column is checked and the field is not empty.if(!empty($options['info'][$field]['empty_column'])){$empty=TRUE;foreach($vars['rows']as$num=>$columns){$empty&=empty($columns[$column]);}if($empty){foreach($vars['rows']as$num=>&$column_items){unset($column_items[$column]);unset($vars['header'][$column]);}}}}// Hide table header if all labels are empty.if(!array_filter($vars['header'])){$vars['header']=array();}$count=0;foreach($vars['rows']as$num=>$row){$vars['row_classes'][$num]=array();if($row_class_special){$vars['row_classes'][$num][]=($count++%2==0)?'odd':'even';}if($row_class=$handler->get_row_class($num)){$vars['row_classes'][$num][]=$row_class;}}if($row_class_special){$vars['row_classes'][0][]='views-row-first';$vars['row_classes'][count($vars['row_classes'])-1][]='views-row-last';}$vars['classes_array']=array('views-table');if(empty($vars['rows'])&&!empty($options['empty_table'])){$vars['rows'][0][0]=$view->display_handler->render_area('empty');// Calculate the amounts of rows with output.$vars['field_attributes'][0][0]['colspan']=count($vars['header']);$vars['field_classes'][0][0]='views-empty';}if(!empty($options['sticky'])){drupal_add_js('misc/tableheader.js');$vars['classes_array'][]="sticky-enabled";}$vars['classes_array'][]='cols-'.count($vars['header']);if(!empty($handler->options['summary'])){$vars['attributes_array']=array('summary'=>$handler->options['summary']);}}/** * Render the table setup form */functiontheme_bvt_style_plugin_ui_table($variables){$form=$variables['form'];$output=drupal_render($form['description_markup']);$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',),t('Render as table header column'),t('Responsify Field Priority'),);$rows=array();foreach(element_children($form['columns'])as$id){$row=array();$row[]=drupal_render($form['info'][$id]['name']);$row[]=drupal_render($form['columns'][$id]);$row[]=drupal_render($form['info'][$id]['align']);$row[]=drupal_render($form['info'][$id]['separator']);if(!empty($form['info'][$id]['sortable'])){$row[]=array('data'=>drupal_render($form['info'][$id]['sortable']),'align'=>'center',);$row[]=array('data'=>drupal_render($form['info'][$id]['default_sort_order']),'align'=>'center',);$row[]=array('data'=>drupal_render($form['default'][$id]),'align'=>'center',);}else{$row[]='';$row[]='';$row[]='';}$row[]=array('data'=>drupal_render($form['info'][$id]['empty_column']),'align'=>'center',);$row[]=drupal_render($form['info'][$id]['header_column']);$row[]=drupal_render($form['info'][$id]['responsify_priority']);$rows[]=$row;}// Add the special 'None' row.$rows[]=array(t('None'),'','','','','',array('align'=>'center','data'=>drupal_render($form['default'][-1])),'','','');$output.=theme('table',array('header'=>$header,'rows'=>$rows));$output.=drupal_render_children($form);return$output;}