. * * @category Sitemap * @package StatusNet * @author Evan Prodromou * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ if (!defined('STATUSNET')) { exit(1); } /** * Show the sitemap index * * @category Sitemap * @package StatusNet * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ class SitemapindexAction extends Action { /** * handle the action * * @param array $args unused. * * @return void */ function handle($args) { header('Content-Type: text/xml; charset=UTF-8'); $this->startXML(); $this->elementStart('sitemapindex', array('xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9')); $this->showUserSitemaps(); $this->showNoticeSitemaps(); $this->elementEnd('sitemapindex'); $this->endXML(); } function showUserSitemaps() { $userCounts = $this->getUserCounts(); foreach ($userCounts as $dt => $cnt) { $cnt = $cnt+0; assert($cnt != 0); $n = (int)$cnt / (int)SitemapPlugin::USERS_PER_MAP; if (($cnt % SitemapPlugin::USERS_PER_MAP) != 0) { $n++; } for ($i = 1; $i <= $n; $i++) { $this->showSitemap('user', $dt, $i); } } } function showNoticeSitemaps() { $noticeCounts = $this->getNoticeCounts(); foreach ($noticeCounts as $dt => $cnt) { assert($cnt != 0); $n = $cnt / SitemapPlugin::NOTICES_PER_MAP; if ($cnt % SitemapPlugin::NOTICES_PER_MAP) { $n++; } for ($i = 1; $i <= $n; $i++) { $this->showSitemap('notice', $dt, $i); } } } function getUserCounts() { // XXX: cachemeplease $user = new User(); $user->selectAdd(); $user->selectAdd('date(created) as regdate, count(*) as regcount'); $user->groupBy('regdate'); $user->find(); $userCounts = array(); while ($user->fetch()) { $userCounts[$user->regdate] = $user->regcount; } return $userCounts; } function getNoticeCounts() { // XXX: cachemeplease $notice = new Notice(); $notice->selectAdd(); $notice->selectAdd('date(created) as postdate, count(*) as postcount'); $notice->groupBy('postdate'); $notice->find(); $noticeCounts = array(); while ($notice->fetch()) { $noticeCounts[$notice->postdate] = $notice->postcount; } return $noticeCounts; } function showSitemap($prefix, $dt, $i) { list($y, $m, $d) = explode('-', $dt); $this->elementStart('sitemap'); $this->element('loc', null, common_local_url($prefix.'sitemap', array('year' => $y, 'month' => $m, 'day' => $d, 'index' => $i))); $begdate = strtotime("$y-$m-$d 00:00:00"); $enddate = $begdate + (24 * 60 * 60); if ($enddate < time()) { $this->element('lastmod', null, date(DATE_W3C, $enddate)); } $this->elementEnd('sitemap'); } }