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@12
|
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 * Get update frequency
|
Chris@0
|
48 *
|
Chris@0
|
49 * @return int
|
Chris@0
|
50 */
|
Chris@0
|
51 public function getUpdateFrequency()
|
Chris@0
|
52 {
|
Chris@0
|
53 $name = 'updateFrequency';
|
Chris@0
|
54 $freq = $this->getData($name, 'number');
|
Chris@0
|
55
|
Chris@12
|
56 if (! $freq || $freq < 1) {
|
Chris@0
|
57 $this->data[$name] = 1;
|
Chris@0
|
58 return 1;
|
Chris@0
|
59 }
|
Chris@0
|
60
|
Chris@0
|
61 return $freq;
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 /**
|
Chris@0
|
65 * Get update frequency as ticks
|
Chris@0
|
66 *
|
Chris@0
|
67 * @return int
|
Chris@0
|
68 */
|
Chris@0
|
69 public function getUpdateFrequencyAsTicks()
|
Chris@0
|
70 {
|
Chris@0
|
71 $name = 'updateFrequency';
|
Chris@0
|
72 $freq = $this->getData($name, 'number');
|
Chris@0
|
73
|
Chris@12
|
74 if (! $freq || $freq < 1) {
|
Chris@0
|
75 $this->data[$name] = 1;
|
Chris@0
|
76 $freq = 1;
|
Chris@0
|
77 }
|
Chris@0
|
78
|
Chris@0
|
79 $period = $this->getUpdatePeriod();
|
Chris@0
|
80 $ticks = 1;
|
Chris@0
|
81
|
Chris@0
|
82 switch ($period) {
|
Chris@0
|
83 case 'yearly':
|
Chris@0
|
84 $ticks *= 52; //TODO: fix generalisation, how?
|
Chris@0
|
85 // no break
|
Chris@0
|
86 case 'weekly':
|
Chris@0
|
87 $ticks *= 7;
|
Chris@0
|
88 // no break
|
Chris@0
|
89 case 'daily':
|
Chris@0
|
90 $ticks *= 24;
|
Chris@0
|
91 // no break
|
Chris@0
|
92 case 'hourly':
|
Chris@0
|
93 $ticks *= 3600;
|
Chris@0
|
94 break;
|
Chris@0
|
95 default: //Never arrive here, exception thrown in getPeriod()
|
Chris@0
|
96 break;
|
Chris@0
|
97 }
|
Chris@0
|
98
|
Chris@0
|
99 return $ticks / $freq;
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * Get update base
|
Chris@0
|
104 *
|
Chris@0
|
105 * @return DateTime|null
|
Chris@0
|
106 */
|
Chris@0
|
107 public function getUpdateBase()
|
Chris@0
|
108 {
|
Chris@0
|
109 $updateBase = $this->getData('updateBase');
|
Chris@0
|
110 $date = null;
|
Chris@0
|
111 if ($updateBase) {
|
Chris@0
|
112 $date = DateTime::createFromFormat(DateTime::W3C, $updateBase);
|
Chris@0
|
113 }
|
Chris@0
|
114 return $date;
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 /**
|
Chris@0
|
118 * Get the entry data specified by name
|
Chris@0
|
119 *
|
Chris@0
|
120 * @param string $name
|
Chris@0
|
121 * @param string $type
|
Chris@0
|
122 * @return mixed|null
|
Chris@0
|
123 */
|
Chris@0
|
124 private function getData($name, $type = 'string')
|
Chris@0
|
125 {
|
Chris@0
|
126 if (array_key_exists($name, $this->data)) {
|
Chris@0
|
127 return $this->data[$name];
|
Chris@0
|
128 }
|
Chris@0
|
129
|
Chris@0
|
130 $data = $this->xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/syn10:' . $name . ')');
|
Chris@0
|
131
|
Chris@12
|
132 if (! $data) {
|
Chris@0
|
133 $data = null;
|
Chris@0
|
134 }
|
Chris@0
|
135
|
Chris@0
|
136 $this->data[$name] = $data;
|
Chris@0
|
137
|
Chris@0
|
138 return $data;
|
Chris@0
|
139 }
|
Chris@0
|
140
|
Chris@0
|
141 /**
|
Chris@0
|
142 * Register Syndication namespaces
|
Chris@0
|
143 *
|
Chris@0
|
144 * @return void
|
Chris@0
|
145 */
|
Chris@0
|
146 protected function registerNamespaces()
|
Chris@0
|
147 {
|
Chris@0
|
148 $this->xpath->registerNamespace('syn10', 'http://purl.org/rss/1.0/modules/syndication/');
|
Chris@0
|
149 }
|
Chris@0
|
150 }
|