drupal4.2의 trackback 수정 코드
글쓴이: ykskor / 작성시간: 화, 2003/09/02 - 1:46오전
drupal 4.2 의 tb 모듈 수정 파일입니다.
사용하기 위해서는 원본 tb모듈을 설치하고 인스톨 문서에 설명하고 있는테이블을 생성후 modules 디렉토리의 tb.module 파일을 아래의 코드로 교체하세요.
설정은 관리자의 모듈설정에서 익명의 사용자가 댓글을 사용할 수 있도록 합니다. 이유는 외부로부터 오는 trackback ping 데이타는 anonymous로 간주하기 때문입니다.
access trackback: anonymous 사용자도 사용할 수 있도록 합니다.
post trackback: trackback ping은 자기 게시물을 다른 곳에 ping하는 것이므로 인증된 사용자에게만 사용하도록 하면 됩니다.
현재 trackback ping을 보내기/받기 와 트랙백 데이타를 rss형태로 보는 기능이 됩니다. 자동 발견 기능을 위해서 rdf도 blog타입의 node에 숨겨져서 출력됩니다.(HTML 의 주석처리 형태). 현재 drupal에서는 이런 데이타의 자동발견 기능이 없습니다.
<?php // $Id: tb.module,v 1.11.2.2 2003/08/10 13:48:50 ax Exp $ if ( !defined('HTTP_CRLF') ) define( 'HTTP_CRLF', chr(13) . chr(10)); function tb_system($field) { $system["description"] = t("Provide TrackBack capabilities."); return $system[$field]; } function tb_perm() { return array("access trackback", "post trackback"); } function tb_link($type, $node = 0, $main = "") { if (($type == "node") && $node->type == "blog" && (user_access("access trackback"))) { $links[] = l(t("TrackBack")."(".tb_getnumtrackbacks($node->nid).")", "tb/view/$node->nid",array("title" => t("View only comments by trackback ping for this node"))); } if ( ($type == "node") && $node->type == "blog" && (blog_access("update", $node)) && (user_access("post trackback"))) { $links[] = l(t("TrackBack Ping"), "tb/form/$node->nid", array("title" => t("Send a trackback ping for this node"))); } if (($type == "node") && $node->type == "blog" && (user_access("access trackback"))) { $links[] = "<br />TrackBack URL: ".url("tb/$node->nid"). tb_discovery($node); } return $links ? $links : array(); } function tb_help() { print _tb_help(); } function _tb_help() { return t('<p>What is <a href="http://www.movabletype.org/trackback/">TrackBack</a>? Basically, it is a way of recording who has linked to your posts and notifying others that you have linked to them (invented by the folks from <a href="http://www.moveabletype.org">Moveable Type</a>).</p>'); } // 코멘트 등록시 코멘트 고유번호 갱신 function tb_comment($op, $edit) { if ($edit["cid"] > 0) { if($op == "insert") { db_query("UPDATE tb SET cid = ". $edit["cid"] ." WHERE (nid = ". $edit["nid"] .") AND (cid = 0)"); } } } // 노드 삭제시 관련 데이타 삭제 function tb_nodeapi(&$node, $op, $arg = 0) { switch ($op) { case "delete": db_query("DELETE FROM tb WHERE nid = '$node->nid'"); break; } } function tb_discovery($node) { $result = '<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" /> <rdf:Description rdf:about="'. url("node/view/$node->nid") .'" dc:title="'. strip_tags($node->title) .'" dc:identifier="'. url("node/view/$node->nid") .'" trackback:ping="'. url("tb/$node->nid") .'" /> </rdf:RDF> -->'; return $result; } function tb_getnumtrackbacks($nid) { if ($nid > 0) { $result = db_query("SELECT COUNT(*) FROM tb WHERE nid = $nid"); return db_result($result); } else { return 0; } } function _tb_node_exists($nid) { if ($nid > 0) { $result = db_query("SELECT nid FROM node WHERE nid = $nid"); return (db_num_rows($result) > 0); } else { return 0; } } function tb_make_response($err_code = 0, $err_msg = '', $data = '') { Header('content-type: text/xml'); /* $output = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"; */ $output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; $output .= "<response>\n"; $output .= "<error>$err_code</error>\n"; if ($err_code > 0) { $output .= "<message>$err_msg</message>\n"; } $output .= $data; $output .= "</response>"; return $output; } function _tb_rss($nid) { global $languages; foreach ($languages as $key => $value) break; $lang = $key ? $key : "en"; $node = node_load(array('nid' => $nid)); $items = ""; $result = db_query("SELECT tb.*, c.subject, c.comment FROM tb, comments c WHERE (tb.cid = c.cid) AND (c.nid = $nid) ORDER BY c.timestamp DESC"); while ($comment = db_fetch_object($result)) { $items .= format_rss_item($comment->subject, url("node/view/$nid") . "#".$comment->cid, $comment->comment); } $output = "<rss version=\"0.92\">\n"; $output .= format_rss_channel($node->title, url("node/view/$nid"), $node->teaser, $items,$lang); $output .= "</rss>"; return $output; } function tb_rss($nid) { print tb_make_response(0, "", _tb_rss($nid)); } function _tb_url_good($url) { return ereg('^http://', $url); } function tb_add($nid) { $url = $_POST["url"]; $title = $_POST["title"]; $excerpt = $_POST["excerpt"]; $blog_name = $_POST["blog_name"]; if (module_exist("comment")) { if (_tb_node_exists($nid)) { if (($url != "") && (_tb_url_good($url))) { $edit["nid"] = $nid; $edit["pid"] = 0; $edit["subject"] = ($title == "") ? $blog_name : $title; $edit["comment"] = "<a href=\"$url\">". $edit["subject"] ."</a><br />"; $edit["comment"] .= "Trackbacked by ".$blog_name."<br />"; if ($excerpt != "") { $edit["comment"] .= $excerpt; } db_query("INSERT INTO tb (nid, cid) VALUES($nid, 0)"); comment_post($edit); print tb_make_response(); } else { print tb_make_response(1, t("Invalid URL.")); } } else { print tb_make_response(1, t("Node doesn't exist.")); } } else { print tb_make_response(1, t("Comments are disabled.")); } } function tb_form($nid) { theme("header"); if (user_access("post trackback")) { $output = form_textfield(t("Trackback URL"), "tb_url", "", 40, 200, t("Enter a URL you wish to ping")); $output .= form_submit(t("Ping")); theme("box", t("TrackBack"), form($output, "post", url("tb/$nid"))); } else { theme("box", t("Access denied"), message_access()); } theme("footer"); } // xml response parsing helper functions function _tb_startElement($parser, $name, $attrs) { global $is_inerror; $is_inerror = ($name == "MESSAGE"); } function _tb_endElement($parser, $name) { global $is_inerror; $is_inerror = 0; } function _tb_cdata($parser, $data) { global $is_inerror, $tb_error; $tb_error = ($is_inerror) ? $data : $tb_error; } // modified from http://www.dclp-faq.de/q/q-code-post.html function _tb_post($url, $data) { $urlinfo = parse_url($url); $fp = fsockopen($urlinfo["host"], $urlinfo["port"] ? $urlinfo["port"] : 80); fputs($fp, "POST ". $urlinfo["path"] ." HTTP/1.1".HTTP_CRLF); fputs($fp, "Host: ". $urlinfo["host"] .HTTP_CRLF); fputs($fp, "Content-type: application/x-www-form-urlencoded".HTTP_CRLF); fputs($fp, "Content-length: ". strlen($data) .HTTP_CRLF); fputs($fp, "Connection: close".HTTP_CRLF.HTTP_CRLF); fputs($fp, "$data".HTTP_CRLF); // modified from http://www.phpclasses.org/browse.html/file/1222.html $isHeader = true; $blockSize = 0; $responseHeaders = ""; $responseBody = ""; while (!feof($fp)) { if($isHeader){ $line = fgets($fp, 1024); $responseHeaders .= $line; if('' == trim($line)){ $isHeader = false; } } else { if(!$blockSize){ $line = fgets($fp, 1024); if($blockSizeHex = trim($line)){ $blockSize = hexdec($blockSizeHex); } } else { $responseBody .= fread($fp,$blockSize); $blockSize = 0; } } } fclose($fp); return $responseBody; } function tb_ping($nid) { global $is_inerror, $tb_error; theme("header"); if (user_access("post trackback")) { $edit = $_POST["edit"]; $ping_url = $edit["tb_url"]; $node = node_load(array("nid" => $nid)); $ping_arg = "url=" . urlencode(url("node/view/$nid")); if ($node->title != "") { $ping_arg .= "&title=" . urlencode(strip_tags($node->title)); } $ping_arg .= "&excerpt=" . urlencode(strip_tags($node->teaser)); $sname = variable_get("site_name", "drupal"); if ($sname != "") { $ping_arg .= "&blog_name=" . urlencode(strip_tags($sname)); } // pings are HTTP posted now $content = _tb_post($ping_url, $ping_arg); if ($content == "") { theme("box", t("TrackBack ping"), t("Could not HTTP get.(%pingurl)", array("%pingurl" => $pingurl))); } else { $xmlp = xml_parser_create("ISO-8859-1"); xml_set_element_handler($xmlp, "_tb_startElement", "_tb_endElement"); xml_set_character_data_handler($xmlp, "_tb_cdata"); $is_inerror = 0; $tb_error = ""; if(!xml_parse($xmlp, $content, 1)) { theme("box", t("TrackBack ping"), t('Could not parse response (%xmlerror).', array("%xmlerror" => xml_error_string(xml_get_error_code($xmlp))))); watchdog("error", $content); } else { $tb_msg = ($tb_error != '') ? $tb_error : "Site was succesfully pinged."; theme("box", t("TrackBack ping"),t($tb_msg)); } xml_parser_free($xmlp); } } else { theme("box", t("Access denied"), message_access()); } theme("footer"); } function tb_view($nid) { tb_rss($nid); } // page hook function tb_page() { $op = $_POST["op"]; if (empty($op)) { $op = arg(1); $nid = arg(2); if(!$nid) { $nid = $op; $op = ""; } } else { $nid = arg(1); } if (user_access("access trackback")) { if ($nid > 0) { switch($op) { case "form": // tb/form/nid tb_form($nid); break; case "view": // tb/view/nid tb_view($nid); break; case "rss": // tb/rss/nid tb_rss($nid); break; case t("Ping"): // tb/nid tb_ping($nid); break; default: // tb/nid (receive an incoming ping) tb_add($nid); break; } } else { theme("header"); theme("box", t("TrackBack"), _tb_help()); theme("footer"); } } else { message_access(); } } ?>
Forums:
CleanURL사용하지 않는 drupal을 위한 수정
tb.moudle내의 함수 수정
여기에 올리는 것보다는 drupal 사이트에 올리는 게 어떨까요? mai
여기에 올리는 것보다는 drupal 사이트에 올리는 게 어떨까요? main tree에 포함되어야요.
예... 어느 정도 동작이 잘 된다고 판단되면 www.drupal.org
예... 어느 정도 동작이 잘 된다고 판단되면 www.drupal.org 의 적절한 곳 (메일링 리스트 혹은 포럼) 에 패치를 올려 주시면 곧 적용이 될 것입니다. 아무튼 수고 많이 하시네요... :o
왜인지는 잘 모르겠으나..
서버의 포트가 80이 아닌 경우에 위의 모듈 소스로 trackback ping을 받지 못합니다. 왜그런가 하고 조사해 보니 index.php 에서 include 를 하지 못하더군요
이유를 알 수 없어 삽질만 하다가 ping 나가는걸 보니 포트가 안적혀 있더라구요
그래서 혹시나 해서 붙여보았더니 ping이 잘 됩니다.
fputs($fp, "Host: ". $urlinfo["host"] .HTTP_CRLF);
이 줄을
fputs($fp, "Host: ". $urlinfo["host"].$urlinfo["port"] .HTTP_CRLF);
이렇게 변경했습니다.
댓글 달기