views_plugin_style questions

Events happening in the community are now at Drupal community events on www.drupal.org.
attiks's picture

I'm building a views_plugin_style for the flot module (views 3/drupal 7, see [#961976] for more code)

Part 1

I need to execute an extra query while the query of the view is being executed (inside function query()),
1/ so I first tried to clone the current query using $minmaxview = clone $this->view but all referenced properties aren't cloned,
2/ so I tried $minmaxview = unserialize(serialize($this->view)) but that gives an error "PDOException: You cannot serialize or unserialize PDO instances"

So my questions are:
1/ Is query() the best place to do this ?
2/ How can I clone it so all referenced properties are cloned as well?
3/ Is there a better way to handle this?

Part 2

Is there an easy way I can alter all fields forms so I can add custom properties to them, the goal is to let the user decide how each field has to be displayed, based on the general options as set by the plugin options?

  function query() {
    // get all fields
    $fields = $this->display->handler->handlers['field'];
   
    // extract first field
    $fieldx = array_shift($fields);
    $alias = $fieldx->field_alias;

    // add count field
    $this->view->query->add_field(NULL, 'count(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . ')', "count");
   
    if (isset($fieldx->options['date_format'])) {
      // calculate a sane interval for datetime fields
     
      $minmaxview = unserialize(serialize($this->view)); // clone $this doesn't work????;
      unset($minmaxview->fields);
      $minmaxview->query->fields = array();
      $minmaxview->query->fields[$alias . '_min'] = array(
        'field' => 'MIN(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . ')',
        'table' => '',
        'alias' => $alias . '_min',
      );
      $minmaxview->query->fields[$alias . '_max'] = array(
        'field' => 'MAX(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . ')',
        'table' => '',
        'alias' => $alias . '_max',
      );
      $minmaxview->query->query(FALSE);
      $minmaxview->query->build($minmaxview);
      $minmaxview->query->execute($minmaxview);
      $timeinterval = 86400;
      if (isset($minmaxview->result) && isset($minmaxview->result[0])) {
        $minmax = $minmaxview->result[0];
        $min = $minmax->{$alias . '_min'};
        $max = $minmax->{$alias . '_max'};
        if ($max - $min > 30 * 86400) {
          $timeinterval = 86400;
        }
        elseif ($max - $min > 7 * 86400) {
          $timeinterval = 21600;
        }
        elseif ($max - $min > 3 * 86400) {
          $timeinterval = 10800;
        }
        elseif ($max - $min > 86400) {
          $timeinterval = 3600;
        }
        else {
          $timeinterval = 60;
        }
      }
      $this->view->query->fields[$alias]['field'] = '(ROUND(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . " / $timeinterval) * $timeinterval)";
      $this->view->query->fields[$alias]['table'] = '';
    }
   
    // group by first field
    $groupby[] = $this->view->query->fields[$alias]['alias'];
   
    // group by all other fields as well
    foreach ($fields as $field => $info) {
      $alias = $info->field_alias;
      $groupby[] = $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'];
    }

    $this->view->query->groupby = $groupby;
    $this->view->query->has_aggregate = TRUE;
  }

Comments

cloning

attiks's picture

I might have found a work-around, but not really happy with it

      $minmaxview = new view;
        foreach($this->view as $key => $val) {
          if(is_object($val) && $key != 'query'){
              $minmaxview->{$key} = clone $val;
          }
          elseif(is_array($val)){
              $minmaxview->{$key} = $val;
          }
          else {
              $minmaxview->{$key} = $val;
          }
        }
      $minmaxview->query = new views_plugin_query_default;
        foreach($this->view->query as $key => $val) {
          if(is_object($val)){
              $minmaxview->query->{$key} = clone $val;
          }
          elseif(is_array($val)){
              $minmaxview->query->{$key} = $val;
          }
          else {
              $minmaxview->query->{$key} = $val;
          }
        }

Views Developers

Group organizers

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: