필터 값을 변경하고 뷰가 렌더링되기 전에 출력을 변경하려면 어떻게해야합니까?


15

Drupal 7 및 Views 3을 사용할 때 뷰 필터 값을 변경하여 렌더링하려는 컨텐츠에 영향을주는 올바른 방법은 무엇입니까?

D6에 대해 여기 에 언급 된 모든 것을 시도했습니다 .

Merlin은 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) 필터의 기본값은 'North Carolina'(View UI에서 설정)이지만 'Georgia'로 변경하려고합니다.

4) 직후 DSM을 실행하면 필터가 변경되었음을 알 수 있지만 결과에는 여전히 '노쓰 캐롤라이나'결과가 표시됩니다. 캐싱이 꺼져 있고 drush cc all을 실행 한 후에도 여전히 동일한 내용을 얻습니다.

또한 hook_views_pre_buildand를 통해 동일한 코드를 실행하려고했습니다 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();
  }
}

-업데이트-
특정 뷰에 대해 위치 모듈을 설치하고 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 CarolinaKrumo로 간단히 인쇄 되었습니다. 그 시점에서 나는 값 인쇄에서 다음과 같이 설정으로 변경했습니다.

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

그리고 짜잔. 그 트릭을했다.


멋있는. 기회가 생길 때 나는 당신의 견해를 가지고 놀면서 더 구체적인 답을 얻을 수 있는지 봅니다.
Adam Balsam

@ blue928 위를 참조하십시오. 귀하의 질문과 답변에 대한 일반적인 지침으로 답변을 업데이트했습니다.
Adam Balsam

잘 작동했습니다. 정답에 대한 참고 사항 : 내 문제의 일부는 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';
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.