1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13: 14: 15: 16: 17: 18: 19: 20: 21:
22: class Feed_Writers_Atom implements Feed_Writers_Interface
23: {
24: 25: 26: 27: 28:
29: private $feed;
30:
31: 32: 33: 34: 35:
36: private $entries;
37:
38: 39: 40: 41: 42:
43: private $DOM;
44:
45: 46: 47: 48: 49:
50: private $file;
51:
52: 53: 54: 55: 56:
57: public function __construct(Feed_Feed $feed,$fichier=null)
58: {
59: $this->feed = $feed;
60: $this->entries = $feed->getEntries();
61: $this->DOM = new DOMDocument('1.0','UTF-8');
62: $this->file = $fichier;
63:
64: $atom = $this->DOM->createElement('feed');
65: $atom->setAttribute('xmlns','http://www.w3.org/2005/Atom');
66: $atom->setAttribute('xml:lang',$feed->getLang());
67: $this->DOM->appendChild($atom);
68:
69: $this->buildFeedInfo($atom);
70: $this->buildItems($atom);
71: }
72:
73: 74: 75: 76: 77: 78:
79: private function buildFeedInfo($atom)
80: {
81: $id = $this->DOM->createElement('id',$this->feed->getId());
82: $title = $this->DOM->createElement('title',$this->feed->getTitle());
83: $date = $this->DOM->createElement('updated',$this->convertDate($this->feed->getDate()));
84:
85: $atom->appendChild($id);
86: $atom->appendChild($title);
87: $atom->appendChild($date);
88:
89: $dLink = $this->feed->getLink();
90: if(!empty($dLink))
91: {
92: $link = $this->DOM->createElement('link');
93: $link->setAttribute('rel','alternate');
94: $link->setAttribute('href',$dLink);
95: $atom->appendChild($link);
96: }
97:
98: $eAuthor = $this->feed->getAuthor();
99: if(!empty($eAuthor))
100: {
101: $author = $this->DOM->createElement('author');
102: $atom->appendChild($author);
103: if(key_exists('name',$eAuthor))
104: {
105: $name = $this->DOM->createElement('name',$eAuthor['name']);
106: $author->appendChild($name);
107: }
108:
109: if(key_exists('email',$eAuthor))
110: {
111: $email = $this->DOM->createElement('email',$eAuthor['email']);
112: $author->appendChild($email);
113: }
114:
115: if(key_exists('uri',$eAuthor))
116: {
117: $uri = $this->DOM->createElement('uri',$eAuthor['uri']);
118: $author->appendChild($uri);
119: }
120: }
121: }
122:
123: 124: 125: 126: 127: 128:
129: private function buildItems($atom)
130: {
131: if(!empty($this->entries))
132: {
133: foreach($this->entries as $entry)
134: {
135: $item = $this->DOM->createElement('entry');
136: $atom->appendChild($item);
137:
138: $id = $this->DOM->createElement('id',$entry->getId());
139: $title = $this->DOM->createElement('title',$entry->getTitle());
140: $date = $this->DOM->createElement('updated',$this->convertDate($entry->getDate()));
141:
142: $item->appendChild($id);
143: $item->appendChild($title);
144: $item->appendChild($date);
145:
146: $eAuthor = $entry->getAuthor();
147: if(!empty($eAuthor))
148: {
149: $author = $this->DOM->createElement('author',$eAuthor);
150: $item->appendChild($author);
151: if(key_exists('name',$eAuthor))
152: {
153: $name = $this->DOM->createElement('name',$eAuthor['name']);
154: $author->appendChild($name);
155: }
156:
157: if(key_exists('email',$eAuthor))
158: {
159: $email = $this->DOM->createElement('email',$eAuthor['email']);
160: $author->appendChild($email);
161: }
162:
163: if(key_exists('uri',$eAuthor))
164: {
165: $uri = $this->DOM->createElement('uri',$eAuthor['uri']);
166: $author->appendChild($uri);
167: }
168: }
169:
170: $dContent = $entry->getContent();
171: if(!empty($dContent))
172: {
173:
174: $content = $this->DOM->createElement('content');
175: $cdata = $this->DOM->createCDATASection($dContent);
176: $content->appendChild($cdata);
177: $item->appendChild($content);
178: }
179:
180: $dLink = $entry->getLink();
181: if(!empty($dLink))
182: {
183: $link = $this->DOM->createElement('link');
184: $link->setAttribute('href',$dLink);
185: $item->appendChild($link);
186: }
187: }
188: }
189: }
190:
191: 192: 193: 194: 195:
196: private function convertDate($date)
197: {
198: if(is_int($date))
199: {
200: return date('c',$date);
201: }
202: elseif(preg_match('`^(\d{4}|\d{2})-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}$`',$date))
203: {
204: $datetime = explode(' ',$date);
205: list($annee,$mois,$jour) = explode('/',$datetime[0]);
206: list($heure,$min,$sec) = explode(':',$datetime[1]);
207: return date('c',mktime($heure,$min,$sec,$mois,$jour,$annee));
208: }
209: else
210: {
211: return $date;
212: }
213: }
214:
215: 216: 217: 218:
219: public function finalize()
220: {
221: if(!empty($this->file))
222: {
223: if(file_exists($this->file) && is_writable($this->file))
224: return $this->DOM->save($this->file);
225: else
226: throw new Exception('Impossible d\'ecrire dans le fichier');
227: }
228: else
229: {
230: return $this->DOM->saveXML();
231: }
232: }
233: }
234: ?>