프로그래밍 방식으로 뷰의 결과를 반복하는 가장 좋은 방법은 무엇입니까?


12

'Children'이라는 뷰 (child_node_id와 birth_order_value라는 두 개의 필드가 있음)가 주어지면 display_id가 'default'이고 부모 노드 ID를 포함하는 인수가 주어진 뷰 결과 세트를 반복적으로 프로그래밍하는 가장 좋은 방법은 무엇입니까?

이전에는 다음과 유사한 코드를 사용하여 블록에서 View를 사용했습니다.

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

그러나 다른 블록에서는 뷰에서 찾은 값을 기반으로 몇 가지 논리를 수행하려고합니다. 내 최종 요구 사항에 따라 비즈니스 논리를 추측 할 수 있습니다.보기를 지원하는 코드 블록 ( '자녀')을 여러 번 호출하고 싶습니다. 뷰 데이터 세트 결과를 반복 할 때 하위 노드를 조회하는 하위 노드를 반복적으로 반복하고 싶습니다.


당신의 접근 방식은 괜찮아 보입니다. 답변에 답하면 사람들이 투표하고 승인 할 수 있습니다. 시도 할 수있는 한 가지는 매번보기를 설정 해제하는 것이 아닙니다. 실행하기 전에 $ view-> clone_view ()를 수행하십시오. 뷰 로딩은 상당히 무거 우므로 메모리와 성능에 도움이 될 수 있습니다.
Jeremy French

내가 기본이 아닌 경우 용서하지만, 이것은 부모 테이블의 필드에서 관계 및 그룹화를 사용하여 달성 할 수있는 일종입니다. 아직 코드를 작성해야할지 모르겠습니다. 부모 템플릿 재정의에서 하위 뷰와 논리를 호출하는 것이 더 간단 할 수도 있습니다.
Jason Smith

foreach for (.. sizeof ()) 대신 고려해야 합니다 .PHP 대신 C이기 때문에 성능이 훨씬 뛰어납니다.
berkes

한 가지 주목할 점은을 사용하는 대신을 사용하는 if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2))것이 좋습니다 if ($node = menu_get_object()).
Chris Pliakas

질문의 답변을 잘라서 답변으로 게시했습니다. 그렇게하면 사이트 사용자에게이 질문에 대한 답변이 더 명확 해집니다.
Jeremy French

답변:


2

Views로 조금 놀아서 접근 방식을 시도한 것 같습니다. 그러나 내 질문을 다른 답변과 더 나은 솔루션에 공개하고 싶습니다.

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

뷰를 여러 번 실행하는 열쇠는 결과 세트가 끝나면 unset ($ view)하는 것이 었습니다.


1

다음 기능 중 좋은 마일리지를 얻었습니다. 반환 값은 모든 뷰 레코드의 배열입니다. dsm ($ return_value)을 호출하면 특정 뷰의 구조를 알 수 있습니다.

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

다음은 Drupal API에 이미 내장 된 도우미 함수입니다. (나는 Drupal Docs에서 약탈하고 있었고 결국 그것을 찾았습니다. 다른 많은 사람들 도이 도우미를 사용하지 않는 솔루션을 생산 했으며이 도우미는 다른 솔루션이하지 않는 흥미로운 단계를 수행하는 것으로 보입니다 .. 실행하기 전에 $ view 객체에서 pre_render를 호출합니다.

나는 그것이 잘 작동하는지 여부를 보증 할 수는 없지만 적어도 이러한 접근법과 관련된 문제를 불러 낼 수있는 특정 장소입니다.

D6의 경우 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

그리고 D7의 경우 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

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