views_handler_filter_history_user_timestamp.inc

Same filename in other branches
  1. 6.x-3.x modules/node/views_handler_filter_history_user_timestamp.inc

Definition of views_handler_filter_history_user_timestamp.

File

modules/node/views_handler_filter_history_user_timestamp.inc

View source
<?php


/**
 * @file
 * Definition of views_handler_filter_history_user_timestamp.
 */

/**
 * Filter for new content.
 *
 * The handler is named history_user, because of compability reasons, the table
 * is history.
 *
 * @ingroup views_filter_handlers
 */
class views_handler_filter_history_user_timestamp extends views_handler_filter {
    
    /**
     * Don't display empty space where the operator would be.
     */
    public $no_operator = TRUE;
    
    /**
     * {@inheritdoc}
     */
    public function expose_form(&$form, &$form_state) {
        parent::expose_form($form, $form_state);
        // @todo There are better ways of excluding required and multiple (object flags)
        unset($form['expose']['required']);
        unset($form['expose']['multiple']);
        unset($form['expose']['remember']);
    }
    
    /**
     * {@inheritdoc}
     */
    public function value_form(&$form, &$form_state) {
        // Only present a checkbox for the exposed filter itself. There's no way
        // to tell the difference between not checked and the default value, so
        // specifying the default value via the views UI is meaningless.
        if (!empty($form_state['exposed'])) {
            if (isset($this->options['expose']['label'])) {
                $label = $this->options['expose']['label'];
            }
            else {
                $label = t('Has new content');
            }
            $form['value'] = array(
                '#type' => 'checkbox',
                '#title' => $label,
                '#default_value' => $this->value,
            );
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public function query() {
        global $user;
        // This can only work if we're logged in.
        if (!$user || !$user->uid) {
            return;
        }
        // Don't filter if we're exposed and the checkbox isn't selected.
        if (!empty($this->options['exposed']) && empty($this->value)) {
            return;
        }
        // Hey, Drupal kills old history, so nodes that haven't been updated
        // since NODE_NEW_LIMIT are bzzzzzzzt outta here!
        $limit = REQUEST_TIME - NODE_NEW_LIMIT;
        $this->ensure_my_table();
        $field = "{$this->table_alias}.{$this->real_field}";
        $node = $this->query
            ->ensure_table('node', $this->relationship);
        $clause = '';
        $clause2 = '';
        if (module_exists('comment')) {
            $ncs = $this->query
                ->ensure_table('node_comment_statistics', $this->relationship);
            $clause = "OR {$ncs}.last_comment_timestamp > (***CURRENT_TIME*** - {$limit})";
            $clause2 = "OR {$field} < {$ncs}.last_comment_timestamp";
        }
        // NULL means a history record doesn't exist. That's clearly new content.
        // Unless it's very very old content. Everything in the query is already
        // type safe cause none of it is coming from outside here.
        $this->query
            ->add_where_expression($this->options['group'], "({$field} IS NULL AND ({$node}.changed > (***CURRENT_TIME*** - {$limit}) {$clause})) OR {$field} < {$node}.changed {$clause2}");
    }
    
    /**
     * {@inheritdoc}
     */
    public function admin_summary() {
        if (!empty($this->options['exposed'])) {
            return t('exposed');
        }
    }

}

Classes

Title Deprecated Summary
views_handler_filter_history_user_timestamp Filter for new content.