Set updated date for items in feeds
RSS doesn't support updated date for items, so we use the ATOM extension. Updated dates also bump the global update
This commit is contained in:
parent
9646b7da22
commit
c6d876bb2a
5 changed files with 51 additions and 13 deletions
|
@ -154,17 +154,23 @@ protected function buildItem($link, $pageaddr)
|
||||||
}
|
}
|
||||||
$link['description'] = format_description($link['description']) . PHP_EOL .'<br>— '. $permalink;
|
$link['description'] = format_description($link['description']) . PHP_EOL .'<br>— '. $permalink;
|
||||||
|
|
||||||
$date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']);
|
$pubDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']);
|
||||||
|
$link['pub_iso_date'] = $this->getIsoDate($pubDate);
|
||||||
|
|
||||||
if ($this->feedType == self::$FEED_RSS) {
|
// atom:entry elements MUST contain exactly one atom:updated element.
|
||||||
$link['iso_date'] = $date->format(DateTime::RSS);
|
if (!empty($link['updated'])) {
|
||||||
|
$upDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['updated']);
|
||||||
|
$link['up_iso_date'] = $this->getIsoDate($upDate, DateTime::ATOM);
|
||||||
} else {
|
} else {
|
||||||
$link['iso_date'] = $date->format(DateTime::ATOM);
|
$link['up_iso_date'] = $this->getIsoDate($pubDate, DateTime::ATOM);;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the more recent item.
|
// Save the more recent item.
|
||||||
if (empty($this->latestDate) || $this->latestDate < $date) {
|
if (empty($this->latestDate) || $this->latestDate < $pubDate) {
|
||||||
$this->latestDate = $date;
|
$this->latestDate = $pubDate;
|
||||||
|
}
|
||||||
|
if (!empty($upDate) && $this->latestDate < $upDate) {
|
||||||
|
$this->latestDate = $upDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
$taglist = array_filter(explode(' ', $link['tags']), 'strlen');
|
$taglist = array_filter(explode(' ', $link['tags']), 'strlen');
|
||||||
|
@ -249,6 +255,26 @@ protected function getLatestDateFormatted()
|
||||||
return $this->latestDate->format($type);
|
return $this->latestDate->format($type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ISO date from DateTime according to feed type.
|
||||||
|
*
|
||||||
|
* @param DateTime $date Date to format.
|
||||||
|
* @param string|bool $format Force format.
|
||||||
|
*
|
||||||
|
* @return string Formatted date.
|
||||||
|
*/
|
||||||
|
protected function getIsoDate(DateTime $date, $format = false)
|
||||||
|
{
|
||||||
|
if ($format !== false) {
|
||||||
|
return $date->format($format);
|
||||||
|
}
|
||||||
|
if ($this->feedType == self::$FEED_RSS) {
|
||||||
|
return $date->format(DateTime::RSS);
|
||||||
|
|
||||||
|
}
|
||||||
|
return $date->format(DateTime::ATOM);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of link to display according to 'nb' user input parameter.
|
* Returns the number of link to display according to 'nb' user input parameter.
|
||||||
*
|
*
|
||||||
|
|
|
@ -76,7 +76,7 @@ public function testRSSBuildData()
|
||||||
// Test headers (RSS)
|
// Test headers (RSS)
|
||||||
$this->assertEquals(self::$RSS_LANGUAGE, $data['language']);
|
$this->assertEquals(self::$RSS_LANGUAGE, $data['language']);
|
||||||
$this->assertEmpty($data['pubsubhub_url']);
|
$this->assertEmpty($data['pubsubhub_url']);
|
||||||
$this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $data['last_update']);
|
$this->assertRegExp('/Wed, 03 Aug 2016 09:30:33 \+\d{4}/', $data['last_update']);
|
||||||
$this->assertEquals(true, $data['show_dates']);
|
$this->assertEquals(true, $data['show_dates']);
|
||||||
$this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']);
|
$this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']);
|
||||||
$this->assertEquals('http://host.tld/', $data['index_url']);
|
$this->assertEquals('http://host.tld/', $data['index_url']);
|
||||||
|
@ -88,7 +88,10 @@ public function testRSSBuildData()
|
||||||
$this->assertEquals('20150310_114651', $link['linkdate']);
|
$this->assertEquals('20150310_114651', $link['linkdate']);
|
||||||
$this->assertEquals('http://host.tld/?WDWyig', $link['guid']);
|
$this->assertEquals('http://host.tld/?WDWyig', $link['guid']);
|
||||||
$this->assertEquals('http://host.tld/?WDWyig', $link['url']);
|
$this->assertEquals('http://host.tld/?WDWyig', $link['url']);
|
||||||
$this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['iso_date']);
|
$this->assertRegExp('/Tue, 10 Mar 2015 11:46:51 \+\d{4}/', $link['pub_iso_date']);
|
||||||
|
$pub = DateTime::createFromFormat(DateTime::RSS, $link['pub_iso_date']);
|
||||||
|
$up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']);
|
||||||
|
$this->assertEquals($pub, $up);
|
||||||
$this->assertContains('Stallman has a beard', $link['description']);
|
$this->assertContains('Stallman has a beard', $link['description']);
|
||||||
$this->assertContains('Permalink', $link['description']);
|
$this->assertContains('Permalink', $link['description']);
|
||||||
$this->assertContains('http://host.tld/?WDWyig', $link['description']);
|
$this->assertContains('http://host.tld/?WDWyig', $link['description']);
|
||||||
|
@ -101,6 +104,9 @@ public function testRSSBuildData()
|
||||||
// Test multitags.
|
// Test multitags.
|
||||||
$this->assertEquals(5, count($data['links']['20141125_084734']['taglist']));
|
$this->assertEquals(5, count($data['links']['20141125_084734']['taglist']));
|
||||||
$this->assertEquals('css', $data['links']['20141125_084734']['taglist'][0]);
|
$this->assertEquals('css', $data['links']['20141125_084734']['taglist'][0]);
|
||||||
|
|
||||||
|
// Test update date
|
||||||
|
$this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links']['20150310_114633']['up_iso_date']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,8 +118,10 @@ public function testAtomBuildData()
|
||||||
$feedBuilder->setLocale(self::$LOCALE);
|
$feedBuilder->setLocale(self::$LOCALE);
|
||||||
$data = $feedBuilder->buildData();
|
$data = $feedBuilder->buildData();
|
||||||
$this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
|
$this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
|
||||||
|
$this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']);
|
||||||
$link = array_shift($data['links']);
|
$link = array_shift($data['links']);
|
||||||
$this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:+\d{2}/', $link['iso_date']);
|
$this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']);
|
||||||
|
$this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links']['20150310_114633']['up_iso_date']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -30,7 +30,8 @@ function __construct()
|
||||||
'Richard Stallman and the Free Software Revolution. Read this. #hashtag',
|
'Richard Stallman and the Free Software Revolution. Read this. #hashtag',
|
||||||
0,
|
0,
|
||||||
'20150310_114633',
|
'20150310_114633',
|
||||||
'free gnu software stallman -exclude stuff hashtag'
|
'free gnu software stallman -exclude stuff hashtag',
|
||||||
|
'20160803_093033'
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->addLink(
|
$this->addLink(
|
||||||
|
@ -82,7 +83,7 @@ function __construct()
|
||||||
/**
|
/**
|
||||||
* Adds a new link
|
* Adds a new link
|
||||||
*/
|
*/
|
||||||
protected function addLink($title, $url, $description, $private, $date, $tags)
|
protected function addLink($title, $url, $description, $private, $date, $tags, $updated = '')
|
||||||
{
|
{
|
||||||
$link = array(
|
$link = array(
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
|
@ -91,6 +92,7 @@ protected function addLink($title, $url, $description, $private, $date, $tags)
|
||||||
'private' => $private,
|
'private' => $private,
|
||||||
'linkdate' => $date,
|
'linkdate' => $date,
|
||||||
'tags' => $tags,
|
'tags' => $tags,
|
||||||
|
'updated' => $updated,
|
||||||
);
|
);
|
||||||
$this->_links[$date] = $link;
|
$this->_links[$date] = $link;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,8 @@
|
||||||
{/if}
|
{/if}
|
||||||
<id>{$value.guid}</id>
|
<id>{$value.guid}</id>
|
||||||
{if="$show_dates"}
|
{if="$show_dates"}
|
||||||
<updated>{$value.iso_date}</updated>
|
<published>{$value.pub_iso_date}</published>
|
||||||
|
<updated>{$value.up_iso_date}</updated>
|
||||||
{/if}
|
{/if}
|
||||||
<content type="html" xml:lang="{$language}">
|
<content type="html" xml:lang="{$language}">
|
||||||
<![CDATA[{$value.description}]]>
|
<![CDATA[{$value.description}]]>
|
||||||
|
|
|
@ -22,7 +22,8 @@
|
||||||
<link>{$value.url}</link>
|
<link>{$value.url}</link>
|
||||||
{/if}
|
{/if}
|
||||||
{if="$show_dates"}
|
{if="$show_dates"}
|
||||||
<pubDate>{$value.iso_date}</pubDate>
|
<pubDate>{$value.pub_iso_date}</pubDate>
|
||||||
|
<atom:modified>{$value.up_iso_date}</atom:modified>
|
||||||
{/if}
|
{/if}
|
||||||
<description><![CDATA[{$value.description}]]></description>
|
<description><![CDATA[{$value.description}]]></description>
|
||||||
{loop="$value.taglist"}
|
{loop="$value.taglist"}
|
||||||
|
|
Loading…
Reference in a new issue