View source
<?php
class views_random_seed_handler_sort_random extends views_handler_sort {
function option_definition() {
$options = parent::option_definition();
$options['user_seed_type'] = array(
'default' => 'same_per_user',
);
$options['reset_seed_int'] = array(
'default' => '3600',
);
$options['reset_seed_custom'] = array(
'default' => '300',
);
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$form['order']['#access'] = FALSE;
$form['user_seed_type'] = array(
'#type' => 'radios',
'#title' => t('User seed type'),
'#options' => array(
'same_per_user' => t('Use the same seed for every user'),
'diff_per_user' => t('Use a different seed per user'),
'custom' => t('Use custom PHP code'),
),
'#default_value' => isset($this->options['user_seed_type']) ? $this->options['user_seed_type'] : 'same_per_user',
);
$form['reset_seed_int'] = array(
'#type' => 'radios',
'#title' => t('Reset seed'),
'#options' => array(
'never' => t('Never'),
'custom' => t('Custom'),
'3600' => t('Every hour'),
'28800' => t('Every day'),
),
'#default_value' => isset($this->options['reset_seed_int']) ? $this->options['reset_seed_int'] : '3600',
);
$form['reset_seed_custom'] = array(
'#type' => 'textfield',
'#size' => 10,
'#title' => t('Custom reset seed'),
'#required' => TRUE,
'#default_value' => isset($this->options['reset_seed_custom']) ? $this->options['reset_seed_custom'] : '300',
'#description' => t('Define your own custom reset time, a number which are seconds. Choose custom in the options above.'),
);
$form['custom_seed'] = array(
'#type' => 'textarea',
'#title' => t('Custom PHP code'),
'#description' => t('PHP code, must return a string. Do not include <?php and ?> tags, this is passed through <code>eval()</code>.'),
'#default_value' => isset($this->options['custom_seed']) ? $this->options['custom_seed'] : NULL,
);
$form['cache_strategy'] = array(
'#type' => 'item',
'#title' => t('Cache exclude'),
'#description' => t('If you enable page caching, anonymous users might get duplicate items depending on their seed and which pages are allready cached by Drupal. If you wish to exclude paths from getting cached for anonymous users, install <a href="!url" target="_blank">Cache exclude</a>.', array(
'!url' => 'http://drupal.org/project/cacheexclude',
)),
);
}
function query() {
global $db_type;
$seed = views_random_seed_calculate_seed($this->options, $this->view->name, $this->view->current_display, $db_type);
if ($this->view->base_table == 'apachesolr_node') {
$order = 'asc';
$formula = 'random_' . $seed;
$this->query
->add_sort($formula, $order);
}
else {
switch ($db_type) {
case 'mysql':
case 'mysqli':
$formula = 'RAND(' . $seed . ')';
break;
case 'pgsql':
db_query('select setseed(' . $seed . ')');
$res = db_result(db_query("select random()"));
$formula = 'RANDOM()';
break;
}
$this->query
->add_orderby(NULL, $formula, $this->options['order'], '_' . $this->field);
}
}
}
function views_random_seed_calculate_seed($options, $view_name, $display, $db_type) {
$time = time();
$seed_name = 'views_seed_name-' . $view_name . '-' . $display;
$seed_time = 'views_seed_time-' . $view_name . '-' . $display;
$seed = isset($_SESSION[$seed_name]) ? $_SESSION[$seed_name] : FALSE;
if ($options['user_seed_type'] == 'custom') {
$seed = eval($options['custom_seed']);
return (int) $seed;
}
if ($seed == FALSE) {
$seed = _views_random_seed_generate_seed($options['user_seed_type'], $seed_name, $seed_time, $time, $db_type);
}
if ($options['reset_seed_int'] != 'never') {
$reset_time = $options['reset_seed_int'] == 'custom' ? $options['reset_seed_custom'] : $options['reset_seed_int'];
if ($_SESSION[$seed_time] + $reset_time < $time) {
variable_del($seed_name);
$seed = _views_random_seed_generate_seed($options['user_seed_type'], $seed_name, $seed_time, $time, $db_type);
}
}
return $seed;
}
function _views_random_seed_generate_seed($user_seed_type, $seed_name, $seed_time, $time, $db_type) {
if ($user_seed_type == 'diff_per_user') {
$seed = _views_random_seed_create_int($time, $db_type);
}
else {
$seed = variable_get($seed_name, FALSE);
if ($seed == FALSE) {
$seed = _views_random_seed_create_int($time, $db_type);
variable_set($seed_name, $seed);
}
}
$_SESSION[$seed_time] = $time;
$_SESSION[$seed_name] = $seed;
return $seed;
}
function _views_random_seed_create_int($time, $db_type) {
switch ($db_type) {
case 'mysql':
case 'mysqli':
return $time;
break;
case 'pgsql':
$seed = $time / 10000000000;
return $seed;
break;
}
}