2010-11-23 4 views
0
if ($node->taxonomy) { 
$query = 'SELECT DISTINCT(t.nid), n.nid, n.title FROM {node} n INNER JOIN {term_node} t ON n.nid = t.nid WHERE n.nid != %d AND ('; 


$args = array($node->nid); 
    $tids = array(); 

    foreach ($node->taxonomy as $term) { 
    $tids[] = 't.tid = %d'; 
    $args[] = $term->tid; 
} 

    $query .= implode(' OR ', $tids) . ')'; 

$result = db_query_range($query, $args, 0, 10); 
while ($o = db_fetch_object($result)) { 
echo l($o->title, 'node/' . $o->nid); 
} 

}(드루팔) 어려움 코드, 이해 같은 용어

코드가 드루팔 전문가 출신에서 같은 기사의 제목을 얻을 수 있습니다. . node.tpl.php에서 같은 용어로 기사의 제목을 얻는 데 사용되었지만, 일부는 알고 있지만 이틀 동안 연구했습니다. 코드의 원리는 아직 모르겠습니다. 누군가 나를 위해 더 자세한 내용을 설명 할 수있을 것으로 기대합니다. 고맙습니다.

답변

2

짧은 버전 :

그것은 태그 노드의의 배열을 가져옵니다, 적어도 이러한 태그 중 하나 을 사용하여 처음 10 개 노드이 각각에 대한 링크를 출력 검색 10 결과.


세부 버전 : 모든

우선, 가변 "$node"는 특정 노드 (예를 들어 페이지 또는 스토리 노드)에 관한 데이터를 포함하는 오브젝트이다. 예를 들어 "$node->title"은 해당 노드의 제목이됩니다. 이 태그가 없습니다 경우,이 같은 태그 (들)를 사용하여 다른 노드를 검색 할 수 있기 때문에


는 "$node->taxonomy"테스트 (해당 노드 태그입니다. 노드와 연관된 하나 또는 여러 개의 태그가있을 때/페이지/이야기, $node->taxonomyarray입니다


이제 SQL 쿼리에 대해 :.. 는 "node는" 는 "term_node는"기본 필드 모든 노드의 (비 CCK)입니다 저장하는 데이터베이스 테이블입니다 데이터베이스 테이블 t hat은 태그 ("taxonomy term"라고 함)와 노드의 조합을 포함합니다. 두 테이블


" nid는"(내부 autoincremented 번호 임) " unique Node ID"이다. 이 열은 두 테이블 모두에 있으므로 테이블을 서로 조인 방법입니다. " term_node"의

"tid는"(또한 내부 autoincremented 수 있음) "unique Term ID"이다.


는 " node"테이블 별명이 " n"는 따라서 " n.nid"는 " the Node ID stored in table node"를 의미한다. " term_node"테이블의 별칭은 " t"이므로 " t.tid"은 " the Term ID stored in table term_node"을 의미합니다. 태그의 배열이 SQL 쿼리에 추가하기 위해 노드에 의해 사용 된 각 태그의 TERMID 추출하고 문자열로 변환을 내파를 통해


은 "foreach"루프 간다. "%d"가 "integer number"의미

루프는 인수가 SQL 쿼리 별도로 전달 될 때 드루팔 데이터베이스 호출이 안전하기 때문에 변수 $args의 실제 값이 변수 $tids 저장의 각 태그에 대한 SQL 쿼리의 조각을 저장 . 「db_query_range


데이터베이스에 다수의 행을 선택하는 함수이다 : 여기서, "0 10"는 "retrieve the first 10 results"를 의미한다. 은 "while"루프 "db_fetch_object"


는 목적 변수 "$o"의 각 결과 저장을 검색한다.

따라서 "$o->title"에는 SQL 쿼리에서 검색 한 열 "title"의 값이 포함됩니다.


함수는 "l"는 HTML 링크를위한 코드를 생성 드루팔 functin이다 : 첫번째 인자는 링크의 이름이고, 두 번째 인수는 드루팔 경로는 다음 드루팔에서 임의의 노드가 될 수있다 기본적으로 "www.yoursite.com/node/NodeID", 을 사용하여 액세스하므로 "node/123"(123은 "Node ID") 경로를 제공합니다.

이 함수는 사용자 지정 경로를 투명하게 처리하므로 노드에 "www.yoursite.com/my-great-page"을 대신 사용하여 액세스 할 수있는 사용자 지정 경로가있는 경우 "www.yoursite.com/node/123"대신 해당 페이지에 대한 링크가 자동으로 만들어집니다.

+0

당신은 내 영웅입니다. 많은 많은 감사합니다. 그러나 나는 잘 따라갈 수없는 부분들이있다. "n"term_node ","tid "는"고유 용어 ID "(내부 자동 증가 번호이기도 함)입니다." 테이블 "term_node"를 살펴 보았습니다. 동일한 tid를 가진 동일한 행이 있습니다. – runeveryday

+0

왜 내가이 두 줄을 "$ args = array ($ node-> nid); $ tids = array();" foreach 루프에서 – runeveryday

+0

은 $ term from인데 어떻게 객체인지 알 수 있습니다. – runeveryday

1

나는 이것을 전문가로 쓴 사람을 정확하게 부르지 않을 것입니다. 당신은 이것을 훨씬 더 예쁘게 할 수 있습니다. 그는 그것이 다음과 같습니다 조회를 작성하지 어쨌든 무엇 :

SELECT DISTINCT(t.nid), n.nid, n.title FROM {node} n 
INNER JOIN {term_node} t ON n.nid = t.nid 
WHERE n.nid != %d 
AND (t.tid = %d OR t.tid = %d OR ... t.tid = %d); 

최종 결과는 그가 모든 노드 ID와 (한 번) 제목 적어도 한 학기 선택된 노드를 공유하지만, ISN을 선택하는 것입니다 노드 자체.

+0

감사합니다. 당신도 전문가입니다. 하지만 당신의 대답은 너무 추상적입니다. 나는 그것을 잘 따라갈 수 없다. 나는 어떻게이 선이 "(t.tid = % d OR t.tid = % d OR ... t.tid = % d);" 에서. – runeveryday