Установка друпал-представления на случайный номер страницы - PullRequest
4 голосов
/ 20 сентября 2010

У меня установлено 2 представления, и я создал вид, отображаемый на первой странице.

В представлении отображаются некоторые ссылки на страницы (1 | 2 | 3 | 4 | ... и т. Д.). Я хочу знать, возможно ли сделать так, чтобы представление начиналось со случайной страницы, а не всегда со страницы 1.

Примечание: я не хочу рандомизировать отображение, я просто хочу рандомизировать страницу, которую он загружает.

Спасибо

Возможное решение:

В хуке views_pre_execute я использовал это:

$view->query->pager->set_current_page([random value]);

Я не уверен, что могу определить общее количество страниц в пейджере в настоящее время, но я собираюсь продолжить расследование (Объект $ view, представленный в хуке, имеет множество свойств с массивами и другими объектами, что усложняет это )

Ответы [ 3 ]

2 голосов
/ 21 сентября 2010

Другим вариантом будет рандомизировать записи в ваших представлениях. Таким образом, ваша страница всегда будет страницей 1, но она достигает вашей цели - видеть каждый раз что-то новое на вашем сайте.

В ваших критериях сортировки (в Глобальной группе) добавьте Global: Random - рандомизировать порядок отображения.

(Вдохновленный предложением в http://mydrupal.com/random_node_or_front_page_in_drupal_like_stumbleupon)

2 голосов
/ 21 сентября 2010

Я не знаю, как это сделать из пользовательского интерфейса Views, но вы должны быть в состоянии достичь этого, используя один из перехватывает модуль views , в этом случае, вероятно, hook_views_pre_execute. К сожалению, документации для них практически не существует, поэтому вам нужно реализовать ловушку в пользовательском модуле и проверить переданный объект view через отладчик (или операторы print, var_dump и т. Д.).

Вы должны искать $view->pager['current_page'], который вы можете установить на случайную страницу. К сожалению, если я правильно прочитал код, запрос подсчета, который определяет возможное количество страниц, еще не выполняется на этом этапе, поэтому вам придется либо использовать «наилучшее предположение», либо придумать другой способ определения правильный диапазон, чтобы выбрать из ...

ПРИМЕЧАНИЕ. Это ни в коем случае не означает «авторитетный» ответ - просто указатель, на котором я бы начал искать, поскольку никто еще не ответил на этот вопрос. Я мог бы упустить более очевидное / простое решение: /

1 голос
/ 15 марта 2012

Я только что создал пользовательский пейджер, который автоматически переходит на последнюю страницу, и я думаю, что это связано с тем, что вы пытаетесь сделать:

В project.info:

files[] = plugins/views_plugin_pager_last.inc

В проекте. Модуль:

function cvoxm_views_plugins(){
  return array(
    'pager' => array(
      'last' => array(
        'title' => t('Paged output, full pager and last by default'),
        'short title' => t('Full & Last'),
        'help' => t('Paged output, full Drupal style and last by default'),
        'handler' => 'views_plugin_pager_last',
        'help topic' => 'pager-last',
        'uses options' => TRUE,
      ),
    )
  );
}

А содержание плагинов / views_plugin_pager_last.inc равно:

class views_plugin_pager_last extends views_plugin_pager_full {

  function pre_execute(&$query) {
    if(!isset($_GET['page'])){ // TODO: Should use pager_id
      // Go to last page
      $this->set_current_page($this->get_total_items() / $this->get_items_per_page() - 1 );
      $this->query(); // Rebuild query
      $this->update_page_info(); // Update info
    }
  }
}
...