RSS and Atom feed helper.
Class declared in SYSPATH/classes/Feed.php on line 3.
Creates a feed from the given parameters.
array
$info
required - Feed information array
$items
required - Items to add to the feed string
$encoding
= string(5) "UTF-8" - Define which encoding to use string
public
static
function
create(
$info
,
$items
,
$encoding
=
'UTF-8'
)
{
$info
+= [
'title'
=>
'Generated Feed'
,
'link'
=>
''
,
'generator'
=>
'KohanaPHP'
];
$feed
=
'<?xml version="1.0" encoding="'
.
$encoding
.
'"?><rss version="2.0"><channel></channel></rss>'
;
$feed
= simplexml_load_string(
$feed
);
foreach
(
$info
as
$name
=>
$value
) {
if
(
$name
===
'image'
) {
// Create an image element
$image
=
$feed
->channel->addChild(
'image'
);
if
(!isset(
$value
[
'link'
],
$value
[
'url'
],
$value
[
'title'
])) {
throw
new
Kohana_Exception(
'Feed images require a link, url, and title'
);
}
if
(
strpos
(
$value
[
'link'
],
'://'
) === false) {
// Convert URIs to URLs
$value
[
'link'
] = URL::site(
$value
[
'link'
],
'http'
);
}
if
(
strpos
(
$value
[
'url'
],
'://'
) === false) {
// Convert URIs to URLs
$value
[
'url'
] = URL::site(
$value
[
'url'
],
'http'
);
}
// Create the image elements
$image
->addChild(
'link'
,
$value
[
'link'
]);
$image
->addChild(
'url'
,
$value
[
'url'
]);
$image
->addChild(
'title'
,
$value
[
'title'
]);
}
else
{
if
((
$name
===
'pubDate'
OR
$name
===
'lastBuildDate'
) AND (
is_int
(
$value
) OR ctype_digit(
$value
))) {
// Convert timestamps to RFC 822 formatted dates
$value
=
date
(
'r'
,
$value
);
}
elseif
((
$name
===
'link'
OR
$name
===
'docs'
) AND
strpos
(
$value
,
'://'
) === false) {
// Convert URIs to URLs
$value
= URL::site(
$value
,
'http'
);
}
// Add the info to the channel
$feed
->channel->addChild(
$name
,
$value
);
}
}
foreach
(
$items
as
$item
) {
// Add the item to the channel
$row
=
$feed
->channel->addChild(
'item'
);
foreach
(
$item
as
$name
=>
$value
) {
if
(
$name
===
'pubDate'
AND (
is_int
(
$value
) OR ctype_digit(
$value
))) {
// Convert timestamps to RFC 822 formatted dates
$value
=
date
(
'r'
,
$value
);
}
elseif
((
$name
===
'link'
OR
$name
===
'guid'
) AND
strpos
(
$value
,
'://'
) === false) {
// Convert URIs to URLs
$value
= URL::site(
$value
,
'http'
);
}
// Add the info to the row
$row
->addChild(
$name
,
$value
);
}
}
if
(function_exists(
'dom_import_simplexml'
)) {
// Convert the feed object to a DOM object
$feed
= dom_import_simplexml(
$feed
)->ownerDocument;
// DOM generates more readable XML
$feed
->formatOutput = true;
// Export the document as XML
$feed
=
$feed
->saveXML();
}
else
{
// Export the document as XML
$feed
=
$feed
->asXML();
}
return
$feed
;
}
Parses a remote feed into an array.
string
$feed
required - Remote feed URL integer
$limit
= integer 0 - Item limit to fetch array
public
static
function
parse(
$feed
,
$limit
= 0)
{
// Check if SimpleXML is installed
if
(!function_exists(
'simplexml_load_file'
))
throw
new
Kohana_Exception(
'SimpleXML must be installed!'
);
// Make limit an integer
$limit
= (int)
$limit
;
// Disable error reporting while opening the feed
$error_level
=
error_reporting
(0);
// Allow loading by filename or raw XML string
if
(Valid::url(
$feed
)) {
// Use native Request client to get remote contents
$response
= Request::factory(
$feed
)->execute();
$feed
=
$response
->body();
}
elseif
(
is_file
(
$feed
)) {
// Get file contents
$feed
=
file_get_contents
(
$feed
);
}
// Load the feed
$feed
= simplexml_load_string(
$feed
,
'SimpleXMLElement'
, LIBXML_NOCDATA);
// Restore error reporting
error_reporting
(
$error_level
);
// Feed could not be loaded
if
(
$feed
=== false)
return
[];
$namespaces
=
$feed
->getNamespaces(true);
// Detect the feed type. RSS 1.0/2.0 and Atom 1.0 are supported.
$feed
= isset(
$feed
->channel) ?
$feed
->xpath(
'//item'
) :
$feed
->entry;
$i
= 0;
$items
= [];
foreach
(
$feed
as
$item
) {
if
(
$limit
> 0 AND
$i
++ ===
$limit
)
break
;
$item_fields
= (
array
)
$item
;
// get namespaced tags
foreach
(
$namespaces
as
$ns
) {
$item_fields
+= (
array
)
$item
->children(
$ns
);
}
$items
[] =
$item_fields
;
}
return
$items
;
}