Як я можу змінити значення фільтра і змінити вихід, перш ніж подання перегляду?


15

Використовуючи Drupal 7 та Views 3, що є правильним способом змінити значення фільтра Views так, щоб воно впливало на вміст, який збирається відобразити?

Я спробував усе, що тут було сказано для D6.

Незважаючи на те, що мало хто змусив його працювати, Мерлін заявляє, що змінити параметри display_options є невірним способом цього досягти, але він неясний у своїй відповіді, що робити ( http://drupal.org/node/789710#comment- 2927556 ).

Я намагався:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

Примітки:

1) У мене створено вигляд, який називається, north_carolinaякий має два типи дисплеїв - сторінку та блок (page_1 та block_1).

2) мої фільтри однакові на моїх дисплеях, тому я намагаюся змінити дисплей "за замовчуванням", щоб він впливав на всі вони.

3) Значення мого фільтра за замовчуванням - "Північна Кароліна" (яке я встановив у інтерфейсі Views), але зауважте, що я намагаюся змінити його на "Грузія"

4) Якщо я запускаю DSM одразу після цього, я бачу, що фільтр змінено, однак у моїх результатах все ще є результати "Північна Кароліна". Кешування вимкнено, і я все одно отримую те ж саме після запуску барабанного куб.

Я також спробував запустити той самий код через hook_views_pre_buildі hook_views_pre_execute.

Будь-які пропозиції?

Редагувати:

За пропозицією, можливо, допоможе отримати додаткову інформацію. Ось дамп виду:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

Зауважте, що ці обробники надаються модулем розташування. Спеціально для фільтра "Місцезнаходження: Провінція" мені надається автоматично заповнена форма. Коли я набираю Північну Кароліну, вона спливає, і я повинен вибрати це. Однак в зауваженні SQL, що погляди генерують, використовується два абревіатури для стану:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

Відповіді:


8

Визначити точну частину об'єктів поглядів, які можна змінити, може бути важко. Я, як правило, спочатку експортую представлення даних і переглядаю створений код, щоб розпочати мене.

Нижче наведений фрагмент немодифікований і працює, як очікувалося, на одному з моїх виробничих майданчиків. Сподіваємось, цього достатньо, щоб ви рухалися в правильному напрямку (очевидно, це в спеціальному модулі з назвою offer_select). Якщо ви можете надати код із експортованого виду, хтось, можливо, зможе подивитися.

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

- UPDATE -
для вашого конкретного подання я встановив модуль Location і створив декілька вузлів у NC та декілька в Грузії та імпортував ваш погляд для тестування. У своєму спеціальному модулі (названому dev) я почав із цього коду (із встановленим devel):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

Звідти я продовжував додавати в масив очевидні значення, відображені в krumo, поки не потрапив сюди:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

Який просто надрукований North Carolinaу Крумо. У цей момент я змінив від друку значення до встановлення його таким чином:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

І вуаля. Це зробило трюк.


Класно. Коли у мене є можливість, я пограю з вашим поглядом і побачу, чи зможу я знайти більш конкретну відповідь.
Адам Бальзам

@ blue928 див. вище. Я оновив свою відповідь відповіддю, специфічною для ваших питань та загальними вказівками про те, як я потрапив туди.
Адам Бальзам

що працювало чудово. Примітка щодо правильної відповіді: Частина моєї проблеми полягає в тому, що мені не потрібно було дзвонити views_get_view або встановлювати дисплей.
blue928

2

У випадку, якщо у когось з’явилася ця нитка під час пошуку того самого рішення на D8 (як я):

Новий API дозволяє маніпулювати цими параметрами набагато більш чітко. Дивіться цей розділ для довідок.

Невеликий приклад

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.