-
Notifications
You must be signed in to change notification settings - Fork 2
/
Feeder.class.php
121 lines (108 loc) · 3.46 KB
/
Feeder.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
/*************************************************************************
* Feeder
*
* Gets data from feeds
*
* @author Nathan Kowald
* @version 1.0
*
************************************************************************/
class Feeder
{
private static $feed_url;
private static $num_items;
private static $values;
/**
* isPrefix()
* Checks if an xml element is a prefix
*
* @param string $value A single value. Taken from the given $values array
* @return boolean True if prefix. False if not.
*/
private static function isPrefix($value)
{
if (strpos($value, ':') === false) {
return false;
} else {
return true;
}
}
/**
* getPrefixValue()
* Gets the value of a prefixed element
*
* @param SimpleXMLElement $element A simpleXML element object
* @param string $value A single value. Taken from the given $values array
* @return string Value of the prefix
*/
private static function getPrefixValue(SimpleXMLElement $element, $value)
{
$parts = explode(':', $value);
return (string) $element->children($parts[0], true)->$parts[1];
}
/**
* getData()
* Builds an array containing the feed values set in the $values array.
*
* @param SimpleXMLElement $simpleXML A simpleXML object created in Feeder::loadFeed()
* @return mixed Feed data if found or boolean false if no items found
*/
private static function getData(SimpleXMLElement $simpleXML)
{
$data = array();
$c = 0;
foreach ($simpleXML as $element) {
if ($c == self::$num_items) break;
foreach (self::$values as $val) {
$data[$c][$val] = (self::isPrefix($val)) ? self::getPrefixValue($element, $val) : (string) $element->$val;
}
$c++;
}
return (count($data) > 0) ? $data : false;
}
/**
* loadFeed()
* Loads a given feed.
*
* @return mixed Returns an xml object from a given feed, or false on failure
*/
private static function loadFeed()
{
$xml = @simplexml_load_file(self::$feed_url, 'SimpleXMLElement', LIBXML_NOCDATA); // Removes CDATA from XML
if (!$xml) {
// Feed can't be loaded
return false;
}
return $xml;
}
/**
* getEntries()
* Detects feed format: atom or rss. Returns entries for that format
*
* @return SimpleXmlElement object containing feed items/entries
*/
private static function getEntries()
{
if (!$xml = self::loadFeed()) return false;
$root_element = $xml->getName();
return ($root_element == 'rss') ? $xml->channel->item : $xml->entry;
}
/**
* getItems()
* Sets up required properties then gets $value data from the given feed
*
* @param string $feed_url URL of the feed you want to get data from
* @param int $num_items Number of feed items you want to get
* @param array $values Array of values to get from the feed. E.g. array('title', 'description', link')
* @return mixed array of feed data or false if no data found
*/
public static function getItems($feed_url='', $num_items=10, $values=array())
{
self::$feed_url = $feed_url;
self::$num_items = $num_items;
self::$values = $values;
if (!$entries = self::getEntries()) return false;
return self::getData($entries);
}
}