Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * Zend Framework (http://framework.zend.com/)
|
Chris@0
|
4 *
|
Chris@0
|
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
|
Chris@0
|
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
7 * @license http://framework.zend.com/license/new-bsd New BSD License
|
Chris@0
|
8 */
|
Chris@0
|
9
|
Chris@0
|
10 namespace Zend\Feed\Reader\Extension\Syndication;
|
Chris@0
|
11
|
Chris@0
|
12 use DateTime;
|
Chris@0
|
13 use Zend\Feed\Reader;
|
Chris@0
|
14 use Zend\Feed\Reader\Extension;
|
Chris@0
|
15
|
Chris@0
|
16 class Feed extends Extension\AbstractFeed
|
Chris@0
|
17 {
|
Chris@0
|
18 /**
|
Chris@0
|
19 * Get update period
|
Chris@0
|
20 *
|
Chris@0
|
21 * @return string
|
Chris@0
|
22 * @throws Reader\Exception\InvalidArgumentException
|
Chris@0
|
23 */
|
Chris@0
|
24 public function getUpdatePeriod()
|
Chris@0
|
25 {
|
Chris@0
|
26 $name = 'updatePeriod';
|
Chris@0
|
27 $period = $this->getData($name);
|
Chris@0
|
28
|
Chris@0
|
29 if ($period === null) {
|
Chris@0
|
30 $this->data[$name] = 'daily';
|
Chris@0
|
31 return 'daily'; //Default specified by spec
|
Chris@0
|
32 }
|
Chris@0
|
33
|
Chris@0
|
34 switch ($period) {
|
Chris@0
|
35 case 'hourly':
|
Chris@0
|
36 case 'daily':
|
Chris@0
|
37 case 'weekly':
|
Chris@0
|
38 case 'yearly':
|
Chris@0
|
39 return $period;
|
Chris@0
|
40 default:
|
Chris@0
|
41 throw new Reader\Exception\InvalidArgumentException("Feed specified invalid update period: '$period'."
|
Chris@0
|
42 . " Must be one of hourly, daily, weekly or yearly"
|
Chris@0
|
43 );
|
Chris@0
|
44 }
|
Chris@0
|
45 }
|
Chris@0
|
46
|
Chris@0
|
47 /**
|
Chris@0
|
48 * Get update frequency
|
Chris@0
|
49 *
|
Chris@0
|
50 * @return int
|
Chris@0
|
51 */
|
Chris@0
|
52 public function getUpdateFrequency()
|
Chris@0
|
53 {
|
Chris@0
|
54 $name = 'updateFrequency';
|
Chris@0
|
55 $freq = $this->getData($name, 'number');
|
Chris@0
|
56
|
Chris@0
|
57 if (!$freq || $freq < 1) {
|
Chris@0
|
58 $this->data[$name] = 1;
|
Chris@0
|
59 return 1;
|
Chris@0
|
60 }
|
Chris@0
|
61
|
Chris@0
|
62 return $freq;
|
Chris@0
|
63 }
|
Chris@0
|
64
|
Chris@0
|
65 /**
|
Chris@0
|
66 * Get update frequency as ticks
|
Chris@0
|
67 *
|
Chris@0
|
68 * @return int
|
Chris@0
|
69 */
|
Chris@0
|
70 public function getUpdateFrequencyAsTicks()
|
Chris@0
|
71 {
|
Chris@0
|
72 $name = 'updateFrequency';
|
Chris@0
|
73 $freq = $this->getData($name, 'number');
|
Chris@0
|
74
|
Chris@0
|
75 if (!$freq || $freq < 1) {
|
Chris@0
|
76 $this->data[$name] = 1;
|
Chris@0
|
77 $freq = 1;
|
Chris@0
|
78 }
|
Chris@0
|
79
|
Chris@0
|
80 $period = $this->getUpdatePeriod();
|
Chris@0
|
81 $ticks = 1;
|
Chris@0
|
82
|
Chris@0
|
83 switch ($period) {
|
Chris@0
|
84 case 'yearly':
|
Chris@0
|
85 $ticks *= 52; //TODO: fix generalisation, how?
|
Chris@0
|
86 // no break
|
Chris@0
|
87 case 'weekly':
|
Chris@0
|
88 $ticks *= 7;
|
Chris@0
|
89 // no break
|
Chris@0
|
90 case 'daily':
|
Chris@0
|
91 $ticks *= 24;
|
Chris@0
|
92 // no break
|
Chris@0
|
93 case 'hourly':
|
Chris@0
|
94 $ticks *= 3600;
|
Chris@0
|
95 break;
|
Chris@0
|
96 default: //Never arrive here, exception thrown in getPeriod()
|
Chris@0
|
97 break;
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 return $ticks / $freq;
|
Chris@0
|
101 }
|
Chris@0
|
102
|
Chris@0
|
103 /**
|
Chris@0
|
104 * Get update base
|
Chris@0
|
105 *
|
Chris@0
|
106 * @return DateTime|null
|
Chris@0
|
107 */
|
Chris@0
|
108 public function getUpdateBase()
|
Chris@0
|
109 {
|
Chris@0
|
110 $updateBase = $this->getData('updateBase');
|
Chris@0
|
111 $date = null;
|
Chris@0
|
112 if ($updateBase) {
|
Chris@0
|
113 $date = DateTime::createFromFormat(DateTime::W3C, $updateBase);
|
Chris@0
|
114 }
|
Chris@0
|
115 return $date;
|
Chris@0
|
116 }
|
Chris@0
|
117
|
Chris@0
|
118 /**
|
Chris@0
|
119 * Get the entry data specified by name
|
Chris@0
|
120 *
|
Chris@0
|
121 * @param string $name
|
Chris@0
|
122 * @param string $type
|
Chris@0
|
123 * @return mixed|null
|
Chris@0
|
124 */
|
Chris@0
|
125 private function getData($name, $type = 'string')
|
Chris@0
|
126 {
|
Chris@0
|
127 if (array_key_exists($name, $this->data)) {
|
Chris@0
|
128 return $this->data[$name];
|
Chris@0
|
129 }
|
Chris@0
|
130
|
Chris@0
|
131 $data = $this->xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/syn10:' . $name . ')');
|
Chris@0
|
132
|
Chris@0
|
133 if (!$data) {
|
Chris@0
|
134 $data = null;
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 $this->data[$name] = $data;
|
Chris@0
|
138
|
Chris@0
|
139 return $data;
|
Chris@0
|
140 }
|
Chris@0
|
141
|
Chris@0
|
142 /**
|
Chris@0
|
143 * Register Syndication namespaces
|
Chris@0
|
144 *
|
Chris@0
|
145 * @return void
|
Chris@0
|
146 */
|
Chris@0
|
147 protected function registerNamespaces()
|
Chris@0
|
148 {
|
Chris@0
|
149 $this->xpath->registerNamespace('syn10', 'http://purl.org/rss/1.0/modules/syndication/');
|
Chris@0
|
150 }
|
Chris@0
|
151 }
|