diff --git a/code/BlogEntry.php b/code/BlogEntry.php index 97cffcc..4f137ee 100644 --- a/code/BlogEntry.php +++ b/code/BlogEntry.php @@ -265,4 +265,3 @@ class BlogEntry_Controller extends Page_Controller { } } -?> diff --git a/code/TrackBackDecorator.php b/code/TrackBackDecorator.php index 67dd5d8..8bc2dec 100644 --- a/code/TrackBackDecorator.php +++ b/code/TrackBackDecorator.php @@ -1,13 +1,84 @@ array( + 'TrackbackURL' => 'Varchar(2048)', + 'PungTrackbackURL' => 'Varchar(2048)' + ), 'has_many' => array( 'TrackBacks' => 'TrackBackPing' ) ); } + + function updateCMSFields($fields) { + // Trackback URL field + if($this->owner->TrackBacksEnabled()) { + $fields->addFieldToTab("Root.Content.Main", new TextField("TrackbackURL", _t("BlogEntry.TRACKBACKURL", "Trackback URL")), "Content"); + } + else { + $fields->addFieldToTab("Root.Content.Main", new ReadonlyField("TrackbackURLReadOnly", _t("BlogEntry.TRACKBACKURL", "Trackback URL"), _t("BlogEntry.TRACKBACKURL_DISABLED", "To use this feature, please check 'Enable TrackBacks' check box on the blog holder.")), "Content"); + } + } + + function onBeforePublish() { + $owner = $this->owner; + + if(!empty($owner->TrackbackURL) && $owner->TrackBacksEnabled() && $owner->ShouldTrackbackNotify()) { + + if($this->trackbackNotify()) { + $owner->PungTrackbackURL = $owner->TrackbackURL; + $owner->write(); + } + } + } + + /** + * Trackback notify the specified trackback url + * @param boolean | true on success, otherwise false + */ + function trackbackNotify() { + $owner = $this->owner; + + $content = new HTMLText('Content'); + $content->setValue($owner->Content); + $excerpt = $content->FirstParagraph(); + + if($owner->Parent() && $owner->ParentID > 0) { + $blogName = $owner->Parent()->Title; + } + else { + $blogName = ""; + } + + $postData = array( + 'url' => $owner->AbsoluteLink(), + 'title' => $owner->Title, + 'excerpt' => $excerpt, + 'blog_name' => $blogName + ); + + $controller = Object::create(self::$trackback_server_class); + $response = $controller->request($owner->TrackbackURL, $postData); + + if($response->getStatusCode() == '200' && stripos($response->getBody(), "0") !== false) { + return true; + } + + return false; + + } + + function ShouldTrackbackNotify() { + return (trim($this->owner->TrackbackURL) != '' && $this->owner->TrackbackURL != $this->owner->PungTrackbackURL); + } function updateMetaTags(&$tags) { $tags .= $this->owner->renderWith('TrackBackRdf'); @@ -49,4 +120,32 @@ class TrackBackDecorator extends DataObjectDecorator { } } +/** + * Example: + * $controller = Object::create('TrackbackHTTPClient'); + * $response = $controller->request(new SS_HTTPRequest('POST', $url, null, $postData)); + */ +class TrackbackHTTPServer { + + function __construct() {} + + /** + * @param string + * @param array + * @return SS_HTTPResponse + */ + function request($url, $data) { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + $response = curl_exec($ch); + $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + return new SS_HTTPResponse($response, $statusCode); + } +} + ?> diff --git a/tests/BlogEntryTest.php b/tests/BlogEntryTest.php index 22f0a7b..b1a3411 100644 --- a/tests/BlogEntryTest.php +++ b/tests/BlogEntryTest.php @@ -28,30 +28,4 @@ class BlogEntryTest extends SapphireTest { BlogEntry::$allow_wysiwyg_editing = $tmpFlag; } - function testTrackback() { - $blog = $this->objFromFixture('BlogHolder', 'mainblog'); - $blog->TrackBacksEnabled = true; - $blog->write(); - - $entry = $this->objFromFixture('BlogEntry', 'testpost'); - $response = $entry->trackbackping(); - - $this->assertContains("1", $response); - - $_POST['url'] = 'test trackback post url'; - $_POST['title'] = 'test trackback post title'; - $_POST['excerpt'] = 'test trackback post excerpt'; - $_POST['blog_name'] = 'test trackback blog name'; - - $response = $entry->trackbackping(); - $this->assertContains("0", $response); - - $trackback = DataObject::get_one('TrackBackPing'); - $this->assertEquals('test trackback post url', $trackback->Url); - $this->assertEquals('test trackback post title', $trackback->Title); - $this->assertEquals('test trackback post excerpt', $trackback->Excerpt); - $this->assertEquals('test trackback blog name', $trackback->BlogName); - - unset($_POST); - } } \ No newline at end of file diff --git a/tests/BlogTrackbackTest.php b/tests/BlogTrackbackTest.php new file mode 100644 index 0000000..7fa6745 --- /dev/null +++ b/tests/BlogTrackbackTest.php @@ -0,0 +1,107 @@ +objFromFixture('BlogHolder', 'mainblog'); + $blog->TrackBacksEnabled = true; + $blog->write(); + + $entry = $this->objFromFixture('BlogEntry', 'testpost'); + $response = $entry->trackbackping(); + + $this->assertContains("1", $response); + + $_POST['url'] = 'test trackback post url'; + $_POST['title'] = 'test trackback post title'; + $_POST['excerpt'] = 'test trackback post excerpt'; + $_POST['blog_name'] = 'test trackback blog name'; + + $response = $entry->trackbackping(); + $this->assertContains("0", $response); + + $trackback = DataObject::get_one('TrackBackPing'); + $this->assertEquals('test trackback post url', $trackback->Url); + $this->assertEquals('test trackback post title', $trackback->Title); + $this->assertEquals('test trackback post excerpt', $trackback->Excerpt); + $this->assertEquals('test trackback blog name', $trackback->BlogName); + + unset($_POST); + } + + function testShouldTrackbackNotify() { + $blog = $this->objFromFixture('BlogHolder', 'mainblog'); + $blog->TrackBacksEnabled = true; + + $entry = $this->objFromFixture('BlogEntry', 'testpost'); + $this->assertFalse($entry->ShouldTrackbackNotify()); + + $entry = $this->objFromFixture('BlogEntry', 'testpost'); + $entry->TrackbackURL = ' '; + $this->assertFalse($entry->ShouldTrackbackNotify()); + + $entry = $this->objFromFixture('BlogEntry', 'testpost'); + $entry->TrackbackURL = 'someurl'; + $this->assertTrue($entry->ShouldTrackbackNotify()); + } + + function testTrackbackNotify() { + $tmpServerClass = TrackBackDecorator::$trackback_server_class; + TrackBackDecorator::$trackback_server_class = "TestTrackbackHTTPServer"; + + $blog = $this->objFromFixture('BlogHolder', 'mainblog'); + $blog->TrackBacksEnabled = true; + + $entry = $this->objFromFixture('BlogEntry', 'testpost'); + $entry->TrackbackURL = 'testGoodTrackbackURL'; + $this->assertTrue($entry->trackbackNotify()); + + $entry->TrackbackURL = 'testBadTrackbackURL'; + $this->assertFalse($entry->trackbackNotify()); + + $entry->TrackbackURL = 'testNonExistingTrackbackURL'; + $this->assertFalse($entry->trackbackNotify()); + + TrackBackDecorator::$trackback_server_class = $tmpServerClass; + } +} + +class TestTrackbackHTTPServer extends TrackbackHTTPServer implements TestOnly { + + function request($url, $data) { + if($url == 'testGoodTrackbackURL') { + $response = $this->goodTrackback(); + $statusCode = '200'; + } + else if($url == 'testBadTrackbackURL') { + $response = $this->badTrackback(); + $statusCode = '200'; + } + else { + $response = $this->badTrackback(); + $statusCode = '404'; + } + + return new SS_HTTPResponse($response, $statusCode); + } + + private function goodTrackback() { + return " + + 0 + + "; + } + + private function badTrackback() { + return " + + 1 + Some error text + "; + } +} \ No newline at end of file