From 30e1afed5682aa74ce4e4d9a05120e01e8e0143c Mon Sep 17 00:00:00 2001
From: Tim Plunkett <git@plnktt.com>
Date: Thu, 23 Aug 2012 16:29:53 +0200
Subject: [PATCH] Issue #1744334 by dawehner: Move uses_row_class(),
 uses_row_plugin(), and uses_fields() from plugin annotation to a class
 property.

---
 includes/admin.inc                            |  4 +-
 .../views/display/DisplayPluginBase.php       | 20 ++---
 .../views/Plugin/views/filter/Combine.php     |  2 +-
 lib/Drupal/views/Plugin/views/row/Fields.php  |  8 +-
 .../views/Plugin/views/row/RowPluginBase.php  | 16 +++-
 .../views/Plugin/views/row/RssFields.php      |  8 +-
 .../views/Plugin/views/style/DefaultStyle.php | 16 +++-
 lib/Drupal/views/Plugin/views/style/Grid.php  | 17 ++++-
 .../views/Plugin/views/style/HtmlList.php     | 16 +++-
 lib/Drupal/views/Plugin/views/style/Rss.php   |  8 +-
 .../Plugin/views/style/StylePluginBase.php    | 75 +++++++++++++------
 lib/Drupal/views/Plugin/views/style/Table.php | 24 +++++-
 .../Plugin/views/wizard/WizardPluginBase.php  |  4 +-
 lib/Drupal/views/View.php                     |  4 +-
 14 files changed, 168 insertions(+), 54 deletions(-)

diff --git a/includes/admin.inc b/includes/admin.inc
index 8d9bce485f62..15c5c4f8d5cc 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -2054,7 +2054,7 @@ function views_ui_import_validate($form, &$form_state) {
         drupal_set_message(t('Style plugin @plugin is not available.', array('@plugin' => $display->handler->get_option('style_plugin'))), 'error');
         $broken = TRUE;
       }
