diff --git a/README.txt b/README.txt index 85ff2ec..5a95c8a 100644 --- a/README.txt +++ b/README.txt @@ -22,7 +22,7 @@ content on a mobile display. INSTALLATION ------------ -1. Download module and copy views_responsive_grid folder to sites/all/modules +1. Download module and copy views_responsive_grid folder to /modules 2. Enable Views and Views Responsive Grid modules. diff --git a/lib/Drupal/views_responsive_grid/Plugin/views/style/ResponsiveGrid.php b/lib/Drupal/views_responsive_grid/Plugin/views/style/ResponsiveGrid.php new file mode 100644 index 0000000..eac4cee --- /dev/null +++ b/lib/Drupal/views_responsive_grid/Plugin/views/style/ResponsiveGrid.php @@ -0,0 +1,137 @@ + '4'); + $options['alignment'] = array('default' => 'horizontal'); + $options['wrapper_classes'] = array('default' => ''); + $options['column_classes'] = array('default' => 'views-column'); + $options['first_column_classes'] = array('default' => 'views-column-first'); + $options['last_column_classes'] = array('default' => 'views-column-last'); + $options['row_classes'] = array('default' => 'views-row'); + $options['first_row_classes'] = array('default' => 'views-row-first'); + $options['last_row_classes'] = array('default' => 'views-row-last'); + $options['default_classes'] = array('default' => 0); + return $options; + } + + /** + * Overrides \Drupal\views\Plugin\views\style\StylePluginBase::buildOptionsForm(). + */ + function buildOptionsForm(&$form, &$form_state) { + parent::buildOptionsForm($form, $form_state); + + // Flatten options to deal with the various hierarchy changes. + $options = views_responsive_grid_get_options($this->options); + + $form['columns'] = array( + '#type' => 'textfield', + '#title' => t('Number of columns'), + '#default_value' => $options['columns'], + '#required' => TRUE, + '#element_validate' => array('views_element_validate_integer'), + ); + $form['alignment'] = array( + '#type' => 'radios', + '#title' => t('Alignment'), + '#options' => array('horizontal' => t('Horizontal'), 'vertical' => t('Vertical')), + '#default_value' => $options['alignment'], + '#description' => t('Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down.'), + ); + $form['classes'] = array( + '#type' => 'fieldset', + '#title' => t('Custom Classes'), + '#description' => t('Below is the area you can use to customize the different classes of the grid. Separate each class with a space.'), + '#weight' => 1, + ); + $form['classes']['default_classes'] = array( + '#type' => 'checkbox', + '#title' => t('Remove default views classes'), + '#default_value' => $options['default_classes'], + ); + $form['classes']['grid_css'] = array( + '#type' => 'fieldset', + '#title' => t('Grid'), + ); + $form['classes']['grid_css']['wrapper_classes'] = array( + '#type' => 'textfield', + '#title' => t('Wrapper'), + '#default_value' => $options['wrapper_classes'], + ); + $form['classes']['column_css'] = array( + '#type' => 'fieldset', + '#title' => t('Columns'), + ); + $form['classes']['column_css']['column_classes'] = array( + '#type' => 'textfield', + '#title' => t('Every Column'), + '#default_value' => $options['column_classes'], + ); + $form['classes']['column_css']['first_column_classes'] = array( + '#type' => 'textfield', + '#title' => t('First Column'), + '#default_value' => $options['first_column_classes'], + ); + $form['classes']['column_css']['last_column_classes'] = array( + '#type' => 'textfield', + '#title' => t('Last Column'), + '#default_value' => $options['last_column_classes'], + ); + $form['classes']['row_css'] = array( + '#type' => 'fieldset', + '#title' => t('Row'), + ); + $form['classes']['row_css']['row_classes'] = array( + '#type' => 'textfield', + '#title' => t('Every Row'), + '#default_value' => $options['row_classes'], + ); + $form['classes']['row_css']['first_row_classes'] = array( + '#type' => 'textfield', + '#title' => t('First Row'), + '#default_value' => $options['first_row_classes'], + ); + $form['classes']['row_css']['last_row_classes'] = array( + '#type' => 'textfield', + '#title' => t('Last Row'), + '#default_value' => $options['last_row_classes'], + ); + } + +} diff --git a/templates/views-view-responsive-grid.tpl.php b/templates/views-view-responsive-grid.tpl.php new file mode 100644 index 0000000..9519fcb --- /dev/null +++ b/templates/views-view-responsive-grid.tpl.php @@ -0,0 +1,39 @@ + + +

+ +
+ + $column) : ?> +
+ $item) : ?> +
+ +
+ +
+ + + $row) : ?> +
+ $item) : ?> +
+ +
+ +
+ + +
diff --git a/views-view-responsive-grid.tpl.php b/views-view-responsive-grid.tpl.php deleted file mode 100644 index 9519fcb..0000000 --- a/views-view-responsive-grid.tpl.php +++ /dev/null @@ -1,39 +0,0 @@ - - -

