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 informationarray
$items
required - Items to add to the feedstring
$format
= string(4) "rss2" - Define which format to use (only rss2 is supported)string
$encoding
= string(5) "UTF-8" - Define which encoding to usestring
public
static
function
create(
$info
,
$items
,
$format
=
'rss2'
,
$encoding
=
'UTF-8'
)
{
$info
+=
array
(
'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 URLinteger
$limit
= integer 0 - Item limit to fetcharray
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
$load
= (
is_file
(
$feed
) OR Valid::url(
$feed
)) ?
'simplexml_load_file'
:
'simplexml_load_string'
;
// Load the feed
$feed
=
$load
(
$feed
,
'SimpleXMLElement'
, LIBXML_NOCDATA);
// Restore error reporting
error_reporting
(
$error_level
);
// Feed could not be loaded
if
(
$feed
=== FALSE)
return
array
();
$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
=
array
();
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
;
}