diff --git a/README.md b/README.md index 2196e70..408a914 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ The external links module is a task and ModelAdmin to track and to report on bro ## Features * Add external links to broken links reports -* Add a model admin for external broken links * Add a task to track external broken links ## Installation @@ -25,8 +24,7 @@ The external links module is a task and ModelAdmin to track and to report on bro 3. Make sure the folder after being extracted is named 'externallinks' 4. Place this directory in your sites root directory. This is the one with framework and cms in it. 5. Run in your browser - `/dev/build` to rebuild the database. - 6. You should see a new menu called *Broken Ext. Links* - 7. Run the following task *http://path.to.silverstripe/dev/tasks/CheckExternalLinks* to check for broken external links + 6. Run the following task *http://path.to.silverstripe/dev/tasks/CheckExternalLinks* to check for broken external links ## Dev task ## @@ -38,6 +36,3 @@ Add the following code to the mysite config to run the job every 24 hours (86400 `Config::inst()->update('CheckExternalLinks', 'QueuedJob', 86400);` -## TODO ## - -Fix setting the class attribute of broken links to ss-broken diff --git a/code/jobs/CheckExternalLinksJob.php b/code/jobs/CheckExternalLinksJob.php index 6c9c34b..381df5b 100644 --- a/code/jobs/CheckExternalLinksJob.php +++ b/code/jobs/CheckExternalLinksJob.php @@ -1,82 +1,69 @@ pagesToProcess = SiteTree::get(); + $this->pagesToProcess = Versioned::get_by_stage('SiteTree', 'Live')->column(); $this->currentStep = 0; $this->totalSteps = count($this->pagesToProcess); } - /** - * Sitemap job is going to run for a while... - */ - public function getJobType() { - return QueuedJob::QUEUED; - } - - /** - * @return string - */ public function getTitle() { return 'Checking external links'; } - /** - * Return a signature for this queued job - * - * For the generate sitemap job, we only ever want one instance running, so just use the class name - * - * @return String - */ + public function getJobType() { + return QueuedJob::QUEUED; + } + public function getSignature() { return md5(get_class($this)); } - /** - * Note that this is duplicated for backwards compatibility purposes... - */ - public function setup() { + public function setup() { parent::setup(); - increase_time_limit_to(); - $restart = $this->currentStep == 0; - if ($restart) { - $this->pagesToProcess = SiteTree::get(); + $this->pagesToProcess = Versioned::get_by_stage('SiteTree', 'Live')->column(); + } + + } + + /** + * Check a individual page + */ + public function process() { + $remainingPages = $this->pagesToProcess; + if (!count($remainingPages)) { + $this->isComplete = true; + return; + } + + // lets process our first item - note that we take it off the list of things left to do + $ID = array_shift($remainingPages); + + // get the page + $page = Versioned::get_by_stage('SiteTree', 'Live', 'ID = '.$ID); + + if (!$page || !$page->Count()) { + $this->addMessage("Page ID #$ID could not be found, skipping"); + } + + $task = new CheckExternalLinks(); + $task->run($page); + + // and now we store the new list of remaining children + $this->pagesToProcess = $remainingPages; + $this->currentStep++; + + if (!count($remainingPages)) { + $this->isComplete = true; + return; } } - /** - * On any restart, make sure to check that our temporary file is being created still. - */ - public function prepareForRestart() { - parent::prepareForRestart(); - } - - public function process() { - $task = new CheckExternalLinks(); - $task->run(); - $data = $this->getJobData(); - $completedPages = $task->getCompletedPages(); - $totalPages = $task->getTotalPages(); - $this->addMessage("$completedPages/$totalPages pages completed"); - $this->completeJob(); - } - - /** - * Outputs the completed file to the site's webroot - */ - protected function completeJob() { - $this->isComplete = 1; - $nextgeneration = new CheckExternalLinksJob(); - singleton('QueuedJobService')->queueJob($nextgeneration, - date('Y-m-d H:i:s', time() + self::$regenerate_time)); - } -} \ No newline at end of file +} diff --git a/code/tasks/CheckExternalLinks.php b/code/tasks/CheckExternalLinks.php index 830bb54..3a61fb4 100644 --- a/code/tasks/CheckExternalLinks.php +++ b/code/tasks/CheckExternalLinks.php @@ -19,7 +19,11 @@ class CheckExternalLinks extends BuildTask { } function run($request) { - $pages = Versioned::get_by_stage('SiteTree', 'Live'); + if (isset($request->ID)) { + $pages = $request; + } else { + $pages = Versioned::get_by_stage('SiteTree', 'Live'); + } foreach ($pages as $page) { ++$this->totalPages; @@ -63,9 +67,10 @@ class CheckExternalLinks extends BuildTask { $htmlValue->__call('saveHTML', array()); $page->Content = $htmlValue->getContent(); - $page->write(); + $page->owner->write(); if (!$page->HasBrokenLink) { + // bypass the ORM as syncLinkTracking does not allow you // to update HasBrokenLink to true $query = "UPDATE \"SiteTree_Live\" SET \"HasBrokenLink\" = 1 ";