-      elseif ($plugin->uses_row_plugin()) {
+      elseif ($plugin->usesRowPlugin()) {
         $plugin = views_get_plugin('row', $display->handler->get_option('row_plugin'));
         if (!$plugin) {
           drupal_set_message(t('Row plugin @plugin is not available.', array('@plugin' => $display->handler->get_option('row_plugin'))), 'error');
@@ -2210,7 +2210,7 @@ function views_ui_edit_form_get_bucket($type, $view, $display) {
     case 'field':
       // Fetch the style plugin info so we know whether to list fields or not.
       $style_plugin = $display->handler->get_plugin();
-      $uses_fields = $style_plugin && $style_plugin->uses_fields();
+      $uses_fields = $style_plugin && $style_plugin->usesFields();
       if (!$uses_fields) {
         $build['fields'][] = array(
           '#markup' => t('The selected style or row format does not utilize fields.'),
diff --git a/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
index 30a199158bb0..e683180fc624 100644
--- a/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php
@@ -843,11 +843,13 @@ function get_option($option) {
 
   /**
    * Determine if the display's style uses fields.
+   *
+   * @return bool
    */
-  function uses_fields() {
-    $plugin = $this->get_plugin();
+  function usesFields() {
+    $plugin = $this->get_plugin('style');
     if ($plugin) {
-      return $plugin->uses_fields();
+      return $plugin->usesFields();
     }
   }
 
@@ -1218,7 +1220,7 @@ function options_summary(&$categories, &$options) {
       $options['style_plugin']['links']['style_options'] = t('Change settings for this format');
     }
 
-    if (!empty($style_plugin['uses_row_plugin'])) {
+    if ($style_plugin_instance->usesRowPlugin()) {
       $manager = new ViewsPluginManager('row');
       $row_plugin = $manager->getDefinition($this->get_option('row_plugin'));
       $row_plugin_instance = $this->get_plugin('row');
@@ -1947,7 +1949,7 @@ function options_form(&$form, &$form_state) {
             }
           }
 
-          if ($plugin->uses_row_plugin()) {
+          if ($plugin->usesRowPlugin()) {
             $row_plugin = $this->get_plugin('row');
             if ($row_plugin) {
               $funcs[] = $this->option_link(t('Row style output'), 'analyze-theme-row') . ': ' . $this->format_themes($row_plugin->theme_functions());
@@ -1960,7 +1962,7 @@ function options_form(&$form, &$form_state) {
             }
           }
 
-          if ($plugin->uses_fields()) {
+          if ($plugin->usesFields()) {
             foreach ($this->get_handlers('field') as $id => $handler) {
               $funcs[] = $this->option_link(t('Field @field (ID: @id)', array('@field' => $handler->ui_name(), '@id' => $id)), 'analyze-theme-field') . ': ' . $this->format_themes($handler->theme_functions());
             }
@@ -2729,7 +2731,7 @@ function get_style_type() { return 'normal'; }
   function validate() {
     $errors = array();
     // Make sure displays that use fields HAVE fields.
-    if ($this->uses_fields()) {
+    if ($this->usesFields()) {
       $fields = FALSE;
       foreach ($this->get_handlers('field') as $field) {
         if (empty($field->options['exclude'])) {
@@ -2946,7 +2948,7 @@ function export_style($indent, $prefix, $storage, $option, $definition, $parents
       $plugin = $style_plugin;
     }
     else {
-      if (!$style_plugin || !$style_plugin->uses_row_plugin()) {
+      if (!$style_plugin || !$style_plugin->usesRowPlugin()) {
         return;
       }
 
@@ -3007,7 +3009,7 @@ function unpack_style($indent, $prefix, $storage, $option, $definition, $parents
       $plugin = $style_plugin;
     }
     else {
-      if (!$style_plugin || !$style_plugin->uses_row_plugin()) {
+      if (!$style_plugin || !$style_plugin->usesRowPlugin()) {
         return;
       }
 
diff --git a/lib/Drupal/views/Plugin/views/filter/Combine.php b/lib/Drupal/views/Plugin/views/filter/Combine.php
index e0e99c985686..fb2571675d4b 100644
--- a/lib/Drupal/views/Plugin/views/filter/Combine.php
+++ b/lib/Drupal/views/Plugin/views/filter/Combine.php
@@ -37,7 +37,7 @@ function options_form(&$form, &$form_state) {
     $this->view->init_style();
 
     // Allow to choose all fields as possible
-    if ($this->view->style_plugin->uses_fields()) {
+    if ($this->view->style_plugin->usesFields()) {
       $options = array();
       foreach ($this->view->display_handler->get_handlers('field') as $name => $field) {
         $options[$name] = $field->ui_name(TRUE);
diff --git a/lib/Drupal/views/Plugin/views/row/Fields.php b/lib/Drupal/views/Plugin/views/row/Fields.php
index e56203c0c886..462940967450 100644
--- a/lib/Drupal/views/Plugin/views/row/Fields.php
+++ b/lib/Drupal/views/Plugin/views/row/Fields.php
@@ -23,13 +23,19 @@
  *   title = @Translation("Fields"),
  *   help = @Translation("Displays the fields with an optional template."),
  *   theme = "views_view_fields",
- *   uses_fields = TRUE,
  *   type = "normal",
  *   help_topic = "style-row-fields"
  * )
  */
 class Fields extends RowPluginBase {
 
+  /**
+   * Does the row plugin support to add fields to it's output.
+   *
+   * @var bool
+   */
+  public $usesFields = TRUE;
+
   function option_definition() {
     $options = parent::option_definition();
 
diff --git a/lib/Drupal/views/Plugin/views/row/RowPluginBase.php b/lib/Drupal/views/Plugin/views/row/RowPluginBase.php
index 50d7cfe74c25..7474379708a2 100644
--- a/lib/Drupal/views/Plugin/views/row/RowPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/row/RowPluginBase.php
@@ -31,6 +31,13 @@ abstract class RowPluginBase extends PluginBase {
    */
   public $usesOptions = TRUE;
 
+  /**
+   * Does the row plugin support to add fields to it's output.
+   *
+   * @var bool
+   */
+  public $usesFields = FALSE;
+
   /**
    * Initialize the row plugin.
    */
@@ -42,8 +49,13 @@ function init(&$view, &$display, $options = NULL) {
     $this->unpack_options($this->options, isset($options) ? $options : $display->handler->get_option('row_options'));
   }
 
-  function uses_fields() {
-    return !empty($this->definition['uses_fields']);
+  /**
+   * Returns the usesFields property.
+   *
+   * @return bool
+   */
+  function usesFields() {
+    return $this->usesFields;
   }
 
 
diff --git a/lib/Drupal/views/Plugin/views/row/RssFields.php b/lib/Drupal/views/Plugin/views/row/RssFields.php
index 3668bdfe6adb..92b5b1e4642e 100644
--- a/lib/Drupal/views/Plugin/views/row/RssFields.php
+++ b/lib/Drupal/views/Plugin/views/row/RssFields.php
@@ -18,13 +18,19 @@
  *   title = @Translation("Fields"),
  *   help = @Translation("Display fields as RSS items."),
  *   theme = "views_view_row_rss",
- *   uses_fields = TRUE,
  *   type = "feed",
  *   help_topic = "style-row-fields"
  * )
  */
 class RssFields extends RowPluginBase {
 
+  /**
+   * Does the row plugin support to add fields to it's output.
+   *
+   * @var bool
+   */
+  public $usesFields = TRUE;
+
   function option_definition() {
     $options = parent::option_definition();
     $options['title_field'] = array('default' => '');
diff --git a/lib/Drupal/views/Plugin/views/style/DefaultStyle.php b/lib/Drupal/views/Plugin/views/style/DefaultStyle.php
index 9c505f6f0cbe..b2356ebe237a 100644
--- a/lib/Drupal/views/Plugin/views/style/DefaultStyle.php
+++ b/lib/Drupal/views/Plugin/views/style/DefaultStyle.php
@@ -21,8 +21,6 @@
  *   title = @Translation("Unformatted list"),
  *   help = @Translation("Displays rows one after another."),
  *   theme = "views_view_unformatted",
- *   uses_row_plugin = TRUE,
- *   uses_row_class = TRUE,
  *   uses_grouping = TRUE,
  *   type = "normal",
  *   help_topic = "style-unformatted"
@@ -30,6 +28,20 @@
  */
 class DefaultStyle extends StylePluginBase {
 
+  /**
+   * Does the style plugin allows to use style plugins.
+   *
+   * @var bool
+   */
+  public $usesRowPlugin = TRUE;
+
+  /**
+   * Does the style plugin support custom css class for the rows.
+   *
+   * @var bool
+   */
+  public $usesRowClass = TRUE;
+
   /**
    * Set default options
    */
diff --git a/lib/Drupal/views/Plugin/views/style/Grid.php b/lib/Drupal/views/Plugin/views/style/Grid.php
index c191747e790c..32f04c901a5b 100644
--- a/lib/Drupal/views/Plugin/views/style/Grid.php
+++ b/lib/Drupal/views/Plugin/views/style/Grid.php
@@ -20,15 +20,26 @@
  *   title = @Translation("Grid"),
  *   help = @Translation("Displays rows in a grid."),
  *   theme = "views_view_grid",
- *   uses_fields = FALSE,
- *   uses_row_plugin = TRUE,
- *   uses_row_class = TRUE,
  *   type = "normal",
  *   help_topic = "style-grid"
  * )
  */
 class Grid extends StylePluginBase {
 
+  /**
+   * Does the style plugin allows to use style plugins.
+   *
+   * @var bool
+   */
+  public $usesRowPlugin = TRUE;
+
+  /**
+   * Does the style plugin support custom css class for the rows.
+   *
+   * @var bool
+   */
+  public $usesRowClass = TRUE;
+
   /**
    * Set default options
    */
diff --git a/lib/Drupal/views/Plugin/views/style/HtmlList.php b/lib/Drupal/views/Plugin/views/style/HtmlList.php
index bde8ad805be3..ac3a60aeaf41 100644
--- a/lib/Drupal/views/Plugin/views/style/HtmlList.php
+++ b/lib/Drupal/views/Plugin/views/style/HtmlList.php
@@ -20,14 +20,26 @@
  *   title = @Translation("HTML List"),
  *   help = @Translation("Displays rows as HTML list."),
  *   theme = "views_view_list",
- *   uses_row_plugin = TRUE,
- *   uses_row_class = TRUE,
  *   type = "normal",
  *   help_topic = "style-list"
  * )
  */
 class HtmlList extends StylePluginBase {
 
+  /**
+   * Does the style plugin allows to use style plugins.
+   *
+   * @var bool
+   */
+  public $usesRowPlugin = TRUE;
+
+  /**
+   * Does the style plugin support custom css class for the rows.
+   *
+   * @var bool
+   */
+  public $usesRowClass = TRUE;
+
   /**
    * Set default options
    */
diff --git a/lib/Drupal/views/Plugin/views/style/Rss.php b/lib/Drupal/views/Plugin/views/style/Rss.php
index 663e30f4869b..e54c1050d642 100644
--- a/lib/Drupal/views/Plugin/views/style/Rss.php
+++ b/lib/Drupal/views/Plugin/views/style/Rss.php
@@ -20,13 +20,19 @@
  *   title = @Translation("RSS Feed"),
  *   help = @Translation("Generates an RSS feed from a view."),
  *   theme = "views_view_rss",
- *   uses_row_plugin = TRUE,
  *   type = "feed",
  *   help_topic = "style-rss"
  * )
  */
 class Rss extends StylePluginBase {
 
+  /**
+   * Does the style plugin for itself support to add fields to it's output.
+   *
+   * @var bool
+   */
+  public $usesRowPlugin = TRUE;
+
   function attach_to($display_id, $path, $title) {
     $display = $this->view->display[$display_id]->handler;
     $url_options = array();
diff --git a/lib/Drupal/views/Plugin/views/style/StylePluginBase.php b/lib/Drupal/views/Plugin/views/style/StylePluginBase.php
index af1a595e1d77..e60b2ea89831 100644
--- a/lib/Drupal/views/Plugin/views/style/StylePluginBase.php
+++ b/lib/Drupal/views/Plugin/views/style/StylePluginBase.php
@@ -48,6 +48,30 @@ abstract class StylePluginBase extends PluginBase {
    */
   var $row_plugin;
 
+  /**
+   * Does the style plugin allows to use style plugins.
+   *
+   * @var bool
+   */
+  public $usesRowPlugin = FALSE;
+
+  /**
+   * Does the style plugin support custom css class for the rows.
+   *
+   * @var bool
+   */
+  public $usesRowClass = FALSE;
+
+  /**
+   * Does the style plugin for itself support to add fields to it's output.
+   *
+   * This option only makes sense on style plugins without row plugins, like
+   * for example table.
+   *
+   * @var bool
+   */
+  public $usesFields = FALSE;
+
   /**
    * Initialize a style plugin.
    *
@@ -64,7 +88,7 @@ function init(&$view, &$display, $options = NULL) {
     // Overlay incoming options on top of defaults
     $this->unpack_options($this->options, isset($options) ? $options : $display->handler->get_option('style_options'));
 
-    if ($this->uses_row_plugin() && $display->handler->get_option('row_plugin')) {
+    if ($this->usesRowPlugin() && $display->handler->get_option('row_plugin')) {
       $this->row_plugin = $display->handler->get_plugin('row');
     }
 
@@ -86,17 +110,22 @@ function destroy() {
   }
 
   /**
-   * Return TRUE if this style also uses a row plugin.
+   * Returns the usesRowPlugin property.
+   *
+   * @return bool
    */
-  function uses_row_plugin() {
-    return !empty($this->definition['uses_row_plugin']);
+  function usesRowPlugin() {
+    return $this->usesRowPlugin;
+
   }
 
   /**
-   * Return TRUE if this style also uses a row plugin.
+   * Returns the usesRowClass property.
+   *
+   * @return bool
    */
-  function uses_row_class() {
-    return !empty($this->definition['uses_row_class']);
+  function usesRowClass() {
+    return $this->usesRowClass;
   }
 
   /**
@@ -104,15 +133,15 @@ function uses_row_class() {
    *
    * @return bool
    */
-  function uses_fields() {
+  function usesFields() {
     // If we use a row plugin, ask the row plugin. Chances are, we don't
     // care, it does.
     $row_uses_fields = FALSE;
-    if ($this->uses_row_plugin() && !empty($this->row_plugin)) {
-      $row_uses_fields = $this->row_plugin->uses_fields();
+    if ($this->usesRowPlugin() && !empty($this->row_plugin)) {
+      $row_uses_fields = $this->row_plugin->usesFields();
     }
     // Otherwise, check the definition or the option.
-    return $row_uses_fields || !empty($this->definition['uses_fields']) || !empty($this->options['uses_fields']);
+    return $row_uses_fields || $this->usesFields || !empty($this->options['uses_fields']);
   }
 
   /**
@@ -121,7 +150,7 @@ function uses_fields() {
    * Used to ensure we don't fetch tokens when not needed for performance.
    */
   function uses_tokens() {
-    if ($this->uses_row_class()) {
+    if ($this->usesRowClass()) {
       $class = $this->options['row_class'];
       if (strpos($class, '[') !== FALSE || strpos($class, '!') !== FALSE || strpos($class, '%') !== FALSE) {
         return TRUE;
@@ -133,9 +162,9 @@ function uses_tokens() {
    * Return the token replaced row class for the specified row.
    */
   function get_row_class($row_index) {
-    if ($this->uses_row_class()) {
+    if ($this->usesRowClass()) {
       $class = $this->options['row_class'];
-      if ($this->uses_fields() && $this->view->field) {
+      if ($this->usesFields() && $this->view->field) {
         $class = strip_tags($this->tokenize_value($class, $row_index));
       }
 
@@ -181,7 +210,7 @@ function even_empty() {
   function option_definition() {
     $options = parent::option_definition();
     $options['grouping'] = array('default' => array());
-    if ($this->uses_row_class()) {
+    if ($this->usesRowClass()) {
       $options['row_class'] = array('default' => '');
       $options['default_row_class'] = array('default' => TRUE, 'bool' => TRUE);
       $options['row_class_special'] = array('default' => TRUE, 'bool' => TRUE);
@@ -197,7 +226,7 @@ function options_form(&$form, &$form_state) {
     // themselves from being groupable by setting their "use grouping" definiton
     // key to FALSE.
     // @TODO: Document "uses grouping" in docs.php when docs.php is written.
-    if ($this->uses_fields() && $this->definition['uses_grouping']) {
+    if ($this->usesFields() && $this->definition['uses_grouping']) {
       $options = array('' => t('- None -'));
       $field_labels = $this->display->handler->get_field_labels(TRUE);
       $options += $field_labels;
@@ -251,7 +280,7 @@ function options_form(&$form, &$form_state) {
       }
     }
 
-    if ($this->uses_row_class()) {
+    if ($this->usesRowClass()) {
       $form['row_class'] = array(
         '#title' => t('Row class'),
         '#description' => t('The class to provide on each row.'),
@@ -259,7 +288,7 @@ function options_form(&$form, &$form_state) {
         '#default_value' => $this->options['row_class'],
       );
 
-      if ($this->uses_fields()) {
+      if ($this->usesFields()) {
         $form['row_class']['#description'] .= ' ' . t('You may use field tokens from as per the "Replacement patterns" used in "Rewrite the output of this field" for all fields.');
       }
 
@@ -277,7 +306,7 @@ function options_form(&$form, &$form_state) {
       );
     }
 
-    if (!$this->uses_fields() || !empty($this->options['uses_fields'])) {
+    if (!$this->usesFields() || !empty($this->options['uses_fields'])) {
       $form['uses_fields'] = array(
         '#type' => 'checkbox',
         '#title' => t('Force using fields'),
@@ -328,7 +357,7 @@ function pre_render($result) {
    * Render the display in this style.
    */
   function render() {
-    if ($this->uses_row_plugin() && empty($this->row_plugin)) {
+    if ($this->usesRowPlugin() && empty($this->row_plugin)) {
       vpr('Drupal\views\Plugin\views\style\StylePluginBase: Missing row plugin');
       return;
     }
@@ -374,7 +403,7 @@ function render_grouping_sets($sets, $level = 0) {
       }
       // Render as a record set.
       else {
-        if ($this->uses_row_plugin()) {
+        if ($this->usesRowPlugin()) {
           foreach ($set['rows'] as $index => $row) {
             $this->view->row_index = $index;
             $set['rows'][$index] = $this->row_plugin->render($row);
@@ -523,7 +552,7 @@ function render_grouping($records, $groupings = array(), $group_rendered = NULL)
    *   The result array from $view->result
    */
   function render_fields($result) {
-    if (!$this->uses_fields()) {
+    if (!$this->usesFields()) {
       return;
     }
 
@@ -586,7 +615,7 @@ function get_field_value($index, $field) {
   function validate() {
     $errors = parent::validate();
 
-    if ($this->uses_row_plugin()) {
+    if ($this->usesRowPlugin()) {
       $plugin = $this->display->handler->get_plugin('row');
       if (empty($plugin)) {
         $errors[] = t('Style @style requires a row style but the row plugin is invalid.', array('@style' => $this->definition['title']));
diff --git a/lib/Drupal/views/Plugin/views/style/Table.php b/lib/Drupal/views/Plugin/views/style/Table.php
index 8af270b4d75e..3a9615b4549b 100644
--- a/lib/Drupal/views/Plugin/views/style/Table.php
+++ b/lib/Drupal/views/Plugin/views/style/Table.php
@@ -20,15 +20,33 @@
  *   title = @Translation("Table"),
  *   help = @Translation("Displays rows in a table."),
  *   theme = "views_view_table",
- *   uses_row_plugin = FALSE,
- *   uses_row_class = TRUE,
- *   uses_fields = TRUE,
  *   type = "normal",
  *   help_topic = "style-table"
  * )
  */
 class Table extends StylePluginBase {
 
+  /**
+   * Does the style plugin for itself support to add fields to it's output.
+   *
+   * @var bool
+   */
+  public $usesFields = TRUE;
+
+  /**
+   * Does the style plugin allows to use style plugins.
+   *
+   * @var bool
+   */
+  public $usesRowPlugin = FALSE;
+
+  /**
+   * Does the style plugin support custom css class for the rows.
+   *
+   * @var bool
+   */
+  public $usesRowClass = TRUE;
+
   /**
    * Contains the current active sort column.
    * @var string
diff --git a/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php b/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
index 994f48cd0743..75a79bde2eb4 100644
--- a/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
+++ b/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
@@ -278,7 +278,7 @@ protected function build_form_style(&$form, &$form_state, $type) {
     // @fixme
 
     $style_plugin = views_get_plugin('style', $style);
-    if (isset($style_plugin) && $style_plugin->uses_row_plugin()) {
+    if (isset($style_plugin) && $style_plugin->usesRowPlugin()) {
       $options = $this->row_style_options($type);
       $style_form['row_plugin'] = array(
         '#type' => 'select',
@@ -300,7 +300,7 @@ protected function build_form_style(&$form, &$form_state, $type) {
         '#theme_wrappers' => array('container'),
       );
     }
-    elseif ($style_plugin->uses_fields()) {
+    elseif ($style_plugin->usesFields()) {
       $style_form['row_plugin'] = array('#markup' => '<span>' . t('of fields') . '</span>');
     }
   }
diff --git a/lib/Drupal/views/View.php b/lib/Drupal/views/View.php
index 6cc8baa398e7..371bc7dee0e0 100644
--- a/lib/Drupal/views/View.php
+++ b/lib/Drupal/views/View.php
@@ -1019,7 +1019,7 @@ function build($display_id = NULL) {
       return FALSE;
     }
 
-    if ($this->style_plugin->uses_fields()) {
+    if ($this->style_plugin->usesFields()) {
       $this->_build('field');
     }
 
@@ -1245,7 +1245,7 @@ function render($display_id = NULL) {
 
       // Give field handlers the opportunity to perform additional queries
       // using the entire resultset prior to rendering.
-      if ($this->style_plugin->uses_fields()) {
+      if ($this->style_plugin->usesFields()) {
         foreach ($this->field as $id => $handler) {
           if (!empty($this->field[$id])) {
             $this->field[$id]->pre_render($this->result);
-- 
GitLab