- -
- - $column) : ?> -
- $item) : ?> -
- -
- -
- - - $row) : ?> -
- $item) : ?> -
- -
- -
- - -
diff --git a/views_responsive_grid.info b/views_responsive_grid.info deleted file mode 100644 index c6b08bd..0000000 --- a/views_responsive_grid.info +++ /dev/null @@ -1,8 +0,0 @@ -name = Views Responsive Grid -description = Views plugin for displaying views content in a responsive grid. -core = 7.x -package = Views - -dependencies[] = views - -files[] = views_responsive_grid_plugin_style_responsive_grid.inc diff --git a/views_responsive_grid.info.yml b/views_responsive_grid.info.yml new file mode 100644 index 0000000..c7264c0 --- /dev/null +++ b/views_responsive_grid.info.yml @@ -0,0 +1,9 @@ +name: Views Responsive Grid +description: Views plugin for displaying views content in a responsive grid. +package: Views +version: VERSION +core: 8.x +dependencies: + - views + +# files[] = views_responsive_grid_plugin_style_responsive_grid.inc diff --git a/views_responsive_grid.module b/views_responsive_grid.module index 00b7690..9c625e9 100644 --- a/views_responsive_grid.module +++ b/views_responsive_grid.module @@ -5,14 +5,21 @@ */ /** - * Implements hook_views_api(). + * Implements hook_theme_registry_alter(). */ -function views_responsive_grid_views_api() { - return array('api' => '3.0'); +function views_responsive_grid_theme_registry_alter(&$theme_registry) { + // For some issue in core, we need to set our theme path ourselves. + // @see http://drupal.org/node/1911492 + $template =& $theme_registry['views_view_responsive_grid']; + $template['theme path'] = drupal_get_path('module', 'views_responsive_grid'); + $template['path'] = drupal_get_path('module', 'views_responsive_grid') . '/templates'; } + /** * Set default options. + * + * @todo Why is that function used? */ function views_responsive_grid_get_options($array) { $options = array(); @@ -26,114 +33,3 @@ function views_responsive_grid_get_options($array) { } return $options; } - -/** - * Display a view as a responsive grid style. - */ -function template_preprocess_views_view_responsive_grid(&$vars) { - $view = $vars['view']; - $result = $view->result; - $options = views_responsive_grid_get_options($view->style_plugin->options); - $handler = $view->style_plugin; - - $columns = $options['columns']; - $vars['classes_array'] = array(); - if (!$options['default_classes']) { - $vars['classes_array'][] = 'views-responsive-grid'; - $vars['classes_array'][] = 'views-responsive-grid-' . $options['alignment']; - $vars['classes_array'][] = 'views-columns-' . $columns; - } - $vars['classes_array'] = array_merge($vars['classes_array'], explode(' ', $options['wrapper_classes'])); - $vars['classes_array'] = array_filter($vars['classes_array']); - // Check if there are views results to process. - if (!empty($vars['rows'])) { - $col_id = 0; - $row_id = 0; - $keys = array_keys($vars['rows']); - $current = array_shift($keys); - // Determine style alignment. - if ($options['alignment'] == 'horizontal') { - $rows = array(); - $vars['row_classes'] = array(); - foreach ($vars['rows'] as $i => $row) { - $classes = explode(' ', $options['column_classes']); - if (!$options['default_classes']) { - $classes[] = 'views-column-' . ($col_id + 1); - } - $rows[$row_id][$col_id] = array( - 'classes' => implode(' ', $classes), - 'content' => $vars['rows'][$current], - ); - $classes = explode(' ', $options['row_classes']); - if (!$options['default_classes']) { - $classes[] = 'views-row-' . ($row_id + 1); - } - $vars['row_classes'][$row_id] = implode(' ', $classes); - - if ($row_id == 0) { - $vars['row_classes'][$row_id] .= ' ' . $options['first_row_classes']; - } - elseif ($row_id == ceil(count($vars['rows']) / $columns) - 1) { - $vars['row_classes'][$row_id] .= ' ' . $options['last_row_classes']; - } - if ($col_id == 0) { - $rows[$row_id][$col_id]['classes'] .= ' ' . $options['first_column_classes']; - $col_id++; - } - elseif ($col_id == $columns - 1) { - $rows[$row_id][$col_id]['classes'] .= ' ' . $options['last_column_classes']; - $col_id = 0; - $row_id++; - } - else { - $col_id++; - } - $current++; - } - $vars['rows'] = $rows; - } - else { - $cols = array(); - $extra = count($vars['rows']) % $columns; - $per_col = floor(count($vars['rows']) / $columns); - $vars['column_classes'] = array(); - for ($i = 0; $i < $columns; $i++) { - $classes = explode(' ', $options['column_classes']); - if (!$options['default_classes']) { - $classes[] = 'views-column-' . ($col_id + 1); - } - $vars['column_classes'][$i] = $classes; - if ($i == 0 && !empty($options['first_column_classes'])) { - $vars['column_classes'][$i] = array_merge($vars['column_classes'][$i], explode(' ', $options['first_column_classes'])); - } - elseif ($i == $columns - 1 && !empty($options['last_column_classes'])) { - $vars['column_classes'][$i] = array_merge($vars['column_classes'][$i], explode(' ', $options['last_column_classes'])); - } - $vars['column_classes'][$i] = implode(' ', $vars['column_classes'][$i]); - for ($n = 0; $n <= ($per_col - 1) + ($i < $extra ? 1 : 0); $n++) { - $classes = explode(' ', $options['row_classes']); - if (!$options['default_classes']) { - $classes[] = 'views-row-' . ($row_id + 1); - } - $cols[$i][$n] = array( - 'classes' => $classes, - 'content' => $vars['rows'][$current], - ); - if ($n == 0 && !empty($options['first_row_classes'])) { - $cols[$i][$n]['classes'] = array_merge($cols[$i][$n]['classes'], explode(' ', $options['first_row_classes'])); - } - elseif ($n == ($per_col - 1) + ($i < $extra ? 1 : 0) && !empty($options['last_row_classes'])) { - $cols[$i][$n]['classes'] = array_merge($cols[$i][$n]['classes'], explode(' ', $options['last_row_classes'])); - } - $cols[$i][$n]['classes'] = implode(' ', $cols[$i][$n]['classes']); - $current++; - $row_id++; - } - $col_id++; - $row_id = 0; - } - $vars['columns'] = $cols; - } - } - $vars['classes'] = implode(' ', $vars['classes_array']); -} diff --git a/views_responsive_grid.theme.inc b/views_responsive_grid.theme.inc new file mode 100644 index 0000000..f06de33 --- /dev/null +++ b/views_responsive_grid.theme.inc @@ -0,0 +1,118 @@ +result; + $options = views_responsive_grid_get_options($view->style_plugin->options); + $handler = $view->style_plugin; + + $columns = $options['columns']; + $vars['classes_array'] = array(); + if (!$options['default_classes']) { + $vars['classes_array'][] = 'views-responsive-grid'; + $vars['classes_array'][] = 'views-responsive-grid-' . $options['alignment']; + $vars['classes_array'][] = 'views-columns-' . $columns; + } + $vars['classes_array'] = array_merge($vars['classes_array'], explode(' ', $options['wrapper_classes'])); + $vars['classes_array'] = array_filter($vars['classes_array']); + // Check if there are views results to process. + if (!empty($vars['rows'])) { + $col_id = 0; + $row_id = 0; + $keys = array_keys($vars['rows']); + $current = array_shift($keys); + // Determine style alignment. + if ($options['alignment'] == 'horizontal') { + $rows = array(); + $vars['row_classes'] = array(); + foreach ($vars['rows'] as $i => $row) { + $classes = explode(' ', $options['column_classes']); + if (!$options['default_classes']) { + $classes[] = 'views-column-' . ($col_id + 1); + } + $rows[$row_id][$col_id] = array( + 'classes' => implode(' ', $classes), + 'content' => $vars['rows'][$current], + ); + $classes = explode(' ', $options['row_classes']); + if (!$options['default_classes']) { + $classes[] = 'views-row-' . ($row_id + 1); + } + $vars['row_classes'][$row_id] = implode(' ', $classes); + + if ($row_id == 0) { + $vars['row_classes'][$row_id] .= ' ' . $options['first_row_classes']; + } + elseif ($row_id == ceil(count($vars['rows']) / $columns) - 1) { + $vars['row_classes'][$row_id] .= ' ' . $options['last_row_classes']; + } + if ($col_id == 0) { + $rows[$row_id][$col_id]['classes'] .= ' ' . $options['first_column_classes']; + $col_id++; + } + elseif ($col_id == $columns - 1) { + $rows[$row_id][$col_id]['classes'] .= ' ' . $options['last_column_classes']; + $col_id = 0; + $row_id++; + } + else { + $col_id++; + } + $current++; + } + $vars['rows'] = $rows; + } + else { + $cols = array(); + $extra = count($vars['rows']) % $columns; + $per_col = floor(count($vars['rows']) / $columns); + $vars['column_classes'] = array(); + for ($i = 0; $i < $columns; $i++) { + $classes = explode(' ', $options['column_classes']); + if (!$options['default_classes']) { + $classes[] = 'views-column-' . ($col_id + 1); + } + $vars['column_classes'][$i] = $classes; + if ($i == 0 && !empty($options['first_column_classes'])) { + $vars['column_classes'][$i] = array_merge($vars['column_classes'][$i], explode(' ', $options['first_column_classes'])); + } + elseif ($i == $columns - 1 && !empty($options['last_column_classes'])) { + $vars['column_classes'][$i] = array_merge($vars['column_classes'][$i], explode(' ', $options['last_column_classes'])); + } + $vars['column_classes'][$i] = implode(' ', $vars['column_classes'][$i]); + for ($n = 0; $n <= ($per_col - 1) + ($i < $extra ? 1 : 0); $n++) { + $classes = explode(' ', $options['row_classes']); + if (!$options['default_classes']) { + $classes[] = 'views-row-' . ($row_id + 1); + } + $cols[$i][$n] = array( + 'classes' => $classes, + 'content' => $vars['rows'][$current], + ); + if ($n == 0 && !empty($options['first_row_classes'])) { + $cols[$i][$n]['classes'] = array_merge($cols[$i][$n]['classes'], explode(' ', $options['first_row_classes'])); + } + elseif ($n == ($per_col - 1) + ($i < $extra ? 1 : 0) && !empty($options['last_row_classes'])) { + $cols[$i][$n]['classes'] = array_merge($cols[$i][$n]['classes'], explode(' ', $options['last_row_classes'])); + } + $cols[$i][$n]['classes'] = implode(' ', $cols[$i][$n]['classes']); + $current++; + $row_id++; + } + $col_id++; + $row_id = 0; + } + $vars['columns'] = $cols; + } + } + $vars['classes'] = implode(' ', $vars['classes_array']); +} diff --git a/views_responsive_grid.views.inc b/views_responsive_grid.views.inc deleted file mode 100644 index 0dc2fd6..0000000 --- a/views_responsive_grid.views.inc +++ /dev/null @@ -1,26 +0,0 @@ - array( - 'responsive_grid' => array( - 'title' => t('Responsive grid'), - 'help' => t('Display content in a responsive grid.'), - 'handler' => 'views_responsive_grid_plugin_style_responsive_grid', - 'theme' => 'views_view_responsive_grid', - 'uses row plugin' => TRUE, - 'uses row class' => FALSE, - 'uses options' => TRUE, - 'uses grouping' => TRUE, - 'type' => 'normal', - ), - ), - ); -} diff --git a/views_responsive_grid_plugin_style_responsive_grid.inc b/views_responsive_grid_plugin_style_responsive_grid.inc deleted file mode 100644 index dd0c88c..0000000 --- a/views_responsive_grid_plugin_style_responsive_grid.inc +++ /dev/null @@ -1,119 +0,0 @@ - '4'); - $options['alignment'] = array('default' => 'horizontal'); - $options['wrapper_classes'] = array('default' => ''); - $options['column_classes'] = array('default' => 'views-column'); - $options['first_column_classes'] = array('default' => 'views-column-first'); - $options['last_column_classes'] = array('default' => 'views-column-last'); - $options['row_classes'] = array('default' => 'views-row'); - $options['first_row_classes'] = array('default' => 'views-row-first'); - $options['last_row_classes'] = array('default' => 'views-row-last'); - $options['default_classes'] = array('default' => 0); - return $options; - } - - /** - * Render the given style. - */ - function options_form(&$form, &$form_state) { - parent::options_form($form, $form_state); - - // Flatten options to deal with the various hierarchy changes. - $options = views_responsive_grid_get_options($this->options); - - $form['columns'] = array( - '#type' => 'textfield', - '#title' => t('Number of columns'), - '#default_value' => $options['columns'], - '#required' => TRUE, - '#element_validate' => array('views_element_validate_integer'), - ); - $form['alignment'] = array( - '#type' => 'radios', - '#title' => t('Alignment'), - '#options' => array('horizontal' => t('Horizontal'), 'vertical' => t('Vertical')), - '#default_value' => $options['alignment'], - '#description' => t('Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down.'), - ); - $form['classes'] = array( - '#type' => 'fieldset', - '#title' => t('Custom Classes'), - '#description' => t('Below is the area you can use to customize the different classes of the grid. Separate each class with a space.'), - '#weight' => 1, - ); - $form['classes']['default_classes'] = array( - '#type' => 'checkbox', - '#title' => t('Remove default views classes'), - '#default_value' => $options['default_classes'], - ); - $form['classes']['grid_css'] = array( - '#type' => 'fieldset', - '#title' => t('Grid'), - '#prefix' => '
', - '#suffix' => '
', - ); - $form['classes']['grid_css']['wrapper_classes'] = array( - '#type' => 'textfield', - '#title' => t('Wrapper'), - '#default_value' => $options['wrapper_classes'], - ); - $form['classes']['column_css'] = array( - '#type' => 'fieldset', - '#title' => t('Columns'), - '#prefix' => '
', - '#suffix' => '
', - ); - $form['classes']['column_css']['column_classes'] = array( - '#type' => 'textfield', - '#title' => t('Every Column'), - '#default_value' => $options['column_classes'], - ); - $form['classes']['column_css']['first_column_classes'] = array( - '#type' => 'textfield', - '#title' => t('First Column'), - '#default_value' => $options['first_column_classes'], - ); - $form['classes']['column_css']['last_column_classes'] = array( - '#type' => 'textfield', - '#title' => t('Last Column'), - '#default_value' => $options['last_column_classes'], - ); - $form['classes']['row_css'] = array( - '#type' => 'fieldset', - '#title' => t('Row'), - '#prefix' => '
', - '#suffix' => '
', - ); - $form['classes']['row_css']['row_classes'] = array( - '#type' => 'textfield', - '#title' => t('Every Row'), - '#default_value' => $options['row_classes'], - ); - $form['classes']['row_css']['first_row_classes'] = array( - '#type' => 'textfield', - '#title' => t('First Row'), - '#default_value' => $options['first_row_classes'], - ); - $form['classes']['row_css']['last_row_classes'] = array( - '#type' => 'textfield', - '#title' => t('Last Row'), - '#default_value' => $options['last_row_classes'], - ); - } -}