Changeset 29
- Timestamp:
- 09/23/07 20:05:51 (6 years ago)
- Location:
- trackback
- Files:
-
- 3 added
- 13 modified
-
de.xml (modified) (1 diff)
-
en.xml (modified) (1 diff)
-
files/lib/action/TrackbackAction.class.php (modified) (5 diffs)
-
files/lib/system/cronjob/TrackbackCheckCronjob.class.php (modified) (4 diffs)
-
files/lib/system/event/listener/ThreadAddFormTrackbackListener.class.php (modified) (6 diffs)
-
files/lib/system/event/listener/ThreadPageTrackbackListener.class.php (modified) (4 diffs)
-
files/lib/util/Trackback.class.php (added)
-
files/lib/util/TrackbackUtil.class.php (modified) (1 diff)
-
groupoptions.xml (modified) (2 diffs)
-
install.sql (modified) (1 diff)
-
optionals (added)
-
optionals/de.easy-coding.wcf.data.page.publicseorewriter (added)
-
package.xml (modified) (2 diffs)
-
templates.diff (modified) (1 diff)
-
templates/postTrackback.tpl (modified) (1 diff)
-
templates/postTrackbackSetting.tpl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trackback/de.xml
r1 r29 3 3 <language languagecode="de"> 4 4 <category name="wcf.acp.group"> 5 <item name="wcf.acp.group.option.user.board.canThank"><![CDATA[Kann sich bedanken]]></item> 6 <item name="wcf.acp.group.option.user.board.canThank.description"><![CDATA[Mitglieder dieser Benutzergruppe können sich fÌr BeitrÀge bedanken.]]></item> 7 <item name="wcf.acp.group.option.user.board.canActivateThank"><![CDATA[Kann Bedankomat aktivieren]]></item> 8 <item name="wcf.acp.group.option.user.board.canActivateThank.description"><![CDATA[Mitglieder dieser Benutzergruppe können den Bedankomat fÌr BeitrÀge aktivieren.]]></item> 5 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Kann Trackbacks senden]]></item> 6 <item name="wcf.acp.group.option.user.board.canTrackback.description"><![CDATA[Mitglieder dieser Benutzergruppe könnnen Trackbacks zum automatischen Austausch von Nachrichten und Backlinks erstellen.]]></item> 9 7 </category> 10 8 11 9 <category name="wbb.thread"> 12 <item name="wbb.thread.post.button.thank"><![CDATA[Bedanken]]></item> 13 <item name="wbb.thread.post.thank.stats"><![CDATA[Es {if $postThanks[$messageID].users|isset && $postThanks[$messageID].guests|isset}haben{else}{if $postThanks[$messageID].users|isset}{if $postThanks[$messageID].users|count == 1}hat{else}haben{/if}{/if}{if $postThanks[$messageID].guests|isset}{if $postThanks[$messageID].guests == 1}hat{else}haben{/if}{/if}{/if} sich bereits {if $postThanks[$messageID].users|isset}{@$postThanks[$messageID].users|count} registrierte{if $postThanks[$messageID].users|count == 1}r{/if} Benutzer{if $postThanks[$messageID].guests|isset} und{/if}{/if}{if $postThanks[$messageID].guests|isset} {@$postThanks[$messageID].guests} {if $postThanks[$messageID].guests == 1}Gast{else}GÀste{/if}{/if} bedankt.]]></item> 14 <item name="wbb.thread.post.thank.users"><![CDATA[Benutzer die sich bedankten:]]></item> 10 <item name="wbb.thread.post.trackbacks"><![CDATA[Trackbacks]]></item> 11 <item name="wbb.thread.post.trackback.blog_name"><![CDATA[Blog]]></item> 12 <item name="wbb.thread.post.trackback.title"><![CDATA[Titel]]></item> 13 <item name="wbb.thread.post.trackback.excerpt"><![CDATA[Ausschnitt]]></item> 14 <item name="wbb.thread.post.trackback.url"><![CDATA[URL]]></item> 15 15 </category> 16 16 17 17 <category name="wbb.threadAdd"> 18 <item name="wbb.threadAdd.settings.hastThank"><![CDATA[Bedankomat aktivieren]]></item> 19 <item name="wbb.threadAdd.settings.hastThank.description"><![CDATA[Den Bedankomat fÌr diesen Beitrag aktivieren.]]></item> 18 <item name="wbb.threadAdd.settings.hasTrackback"><![CDATA[Trackback aktivieren]]></item> 19 <item name="wbb.threadAdd.settings.hasTrackback.description"><![CDATA[]]></item> 20 <item name="wbb.threadAdd.settings.trackbackUrls"><![CDATA[Trackbacks senden an]]></item> 21 <item name="wbb.threadAdd.settings.trackbackUrls.description"><![CDATA[Mehrere URLs trennen Sie bitte mit einem Zeilenumbruch.]]></item> 20 22 </category> 21 23 </language> -
trackback/en.xml
r1 r29 3 3 <language languagecode="en"> 4 4 <category name="wcf.acp.group"> 5 <item name="wcf.acp.group.option.user.board.canThank"><![CDATA[Can thank]]></item> 6 <item name="wcf.acp.group.option.user.board.canThank.description"><![CDATA[Members of this usergroup can thank other users for their posts.]]></item> 7 <item name="wcf.acp.group.option.user.board.canActivateThank"><![CDATA[Can activate thank'o'mat]]></item> 8 <item name="wcf.acp.group.option.user.board.canActivateThank.description"><![CDATA[Members of this usergroup can activate the thank'o'mat for posts.]]></item> 5 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Can send trackbacks]]></item> 6 <item name="wcf.acp.group.option.user.board.canTrackback.description"><![CDATA[Members of this group can send trackbacks for an automated exhcange of messages and backlinks.]]></item> 9 7 </category> 10 8 11 9 <category name="wbb.thread"> 12 <item name="wbb.thread.post.button.thank"><![CDATA[Thank]]></item> 13 <item name="wbb.thread.post.thank.stats"><![CDATA[{if $postThanks[$messageID].users|isset}{@$postThanks[$messageID].users|count} registered user{if $postThanks[$messageID].users|count != 1}s{/if} {if $postThanks[$messageID].guests|isset}and {/if}{/if}{if $postThanks[$messageID].guests|isset}{@$postThanks[$messageID].guests} guest{if $postThanks[$messageID].guests != 1}s{/if} {/if}thanked already.]]></item> 14 <item name="wbb.thread.post.thank.users"><![CDATA[Users that thanked:]]></item> 10 <item name="wbb.thread.post.trackbacks"><![CDATA[Trackbacks]]></item> 11 <item name="wbb.thread.post.trackback.title"><![CDATA[Title]]></item> 12 <item name="wbb.thread.post.trackback.excerpt"><![CDATA[Excerpt]]></item> 13 <item name="wbb.thread.post.trackback.url"><![CDATA[URL]]></item> 14 <item name="wbb.thread.post.trackback.blog_name"><![CDATA[Blog]]></item> 15 15 </category> 16 16 17 17 <category name="wbb.threadAdd"> 18 <item name="wbb.threadAdd.settings.hastThank"><![CDATA[Activate thank'o'mat]]></item> 19 <item name="wbb.threadAdd.settings.hastThank.description"><![CDATA[Activate the thank'o'mat for this post.]]></item> 18 <item name="wbb.threadAdd.settings.hasTrackback"><![CDATA[activete trackbacks]]></item> 19 <item name="wbb.threadAdd.settings.hasTrackback.description"><![CDATA[]]></item> 20 <item name="wbb.threadAdd.settings.trackbackUrls"><![CDATA[send trackbacks to]]></item> 21 <item name="wbb.threadAdd.settings.trackbackUrls.description"><![CDATA[Please divide multiple urls with a linebreak.]]></item> 20 22 </category> 21 23 </language> -
trackback/files/lib/action/TrackbackAction.class.php
r1 r29 6 6 require_once(WBB_DIR.'lib/data/thread/Thread.class.php'); 7 7 8 // Trackback Util 9 require_once(WBB_DIR.'lib/util/TrackbackUtil.class.php'); 10 8 11 /** 9 12 * adds new trackback … … 11 14 * @author Torben Brodt 12 15 * @package de.easy-coding.wbb.trackback 16 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 13 17 */ 14 18 class TrackbackAction extends AbstractAction { … … 81 85 throw new IllegalLinkException(); 82 86 } 87 88 // fetch url data 89 $row = TrackbackUtil::getPost($this->postID); 83 90 84 91 // check for spam … … 89 96 ( 90 97 postID, 98 postURL, 91 99 title, 92 100 excerpt, … … 96 104 ) VALUES ( 97 105 {$this->postID}, 98 {$this->title}, 99 {$this->excerpt}, 100 {$this->url}, 101 {$this->blog_name}, 102 {$isSpam} 106 '".escapeString($row['url'])."', 107 '".escapeString($this->title)."', 108 '".escapeString($this->excerpt)."', 109 '".escapeString($this->url)."', 110 '".escapeString($this->blog_name)."', 111 $isSpam} 103 112 );"; 104 113 -
trackback/files/lib/system/cronjob/TrackbackCheckCronjob.class.php
r1 r29 1 1 <?php 2 // WCF include 2 3 require_once(WCF_DIR.'lib/data/cronjobs/Cronjob.class.php'); 3 4 … … 7 8 * @author Torben Brodt 8 9 * @package de.easy-coding.wcf.trackback 10 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 9 11 */ 10 12 class TrackbackCheckCronjob implements Cronjob { … … 64 66 } 65 67 66 $sql _update= "UPDATE wcf".WCF_N."_trackback68 $sql = "UPDATE wcf".WCF_N."_trackback 67 69 SET 68 70 checked = NOW() … … 71 73 AND url = {$row[url]}; "; 72 74 73 WCF::getDB()->sendQuery($sql _update);75 WCF::getDB()->sendQuery($sql); 74 76 } 75 77 } -
trackback/files/lib/system/event/listener/ThreadAddFormTrackbackListener.class.php
r1 r29 2 2 // WCF include 3 3 require_once(WCF_DIR.'lib/system/event/EventListener.class.php'); 4 5 // Utils 6 require_once(WBB_DIR.'lib/util/TrackbackUtil.class.php'); 4 7 5 8 /** … … 8 11 * @author Torben Brodt 9 12 * @package de.easy-coding.wbb.trackback 13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 10 14 */ 11 15 class ThreadAddFormTrackbackListener implements EventListener { 12 protected $rewriter; //public seo rewriter (optional)13 14 16 protected $eventObj; 15 17 protected $className; … … 24 26 * @see EventListener::execute() 25 27 */ 26 public function execute($eventObj, $className, $eventName) { 27 // init rewriter 28 if(((defined('SEO_REWRITE_BOARD') && SEO_REWRITE_BOARD) || (defined('SEO_REWRITE_THREAD') && SEO_REWRITE_THREAD)) && file_exists(WCF_DIR.'lib/page/PublicSEORewriter.class.php')) { 29 require_once(WCF_DIR.'lib/page/PublicSEORewriter.class.php'); 30 $this->rewriter = new PublicSEORewriter(); 31 } 32 28 public function execute($eventObj, $className, $eventName) { 33 29 $this->eventObj = $eventObj; 34 30 $this->className = $className; … … 75 71 */ 76 72 protected function assignVariables () { 77 WBBCore::getTPL()->assign('hasTrackback', $this->hasTrackback); 78 WBBCore::getTPL()->assign('trackbackUrls', $this->trackbackUrls); 79 73 WBBCore::getTPL()->assign(array( 74 'hasTrackback' => $this->hasTrackback, 75 'trackbackUrls', $this->trackbackUrls 76 )); 80 77 WBBCore::getTPL()->append('additionalSettings', WBBCore::getTPL()->fetch('postTrackbackSetting')); 81 78 } … … 120 117 */ 121 118 private function readTrackbackData($postID) { 122 // fetch thread data 123 $sql = "SELECT thread.* 124 FROM wbb".WBB_N."_post post 125 LEFT JOIN wbb".WBB_N."_thread thread 126 ON (thread.threadID=post.threadID) 127 WHERE postID = {$postID}; "; 119 // fetch data 120 $row = TrackbackUtil::getPost($postID); 128 121 129 $result = WCF::getDB()->sendQuery($sql); 130 $row = WCF::getDB()->fetchArray($result)); 131 132 // basic data 133 $this->title = $row['topic']; 122 // assign basic data 123 $this->title = $row['topic']; 134 124 $this->excerpt = substr($row['firstPostPreview'],0,255); 135 125 $this->author = $row['username']; 136 137 // build thread url 138 if($this->rewriter === null) { 139 $this->url = sprintf('index.php?page=Thread&threadID=%d', $row['threadID']); 140 } else { 141 // public seo rewriter: cache 142 $this->rewriter->publicCacheThreads($row['threadID'], $row); 143 144 // public seo rewriter use 145 $this->url = $this->rewriter->publicParseThreadURLs($row['threadID'], ''); 146 } 126 $this->url = $row['url']; 147 127 } 148 128 … … 152 132 private function discoverNewTrackbacks() { 153 133 $oldlist = explode(' ', $this->trackbackUrlsOld); 154 155 // WCF includes156 require_once(WCF_DIR.'lib/util/TrackbackUtil.class.php');157 134 158 135 // Trackback -
trackback/files/lib/system/event/listener/ThreadPageTrackbackListener.class.php
r1 r29 2 2 // WCF includes 3 3 require_once(WCF_DIR.'lib/system/event/EventListener.class.php'); 4 5 // Utils 6 require_once(WBB_DIR.'lib/util/TrackbackUtil.class.php'); 4 7 5 8 /** … … 8 11 * @author Torben Brodt 9 12 * @package de.easy-coding.wbb.trackback 13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 10 14 */ 11 15 class ThreadPageTrackbackListener implements EventListener { 12 protected $rewriter; //public seo rewriter (optional)13 protected $trackbacks = array();14 15 protected $url, $title, $excerpt, $author, $date;16 16 17 17 /** … … 20 20 */ 21 21 public function execute($eventObj, $className, $eventName) { 22 $postTrackbacks = array(); 22 23 23 24 // foreign trackbacks … … 28 29 $rows = WBBCore::getDB()->sendQuery($sql); 29 30 while ($row = WBBCore::getDB()->fetchArray($rows)) { 30 $this->trackbacks[$row['postID']]['trackback'] = $row; 31 } 32 33 // fetch thread data 34 $sql = "SELECT thread.* 35 FROM wbb".WBB_N."_post post 36 LEFT JOIN wbb".WBB_N."_thread thread 37 ON (thread.threadID=post.threadID) 38 WHERE postID IN (".$eventObj->postList->postIDs."); "; 39 40 $result = WCF::getDB()->sendQuery($sql); 41 $row = WCF::getDB()->fetchArray($result)); 42 43 // basic data 44 $this->title = $row['topic']; 45 $this->excerpt = substr($row['firstPostPreview'],0,255); 46 $this->author = $row['username']; 47 $this->date = date("r", $row['time']); 48 $this->trackbackUrl = sprintf('index.php?action=Trackback&threadID=%d', $row['threadID']); 49 50 // build thread url 51 if($this->rewriter === null) { 52 $this->url = sprintf('index.php?page=Thread&threadID=%d', $row['threadID']); 53 } else { 54 // public seo rewriter: cache 55 $this->rewriter->publicCacheThreads($row['threadID'], $row); 56 57 // public seo rewriter use 58 $this->url = $this->rewriter->publicParseThreadURLs($row['threadID'], ''); 31 $postTrackbacks[$row['postID']] = $row; 59 32 } 60 33 61 // WCF includes 62 require_once(WCF_DIR.'lib/util/TrackbackUtil.class.php'); 34 // fetch data 35 $row = TrackbackUtil::getPost($eventObj->postList->postIDs); 36 37 // assign basic data 38 $title = $row['topic']; 39 $excerpt = StringUtil::substring($row['firstPostPreview'],0,255); 40 $author = $row['username']; 41 $date = date("r", $row['time']); 42 $trackbackUrl = sprintf('index.php?action=Trackback&threadID=%d', $row['threadID']); 43 $url = $row['url']; 63 44 64 45 // Trackback 65 46 $trackback = new TrackbackUtil(PAGE_TITLE, $this->author, CHARSET); 66 $rdf = $trackback->rdf_autodiscover($ this->date, $this->title, $this->excerpt, $this->url, $this->trackbackUrl, $this->author);47 $rdf = $trackback->rdf_autodiscover($date, $title, $excerpt, $url, $trackbackUrl, $author); 67 48 68 49 WBBCore::getTPL()->assign(array( 69 ' trackbacks' => $this->trackbacks,50 'postTrackbacks' => $postTrackbacks, 70 51 'autodiscover'=> $rdf 71 52 )); -
trackback/files/lib/util/TrackbackUtil.class.php
r1 r29 1 1 <?php 2 // Utils 3 require_once(WBB_DIR.'lib/util/Trackback.class.php'); 2 4 3 5 /** 4 * PHP Class to handle TrackBacks (send/ping, receive, retreive, detect, seed, etc...) 5 * 6 * @license http://opensource.org/licenses/gpl-license.php GNU General Public License (GPL) 7 * 8 * @param string $blog_name 9 * @param string $author 10 * @param string $encoding 6 * trackback util 7 * 8 * @author Torben Brodt 9 * @package de.easy-coding.wbb.trackback 10 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 11 11 */ 12 class TrackbackUtil { 13 private $blog_name = ''; // Default blog name used throughout the class (ie. BLOGish) 14 private $author = ''; // Default author name used throughout the class (ie. Ran Aroussi) 15 private $encoding = ''; // Default encoding used throughout the class (ie. UTF-8) 16 private $get_id = ''; // Retreives and holds $_GET['id'] (if not empty) 17 private $post_id = ''; // Retreives and holds $_POST['id'] (if not empty) 18 private $url = ''; // Retreives and holds $_POST['url'] (if not empty) 19 private $title = ''; // Retreives and holds $_POST['title'] (if not empty) 20 private $expert = ''; // Retreives and holds $_POST['expert'] (if not empty) 12 class TrackbackUtil extends Trackback { 21 13 22 /** 23 * Class Constructure 24 * 25 * @param string $blog_name 26 * @param string $author 27 * @param string $encoding 28 * @return 29 */ 30 public function __construct($blog_name, $author, $encoding = "UTF-8") 31 { 32 $this->blog_name = $blog_name; 33 $this->author = $author; 34 $this->encoding = $encoding; 14 /** 15 * Produces XML response for trackbackers with ok/error message. 16 * 17 * @param boolean $success 18 * @param string $err_response 19 * @return boolean 20 */ 21 public function receive($success = false, $err_response = ""){ 22 return parent::recieve($cussess, $err_response); 23 } 24 25 /** 26 * @param postIDs 27 * @return u 28 */ 29 public getPost($postIDs) { 30 if(!is_array($postIDs)) 31 $postIDs = array($postIDs); 32 33 // fetch thread data 34 $sql = "SELECT thread.* 35 FROM wbb".WBB_N."_post post 36 LEFT JOIN wbb".WBB_N."_thread thread 37 ON (thread.threadID=post.threadID) 38 WHERE postID IN (".$postIDs."); "; 39 40 $row = WCF::getDB()->getFirstRow($sql); 41 42 // build thread url 43 if($row && defined('SEO_REWRITE_THREAD') && SEO_REWRITE_THREAD && file_exists(WCF_DIR.'lib/page/PublicSEORewriter.class.php')) { 44 require_once(WCF_DIR.'lib/page/PublicSEORewriter.class.php'); 45 $rewriter = new PublicSEORewriter(); 46 47 // public seo rewriter: cache 48 $rewriter->publicCacheThreads($row['threadID'], $row); 49 50 // public seo rewriter use 51 return $rewriter->publicParseThreadURLs($row['threadID'], ''); 52 } 53 else if($row) { 54 return sprintf('index.php?page=Thread&threadID=%d', $row['threadID']); 55 } 35 56 36 // Gather $_POST information 37 if (isset($_GET['id'])) { 38 $this->get_id = $HTTP_GET_VARS['id']; 39 } 40 if (isset($_POST['id'])) { 41 $this->post_id = $HTTP_POST_VARS['id']; 42 } 43 if (isset($_POST['url'])) { 44 $this->url = $HTTP_POST_VARS['url']; 45 } 46 if (isset($_POST['title'])) { 47 $this->title = $HTTP_POST_VARS['url']; 48 } 49 if (isset($_POST['expert'])) { 50 $this->expert = $HTTP_POST_VARS['expert']; 51 } 52 } 53 54 /** 55 * Sends a trackback ping to a specified trackback URL. 56 * allowing clients to auto-discover the TrackBack Ping URL. 57 * 58 * <code><?php 59 * include('trackback_cls.php'); 60 * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); 61 * if ($trackback->ping('http://tracked-blog.com', 'http://your-url.com', 'Your entry title')) { 62 * echo "Trackback sent successfully..."; 63 * } else { 64 * echo "Error sending trackback...."; 65 * } 66 * ?></code> 67 * 68 * @param string $tb 69 * @param string $url 70 * @param string $title 71 * @param string $excerpt 72 * @return boolean 73 */ 74 public function ping($tb, $url, $title = "", $excerpt = "") 75 { 76 $response = ""; 77 $reason = ""; 78 // Set default values 79 if (empty($title)) { 80 $title = "Trackbacking your entry..."; 81 } 82 if (empty($excerpt)) { 83 $excerpt = "I found your entry interesting do I've added a Trackback to it on my weblog :)"; 84 } 85 // Parse the target 86 $target = parse_url($tb); 87 88 if ((isset($target["query"])) && ($target["query"] != "")) { 89 $target["query"] = "?" . $target["query"]; 90 } else { 91 $target["query"] = ""; 92 } 93 94 if ((isset($target["port"]) && !is_numeric($target["port"])) || (!isset($target["port"]))) { 95 $target["port"] = 80; 96 } 97 // Open the socket 98 $tb_sock = fsockopen($target["host"], $target["port"]); 99 // Something didn't work out, return 100 if (!is_resource($tb_sock)) { 101 return '$trackback->ping: can\'t connect to: ' . $tb . '.'; 102 exit; 103 } 104 // Put together the things we want to send 105 $tb_send = "url=" . rawurlencode($url) . "&title=" . rawurlencode($title) . "&blog_name=" . rawurlencode($this->blog_name) . "&excerpt=" . rawurlencode($excerpt); 106 // Send the trackback 107 fputs($tb_sock, "POST " . $target["path"] . $target["query"] . " HTTP/1.1\r\n"); 108 fputs($tb_sock, "Host: " . $target["host"] . "\r\n"); 109 fputs($tb_sock, "Content-type: application/x-www-form-urlencoded\r\n"); 110 fputs($tb_sock, "Content-length: " . strlen($tb_send) . "\r\n"); 111 fputs($tb_sock, "Connection: close\r\n\r\n"); 112 fputs($tb_sock, $tb_send); 113 // Gather result 114 while (!feof($tb_sock)) { 115 $response .= fgets($tb_sock, 128); 116 } 117 // Close socket 118 fclose($tb_sock); 119 // Did the trackback ping work 120 strpos($response, '<error>0</error>') ? $return = true : $return = false; 121 // send result 122 return $return; 123 } 124 125 /** 126 * Produces XML response for trackbackers with ok/error message. 127 * 128 * <code><?php 129 * // Set page header to XML 130 * header('Content-Type: text/xml'); // MUST be the 1st line 131 * // 132 * // Instantiate the class 133 * // 134 * include('trackback_cls.php'); 135 * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); 136 * // 137 * // Get trackback information 138 * // 139 * $tb_id = $trackback->post_id; // The id of the item being trackbacked 140 * $tb_url = $trackback->url; // The URL from which we got the trackback 141 * $tb_title = $trackback->title; // Subject/title send by trackback 142 * $tb_expert = $trackback->expert; // Short text send by trackback 143 * // 144 * // Do whatever to log the trackback (save in DB, flatfile, etc...) 145 * // 146 * if (TRACKBACK_LOGGED_SUCCESSFULLY) { 147 * // Logged successfully... 148 * echo $trackback->recieve(true); 149 * } else { 150 * // Something went wrong... 151 * echo $trackback->recieve(false, 'Explain why you return error'); 152 * } 153 * ?></code> 154 * 155 * @param boolean $success 156 * @param string $err_response 157 * @return boolean 158 */ 159 public function recieve($success = false, $err_response = "") 160 { 161 // Default error response in case of problems... 162 if (!$success && empty($err_response)) { 163 $err_response = "An error occured while tring to log your trackback..."; 164 } 165 // Start response to trackbacker... 166 $return = '<?xml version="1.0" encoding="' . $this->encoding . '"?>' . "\n"; 167 $return .= "<response> \n"; 168 // Send back response... 169 if ($success) { 170 // Trackback received successfully... 171 $return .= " <error>0</error> \n"; 172 } else { 173 // Something went wrong... 174 $return .= " <error>1</error> \n"; 175 $return .= " <message>" . $this->xml_safe($err_response) . "</message>\n"; 176 } 177 // End response to trackbacker... 178 $return .= "</response>"; 179 180 return $return; 181 } 182 183 /** 184 * Feteched trackback information and produces an RSS-0.91 feed. 185 * 186 * <code><?php 187 * // 1 188 * header('Content-Type: text/xml'); // MUST be the 1st line 189 * // 2 190 * include('trackback_cls.php'); 191 * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); 192 * // 3 193 * $tb_id = $trackback->get_id; 194 * // 4 195 * Do whatever to get trackback information by ID (search db, etc...) 196 * if (GOT_TRACKBACK_INFO) { 197 * // Successful - pass trackback info as array()... 198 * $tb_info = array('title' => string TRACKBACK_TITLE, 199 * 'expert' => string TRACKBACK_EXPERT, 200 * 'permalink' => string PERMALINK_URL, 201 * 'trackback' => string TRACKBACK_URL 202 * ); 203 * echo $trackback->fetch(true, $tb_info); 204 * } else { 205 * // Something went wrong - tell my why... 206 * echo $trackback->fetch(false, string RESPONSE); 207 * } 208 * ?></code> 209 * 210 * @param boolean $success 211 * @param string $response 212 * @return string XML response to the caller 213 */ 214 public function fetch($success = false, $response = "") 215 { 216 if (!$success && empty($response)) { 217 $response = "An error occured while tring to retreive trackback information..."; 218 } 219 // Start response to caller 220 $return = '<?xml version="1.0" encoding="' . $this->encoding . '"?>' . "\n"; 221 $return .= "<response> \n"; 222 // Send back response... 223 if ($success) { 224 // Trackback retreived successfully... 225 // Sending back an RSS (0.91) - trackback information from $response (array)... 226 $return .= " <error>0</error> \n"; 227 $return .= " <rss version=\"0.91\"> \n"; 228 $return .= " <channel> \n"; 229 $return .= " <title>" . $this->xml_safe($response['title']) . "</title> \n"; 230 $return .= " <link>" . $this->xml_safe($response['trackback']) . "</link> \n"; 231 $return .= " <description>" . $this->xml_safe($response['expert']) . "</description> \n"; 232 $return .= " <item> \n"; 233 $return .= " <title>" . $this->xml_safe($response['title']) . "</title> \n"; 234 $return .= " <link>" . $this->xml_safe($response['permalink']) . "</link> \n"; 235 $return .= " <description>" . $this->xml_safe($response['expert']) . "</description> \n"; 236 $return .= " </item> \n"; 237 $return .= " </channel> \n"; 238 $return .= " </rss> \n"; 239 } else { 240 // Something went wrong - provide reason from $response (string)... 241 $return .= " <error>1</error> \n"; 242 $return .= " <message>" . $this->xml_safe($response) . "</message>\n"; 243 } 244 // End response to trackbacker 245 $return .= "</response>"; 246 247 return $return; 248 } 249 250 /** 251 * Produces embedded RDF representing metadata about the entry, 252 * allowing clients to auto-discover the TrackBack Ping URL. 253 * 254 * NOTE: DATE should be string in RFC822 Format - Use RFC822_from_datetime(). 255 * 256 * <code><?php 257 * include('trackback_cls.php'); 258 * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); 259 * 260 * echo $trackback->rdf_autodiscover(string DATE, string TITLE, string EXPERT, string PERMALINK, string TRACKBACK [, string AUTHOR]); 261 * ?></code> 262 * 263 * @param string $RFC822_date 264 * @param string $title 265 * @param string $expert 266 * @param string $permalink 267 * @param string $trackback 268 * @param string $author 269 * @return string 270 */ 271 public function rdf_autodiscover($RFC822_date, $title, $expert, $permalink, $trackback, $author = "") 272 { 273 if (!$author) { 274 $author = $this->author; 275 } 276 277 $return = "<!-- \n"; 278 $return .= "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" \n"; 279 $return .= " xmlns:dc=\"http://purl.org/dc/elements/1.1/\" \n"; 280 $return .= " xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\"> \n"; 281 $return .= "<rdf:Description \n"; 282 $return .= " rdf:about=\"" . $this->xml_safe($permalink) . "\" \n"; 283 $return .= " dc:identifier=\"" . $this->xml_safe($permalink) . "\" \n"; 284 $return .= " trackback:ping=\"" . $this->xml_safe($trackback) . "\" \n"; 285 $return .= " dc:title=\"" . $this->xml_safe($title) . "\" \n"; 286 $return .= " dc:subject=\"TrackBack\" \n"; 287 $return .= " dc:description=\"" . $this->xml_safe($this->cut_short($expert)) . "\" \n"; 288 $return .= " dc:creator=\"" . $this->xml_safe($author) . "\" \n"; 289 $return .= " dc:date=\"" . $RFC822_date . "\" /> \n"; 290 $return .= "</rdf:RDF> \n"; 291 $return .= "--> \n"; 292 293 return $return; 294 } 295 296 /** 297 * Search text for links, and searches links for trackback URLs. 298 * 299 * <code><?php 300 * 301 * include('trackback_cls.php'); 302 * $trackback = new Trackback('BLOGish', 'Ran Aroussi', 'UTF-8'); 303 * 304 * if ($tb_array = $trackback->auto_discovery(string TEXT)) { 305 * // Found trackbacks in TEXT. Looping... 306 * foreach($tb_array as $tb_key => $tb_url) { 307 * // Attempt to ping each one... 308 * if ($trackback->ping($tb_url, string URL, [string TITLE], [string EXPERT])) { 309 * // Successful ping... 310 * echo "Trackback sent to <i>$tb_url</i>...\n"; 311 * } else { 312 * // Error pinging... 313 * echo "Trackback to <i>$tb_url</i> failed....\n"; 314 * } 315 * } 316 * } else { 317 * // No trackbacks in TEXT... 318 * echo "No trackbacks were auto-discover...\n" 319 * } 320 * ?></code> 321 * 322 * @param string $text 323 * @return array Trackback URLs. 324 */ 325 public function auto_discovery($text) 326 { 327 // Get a list of UNIQUE links from text... 328 // --------------------------------------- 329 // RegExp to look for (0=>link, 4=>host in 'replace') 330 $reg_exp = "/(http)+(s)?:(\\/\\/)((\\w|\\.)+)(\\/)?(\\S+)?/i"; 331 // Make sure each link ends with [sapce] 332 $text = eregi_replace("www.", "http://www.", $text); 333 $text = eregi_replace("http://http://", "http://", $text); 334 $text = eregi_replace("\"", " \"", $text); 335 $text = eregi_replace("'", " '", $text); 336 $text = eregi_replace(">", " >", $text); 337 // Create an array with unique links 338 $uri_array = array(); 339 if (preg_match_all($reg_exp, strip_tags($text, "<a>"), $array, PREG_PATTERN_ORDER)) { 340 foreach($array[0] as $key => $link) { 341 foreach((array(",", ".", ":", ";")) as $t_key => $t_value) { 342 $link = trim($link, $t_value); 343 } 344 $uri_array[] = ($link); 345 } 346 $uri_array = array_unique($uri_array); 347 } 348 // Get the trackback URIs from those links... 349 // ------------------------------------------ 350 // Loop through the URIs array and extract RDF segments 351 $rdf_array = array(); // <- holds list of RDF segments 352 foreach($uri_array as $key => $link) { 353 if ($link_content = implode("", @file($link))) { 354 preg_match_all('/(<rdf:RDF.*?<\/rdf:RDF>)/sm', $link_content, $link_rdf, PREG_SET_ORDER); 355 for ($i = 0; $i < count($link_rdf); $i++) { 356 if (preg_match('|dc:identifier="' . preg_quote($link) . '"|ms', $link_rdf[$i][1])) { 357 $rdf_array[] = trim($link_rdf[$i][1]); 358 } 359 } 360 } 361 } 362 // Loop through the RDFs array and extract trackback URIs 363 $tb_array = array(); // <- holds list of trackback URIs 364 if (!empty($rdf_array)) { 365 for ($i = 0; $i < count($rdf_array); $i++) { 366 if (preg_match('/trackback:ping="([^"]+)"/', $rdf_array[$i], $array)) { 367 $tb_array[] = trim($array[1]); 368 } 369 } 370 } 371 // Return Trackbacks 372 return $tb_array; 373 } 374 375 /** 376 * Other Useful functions used in this class 377 */ 378 379 /** 380 * Converts MySQL datetime to a standart RFC 822 date format 381 * 382 * @param string $datetime 383 * @return string RFC 822 date 384 */ 385 public function RFC822_from_datetime($datetime) 386 { 387 $timestamp = mktime( 388 substr($datetime, 8, 2), substr($datetime, 10, 2), substr($datetime, 12, 2), 389 substr($datetime, 4, 2), substr($datetime, 6, 2), substr($datetime, 0, 4) 390 ); 391 return date("r", $timestamp); 392 } 393 394 /** 395 * Converts a string into an XML-safe string (replaces &, <, >, " and ') 396 * 397 * @param string $string 398 * @return string 399 */ 400 public function xml_safe($string) 401 { 402 return htmlspecialchars($string, ENT_QUOTES); 403 } 404 405 /** 406 * Cuts a string short (with "...") accroding to $max_length... 407 * 408 * @param string $string 409 * @param integer $max_length 410 * @return string 411 */ 412 public public function cut_short($string, $max_length = 255) 413 { 414 if (strlen($string) > $max_length) { 415 $string = substr($string, 0, $max_length) . '...'; 416 } 417 418 return $string; 419 } 57 return $row; 58 } 420 59 } 421 60 -
trackback/groupoptions.xml
r1 r29 4 4 <import> 5 5 <options> 6 <!-- user.board.write -->7 6 <option name="user.board.canTrackback"> 8 7 <categoryname>user.board.write</categoryname> … … 10 9 <defaultvalue>1</defaultvalue> 11 10 </option> 12 <!-- /user.board.write -->13 11 </options> 14 12 </import> -
trackback/install.sql
r1 r29 4 4 CREATE TABLE wbb1_1_trackback ( 5 5 postID int(10) unsigned NOT NULL, 6 postURL varchar(255) NOT NULL DEFAULT '', 6 7 title varchar(255) NOT NULL DEFAULT '', 7 8 excerpt varchar(255) NOT NULL DEFAULT '', -
trackback/package.xml
r5 r29 5 5 <packagename>Trackback</packagename> 6 6 <packagedescription>Allow trackback for posts</packagedescription> 7 <version>0.0. 1</version>7 <version>0.0.2</version> 8 8 <date>DATE</date> 9 9 <plugin>com.woltlab.wbb</plugin> … … 20 20 </requiredpackages> 21 21 22 <optionalpackages> 23 <optionalpackage file="optionals/de.easy-coding.wcf.data.page.publicseorewriter.tar.gz">de.easy-coding.wcf.data.page.publicseorewriter</optionalpackage> 24 </optionalpackages> 25 22 26 <instructions type="install"> 23 27 <files>files.tar</files> -
trackback/templates.diff
r1 r29 1 --- K:/Development/wBB3Mods/original/templates/wbb/thread.tpl Fri Jun 15 15:44:09 2007 2 +++ K:/Development/wBB3Mods/Checkout/wbb3/dev/wbb3mods.wbb.thanksbot/templates_patched/thread.tpl Sun Jun 17 19:29:35 2007 3 @@ -65,6 +65,18 @@ 4 {/if} 5 <link rel="alternate" type="application/rss+xml" href="index.php?page=Feed&type=RSS2&threadID={@$threadID}" title="RSS2" /> 6 <link rel="alternate" type="application/atom+xml" href="index.php?page=Feed&type=Atom&threadID={@$threadID}" title="Atom" /> 7 + <script type="text/javascript"> 8 + //<![CDATA[ 9 + function showHideThankUser (postID) { 10 + var userDiv = document.getElementById('thankUser-'+postID); 11 + if (userDiv.className == 'hidden') { 12 + userDiv.className = ''; 13 + } else { 14 + userDiv.className = 'hidden'; 15 + } 16 + } 17 + //]]> 18 + </script> 19 </head> 20 <body> 21 {* --- quick search controls --- *} 22 @@ -320,6 +332,10 @@ 23 {if $this->user->userID} 24 <li><a href="index.php?form=PostReport&postID={@$post->postID}{@SID_ARG_2ND}"><img src="icon/postReportS.png" alt="" /> <span>{lang}wbb.thread.post.button.report{/lang}</span></a></li> 25 {/if} 26 + {assign var=userID value=$this->user->userID} 27 + {if $this->user->getPermission('user.board.canThank') && $post->hasThank && !$postThanks[$messageID].users[$userID]|isset && $authorID != $this->user->userID} 28 + <li><a href="index.php?action=Thank&postID={@$post->postID}{@SID_ARG_2ND}"><img src="icon/thankS.png" alt="" /> <span>{lang}wbb.thread.post.button.thank{/lang}</span></a></li> 29 + {/if} 30 {if $post->canEditPost($board, $thread)} 31 <li><a href="index.php?form=PostEdit&postID={@$post->postID}{@SID_ARG_2ND}"><img src="{@RELATIVE_WCF_DIR}icon/editS.png" alt="" /> <span>{lang}wbb.thread.post.button.edit{/lang}</span></a></li> 32 {/if} 1 --- thread.tpl Fri Jun 15 15:44:09 2007 2 +++ thread_patched.tpl Sun Jun 17 19:29:35 2007 33 3 @@ -327,6 +343,7 @@ 34 4 </ul> 35 5 </div> 36 6 </div> 37 + {include file="postT hankStats"}7 + {include file="postTrackback" sandbox=false} 38 8 <hr /> 39 9 </div> -
trackback/templates/postTrackback.tpl
r1 r29 1 {if $thread->hasTrackback}<!-- 2 <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/"> 3 <rdf:Description rdf:about="http://www.foo.com/archive.html#foo" dc:identifier="http://www.foo.com/archive.html#foo" dc:title="Foo Bar" trackback:ping="http://www.easy-coding.de/index.php?action=Trackback&threadID={@$threadID}" /> 4 </rdf:RDF> 5 -->{/if} 6 7 {if $postThanks[$messageID]|isset} 8 <div class="thankStats" style="background-color: {@$this->style->getVariable('messages.boxes.background.color')}; color: {@$this->style->getVariable('messages.boxes.font.color')}; border: {@$this->style->getVariable('container.border.outer.width')} {@$this->style->getVariable('container.border.outer.style')} {@$this->style->getVariable('container.border.outer.color')}; clear: both; display: block; margin: 7px 0pt; padding: 7px 15px; positon: relative;"> 9 {if $postThanks[$messageID].users|isset}<a href="javascript:void(0);" onclick="showHideThankUser({@$messageID});">{/if}{lang}wbb.thread.post.thank.stats{/lang}{if $postThanks[$messageID].users|isset}</a>{/if}<br /> 10 {if $postThanks[$messageID].users|isset} 11 <div id="thankUser-{@$messageID}"> 12 <p class="smallFont">{lang}wbb.thread.post.thank.users{/lang}</p> 13 <p class="smallFont">{implode from=$postThanks[$messageID].users item=postThankUsers}<a href="index.php?page=User&userID={@$postThankUsers.userID}{@SID_ARG_2ND}">{@$postThankUsers.username}</a>{/implode}</p> 14 </div> 15 <script type="text/javascript"> 16 //<[CDATA[ 17 showHideThankUser({@$messageID}); 18 //]]> 19 </script> 20 {/if} 21 </div> 1 {if $postTrackbacks[$messageID]|isset} 2 {foreach from=$postTrackbacks[$messageID] item=trackback} 3 {lang}wbb.thread.post.trackback.blog_name{/lang}: {$trackback.blog_name} 4 {lang}wbb.thread.post.trackback.title{/lang}: {$trackback.title}<br /> 5 {lang}wbb.thread.post.trackback.excerpt{/lang}: {$trackback.excerpt}<br /> 6 {lang}wbb.thread.post.trackback.url{/lang}: {$trackback.url}<br /> 7 {/foreach} 22 8 {/if} -
trackback/templates/postTrackbackSetting.tpl
r1 r29 1 1 {if $this->user->getPermission('user.board.canTrackback')} 2 <div class="formField"> 3 <label><input type="checkbox" name="hasTrackback" value="1" {if $hasTrackback == 1}checked="checked" {/if}/> {lang}wbb.threadAdd.settings.hastTrackback{/lang}</label> 2 <div class="formCheckBox"> 3 <div class="formField"> 4 <label><input type="checkbox" name="hasTrackback" value="1" {if $hasTrackback == 1}checked="checked" {/if}/> {lang}wbb.threadAdd.settings.hasTrackback{/lang}</label> 5 </div> 6 <div class="formFieldDesc"> 7 {lang}wbb.threadAdd.settings.hasTrackback.description{/lang} 8 </div> 4 9 </div> 5 <div class="formFieldDesc"> 6 {lang}wbb.threadAdd.settings.hasTrackback.description{/lang} 7 </div> 8 9 <div class="formFieldDesc"> 10 <label><input type="text" name="trackbackUrls" value="@$trackbackUrls"/> {lang}wbb.threadAdd.settings.hastThank{/lang}<br /> 11 {lang}wbb.threadAdd.settings.trackbackUrls.description{/lang}</label> 10 11 <div class="formElement"> 12 <div class="formFieldLabel"> 13 <label for="trackbackUrls">{lang}wbb.threadAdd.settings.trackbackUrls{/lang}</label> 14 </div> 15 16 <div class="formField"> 17 <textarea name="trackbackUrls" id="trackbackUrls" rows="3" cols="20">{@$trackbackUrls}</textarea> 18 </div> 19 <div class="formFieldDesc"> 20 <p>{lang}wbb.threadAdd.settings.trackbackUrls.description{/lang}</p> 21 </div> 12 22 </div> 13 23 {/if}
