1: <?php
2: 3: 4:
5: class Horde_Block_Feed extends Horde_Core_Block
6: {
7: 8:
9: private $_feed = null;
10:
11: 12:
13: public function __construct($app, $params = array())
14: {
15: parent::__construct($app, $params);
16:
17: $this->enabled = class_exists('Horde_Feed');
18: $this->_name = _("Syndicated Feed");
19: }
20:
21: 22:
23: protected function _params()
24: {
25: return array(
26: 'uri' => array(
27: 'type' => 'text',
28: 'name' => _("Feed Address")
29: ),
30: 'limit' => array(
31: 'name' => _("Number of articles to display"),
32: 'type' => 'int',
33: 'default' => 10
34: ),
35: 'interval' => array(
36: 'name' => _("How many seconds before we check for new articles?"),
37: 'type' => 'int',
38: 'default' => 86400
39: ),
40: 'details' => array(
41: 'name' => _("Show extra detail?"),
42: 'type' => 'boolean',
43: 'default' => 20
44: )
45: );
46: }
47:
48: 49:
50: protected function _title()
51: {
52: $this->_read();
53:
54: return ($this->_feed instanceof Horde_Feed_Base)
55: ? $this->_feed->title()
56: : _("Feed");
57: }
58:
59: 60:
61: protected function _content()
62: {
63: $this->_read();
64:
65: if ($this->_feed instanceof Horde_Feed_Base) {
66: $html = '';
67: $count = 0;
68: foreach ($this->_feed as $entry) {
69: if (++$count > $this->_params['limit']) {
70: break;
71: }
72: $html .= '<a href="' . $entry->link. '"';
73: if (empty($this->_params['details'])) {
74: $html .= ' title="' . htmlspecialchars(strip_tags($entry->description())) . '"';
75: }
76: $html .= '>' . htmlspecialchars($entry->title) . '</a>';
77: if (!empty($this->_params['details'])) {
78: $html .= '<br />' . htmlspecialchars(strip_tags($entry->description())). "<br />\n";
79: }
80: $html .= '<br />';
81: }
82: return $html;
83: }
84:
85: return is_string($this->_feed)
86: ? $this->_feed
87: : '';
88: }
89:
90: 91:
92: private function _read()
93: {
94: if (empty($this->_params['uri'])) {
95: return;
96: }
97:
98: $key = md5($this->_params['uri']);
99: $cache = $GLOBALS['injector']->getInstance('Horde_Cache');
100: $feed = $cache->get($key, $this->_params['interval']);
101: if (!empty($feed)) {
102: $this->_feed = unserialize($feed);
103: }
104:
105: try {
106: $client = $GLOBALS['injector']
107: ->getInstance('Horde_Core_Factory_HttpClient')
108: ->create();
109: $feed = Horde_Feed::readUri($this->_params['uri'], $client);
110: $cache->set($key, serialize($feed));
111: $this->_feed = $feed;
112: } catch (Exception $e) {
113: $this->_feed = $e->getMessage();
114: }
115: }
116:
117: }
118: