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
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;
}
}