뷰의 호출기 설정을 동적으로 설정할 수 있습니까?


13

예를 들어 특정 노드 유형을 볼 때 표시되는보기가 있지만 호출기 설정을 각 노드마다 다르게하고 싶습니다. "pager setting"과 같은 CCK 필드를 만들고 xy의 정수 옵션을 제공하려고 생각했습니다. 그러나 어떻게 든 해당 필드를 뷰 설정에 동적으로 연결할 수 있는지 모르겠습니다. 아니면 다른 방법이 있습니까?

답변:


18

사용하려는 뷰 후크 hook_views_pre_build는 쿼리가 작성되기 전에 호출됩니다. 이제 이것은 기본적인 모듈 개발 경험이 있고 뷰 API에 익숙하다고 가정합니다.

당신은 할 수 있어야합니다 :

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

위에서 우리는 호출기 및 다른 모든 것이 변경 사항을 반영하는 방식으로 뷰 쿼리가 작성되기 전에 호출되는 뷰 후크를 사용하고 있습니다.

주의 사항 : 뷰 후크는 진행 상황을 이해하는 경우에만 사용해야합니다. 위 코드는 views-2.x 용으로 작성되었습니다.

도움이 되었기를 바랍니다.


좋아 고마워. 아직 모듈 개발 경험이 없지만 달성하고 싶은 몇 가지 사항에 대해 시작했습니다. PHP에 대해 이해하고 있으므로 위에 붙여 넣은 코드 덩어리에서 발생하는 일을 따라갈 수 있습니다. 나는 이것이 나에게 많은 도움이된다고 생각한다. 감사합니다.
Jay

1
Views 3.x의 경우 관련 코드를$view->items_per_page = $pager_count;
stevenw00

각 페이지의 오프셋도 동적으로 설정할 수 있습니까?
shekoufeh

2

Drupal 7의 경우 다음을 작성해야합니다.

$view->items_per_page = $pager_count;

예제에서 :

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

@ericduran의 코드 예제를 사용합니다.


1

뷰 전처리 기능을 사용해야합니다

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}

"preprocess"는 테마 용이며 pre_render가 너무 늦습니다 (쿼리가 이미 실행되었습니다). pre_build 훅이 훨씬 좋습니다.
mojzis

1

hook_views_pre_render에서 뷰 결과 및 호출기를 업데이트하려면 다음을 수행하십시오.

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

이 작동합니다! ;)


우수한! 쿼리에서 반환 된 항목에 따라 특정 페이지의 항목 수를 제한하고 싶었습니다. 이 방법을 최대한 빨리 확인하십시오.
Jens

정확히 작동하지 않습니다. 다음 페이지에서 배출되는 행이 나타나지 않습니다. 따라서 내용이 누락됩니다. 더 많은 조사가 필요합니다.
Jens

0

@tanmayk의 코드가 나를 위해 속였습니다. hook_views_pre_render 에서이 두 줄의 코드 만 추가했습니다.

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

그러나 결과를 뷰에 추가 할 필요는 없었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.