2013-09-27 2 views
0

영역 템플릿 내에서 이미로드 된 노드에 액세스 할 수 있습니까? 이것은 동일한 것을 두 번 다시 질의하는 것을 방지하기위한 것입니다. 나는 node_load을 사용하여 nid 노드를로드 할 수 있다는 것을 알고 있습니다. 노드가 이미로드 된 경우 정적 캐시에서 노드를 검색합니다. 하지만이 경우에는 nid을 모르므로 nid의 목록이 이미로드되어있는 것을 선호합니다.Drupal 7 - 이미로드 된 노드 가져 오기

추 신 : PDO 결과를 사용하면 동일한 작업을 여러 번 쿼리해도 성능 저하가 거의 없으므로 가능한 한 데이터베이스 연결을 최소화하는 것이 좋습니다.

답변

0

로드 된 노드에 대한 정보를 저장하기 위해 hook_node_load()를 사용하고로드 된 nid를 배열 (어쩌면 전역)에 추가하지 않는 이유는 무엇입니까?

나중에 node_load_multiple ([로드 된 nids의 배열])을 사용하면 캐시에서 모든 노드를 가져옵니다!

는 여기있다 :이 코드를 작동하지만, 신속하게 프로토 타입

/** 
* Nid array set function 
*/ 
function mymodule_push_nid_array($nid) { 
    global $nid_array; 
    if (!isset($nid_array)) { 
    $nid_array = array(); 
    } 
    // Only push, if nid isn't already set 
    if(!in_array($nid, $nid_array)) { 
    array_push($nid_array, $nid); 
    } 
} 

/** 
* Nid array get function 
*/ 
function mymodule_get_nid_array() { 
    global $nid_array; 
    if(!isset($nid_array)) { 
    return array(); 
    } 
    else { 
    return $nid_array; 
    } 
} 

/** 
* Implements hook_node_load(); 
*/ 
function mymodule_node_load($nodes, $types) { 
    foreach ($nodes as $node) { 
    mymodule_push_nid_array($node->nid); 
    } 
} 

/** 
* Returns already loaded nodes 
*/ 
function mymodule_get_all_loaded_nodes() { 
    return node_load_multiple(mymodule_get_nid_array()); 
} 

/** 
* Demo function (shows only up on next page request!) 
* Don't use THIS HOOK IN PRODUCTION 
*/ 
function mymodule_exit() { 
    $nodes = mymodule_get_all_loaded_nodes(); 
    debug($nodes); 
} 

. 언제든지 수정할 수 있습니다.

+0

예제를 제공해 주시겠습니까? 설명서를 읽었지만이 함수를 사용하는 방법을 이해하지 못했습니다. – Shaokan

+0

좋아요, 코드를 작성했습니다. 희망을 당신이 그것을 처리 할 수 ​​있고 후크 및 모듈 시스템을 이해해야합니다. – larrydahooster

관련 문제