[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * Joomla! Content Management System 5 * 6 * @copyright (C) 2015 Open Source Matters, Inc. <https://www.joomla.org> 7 * @license GNU General Public License version 2 or later; see LICENSE.txt 8 */ 9 10 namespace Joomla\CMS\Document\Renderer\Feed; 11 12 use Joomla\CMS\Date\Date; 13 use Joomla\CMS\Document\DocumentRenderer; 14 use Joomla\CMS\Factory; 15 use Joomla\CMS\Language\Text; 16 use Joomla\CMS\Router\Route; 17 use Joomla\CMS\Uri\Uri; 18 19 // phpcs:disable PSR1.Files.SideEffects 20 \defined('JPATH_PLATFORM') or die; 21 // phpcs:enable PSR1.Files.SideEffects 22 23 /** 24 * RssRenderer is a feed that implements RSS 2.0 Specification 25 * 26 * @link http://www.rssboard.org/rss-specification 27 * @since 3.5 28 * 29 * @property-read \Joomla\CMS\Document\FeedDocument $_doc Reference to the Document object that instantiated the renderer 30 */ 31 class RssRenderer extends DocumentRenderer 32 { 33 /** 34 * Renderer mime type 35 * 36 * @var string 37 * @since 3.5 38 */ 39 protected $_mime = 'application/rss+xml'; 40 41 /** 42 * Render the feed. 43 * 44 * @param string $name The name of the element to render 45 * @param array $params Array of values 46 * @param string $content Override the output of the renderer 47 * 48 * @return string The output of the script 49 * 50 * @see DocumentRenderer::render() 51 * @since 3.5 52 */ 53 public function render($name = '', $params = null, $content = null) 54 { 55 $app = Factory::getApplication(); 56 $tz = new \DateTimeZone($app->get('offset')); 57 58 $data = $this->_doc; 59 60 // If the last build date from the document isn't a Date object, create one 61 if (!($data->lastBuildDate instanceof Date)) { 62 // Gets and sets timezone offset from site configuration 63 $data->lastBuildDate = Factory::getDate(); 64 $data->lastBuildDate->setTimezone(new \DateTimeZone($app->get('offset'))); 65 } 66 67 $url = Uri::getInstance()->toString(array('scheme', 'user', 'pass', 'host', 'port')); 68 $syndicationURL = Route::_('&format=feed&type=rss'); 69 70 $title = $data->getTitle(); 71 72 if ($app->get('sitename_pagetitles', 0) == 1) { 73 $title = Text::sprintf('JPAGETITLE', $app->get('sitename'), $data->getTitle()); 74 } elseif ($app->get('sitename_pagetitles', 0) == 2) { 75 $title = Text::sprintf('JPAGETITLE', $data->getTitle(), $app->get('sitename')); 76 } 77 78 $feed_title = htmlspecialchars($title, ENT_COMPAT, 'UTF-8'); 79 80 $datalink = $data->getLink(); 81 82 if (preg_match('/[\x80-\xFF]/', $datalink)) { 83 $datalink = implode('/', array_map('rawurlencode', explode('/', $datalink))); 84 } 85 86 $feed = "<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n"; 87 $feed .= " <channel>\n"; 88 $feed .= " <title>" . $feed_title . "</title>\n"; 89 $feed .= " <description><![CDATA[" . $data->getDescription() . "]]></description>\n"; 90 $feed .= " <link>" . str_replace(' ', '%20', $url . $datalink) . "</link>\n"; 91 $feed .= " <lastBuildDate>" . htmlspecialchars($data->lastBuildDate->toRFC822(true), ENT_COMPAT, 'UTF-8') . "</lastBuildDate>\n"; 92 $feed .= " <generator>" . $data->getGenerator() . "</generator>\n"; 93 $feed .= " <atom:link rel=\"self\" type=\"application/rss+xml\" href=\"" . str_replace(' ', '%20', $url . $syndicationURL) . "\"/>\n"; 94 95 if ($data->image != null) { 96 $feed .= " <image>\n"; 97 $feed .= " <url>" . $data->image->url . "</url>\n"; 98 $feed .= " <title>" . htmlspecialchars($data->image->title, ENT_COMPAT, 'UTF-8') . "</title>\n"; 99 $feed .= " <link>" . str_replace(' ', '%20', $data->image->link) . "</link>\n"; 100 101 if ($data->image->width != '') { 102 $feed .= " <width>" . $data->image->width . "</width>\n"; 103 } 104 105 if ($data->image->height != '') { 106 $feed .= " <height>" . $data->image->height . "</height>\n"; 107 } 108 109 if ($data->image->description != '') { 110 $feed .= " <description><![CDATA[" . $data->image->description . "]]></description>\n"; 111 } 112 113 $feed .= " </image>\n"; 114 } 115 116 if ($data->getLanguage() !== '') { 117 $feed .= " <language>" . $data->getLanguage() . "</language>\n"; 118 } 119 120 if ($data->copyright != '') { 121 $feed .= " <copyright>" . htmlspecialchars($data->copyright, ENT_COMPAT, 'UTF-8') . "</copyright>\n"; 122 } 123 124 if ($data->editorEmail != '') { 125 $feed .= " <managingEditor>" . htmlspecialchars($data->editorEmail, ENT_COMPAT, 'UTF-8') . ' (' 126 . htmlspecialchars($data->editor, ENT_COMPAT, 'UTF-8') . ")</managingEditor>\n"; 127 } 128 129 if ($data->webmaster != '') { 130 $feed .= " <webMaster>" . htmlspecialchars($data->webmaster, ENT_COMPAT, 'UTF-8') . "</webMaster>\n"; 131 } 132 133 if ($data->pubDate != '') { 134 $pubDate = Factory::getDate($data->pubDate); 135 $pubDate->setTimezone($tz); 136 $feed .= " <pubDate>" . htmlspecialchars($pubDate->toRFC822(true), ENT_COMPAT, 'UTF-8') . "</pubDate>\n"; 137 } 138 139 if (!empty($data->category)) { 140 if (\is_array($data->category)) { 141 foreach ($data->category as $cat) { 142 $feed .= " <category>" . htmlspecialchars($cat, ENT_COMPAT, 'UTF-8') . "</category>\n"; 143 } 144 } else { 145 $feed .= " <category>" . htmlspecialchars($data->category, ENT_COMPAT, 'UTF-8') . "</category>\n"; 146 } 147 } 148 149 if ($data->docs != '') { 150 $feed .= " <docs>" . htmlspecialchars($data->docs, ENT_COMPAT, 'UTF-8') . "</docs>\n"; 151 } 152 153 if ($data->ttl != '') { 154 $feed .= " <ttl>" . htmlspecialchars($data->ttl, ENT_COMPAT, 'UTF-8') . "</ttl>\n"; 155 } 156 157 if ($data->rating != '') { 158 $feed .= " <rating>" . htmlspecialchars($data->rating, ENT_COMPAT, 'UTF-8') . "</rating>\n"; 159 } 160 161 if ($data->skipHours != '') { 162 $feed .= " <skipHours>" . htmlspecialchars($data->skipHours, ENT_COMPAT, 'UTF-8') . "</skipHours>\n"; 163 } 164 165 if ($data->skipDays != '') { 166 $feed .= " <skipDays>" . htmlspecialchars($data->skipDays, ENT_COMPAT, 'UTF-8') . "</skipDays>\n"; 167 } 168 169 for ($i = 0, $count = \count($data->items); $i < $count; $i++) { 170 $itemlink = $data->items[$i]->link; 171 172 if (preg_match('/[\x80-\xFF]/', $itemlink)) { 173 $itemlink = implode('/', array_map('rawurlencode', explode('/', $itemlink))); 174 } 175 176 if ((strpos($itemlink, 'http://') === false) && (strpos($itemlink, 'https://') === false)) { 177 $itemlink = str_replace(' ', '%20', $url . $itemlink); 178 } 179 180 $feed .= " <item>\n"; 181 $feed .= " <title>" . htmlspecialchars(strip_tags($data->items[$i]->title), ENT_COMPAT, 'UTF-8') . "</title>\n"; 182 $feed .= " <link>" . str_replace(' ', '%20', $itemlink) . "</link>\n"; 183 184 if (empty($data->items[$i]->guid)) { 185 $feed .= " <guid isPermaLink=\"true\">" . str_replace(' ', '%20', $itemlink) . "</guid>\n"; 186 } else { 187 $feed .= " <guid isPermaLink=\"false\">" . htmlspecialchars($data->items[$i]->guid, ENT_COMPAT, 'UTF-8') . "</guid>\n"; 188 } 189 190 $feed .= " <description><![CDATA[" . $this->_relToAbs($data->items[$i]->description) . "]]></description>\n"; 191 192 if ($data->items[$i]->authorEmail != '') { 193 $feed .= ' <author>' 194 . htmlspecialchars($data->items[$i]->authorEmail . ' (' . $data->items[$i]->author . ')', ENT_COMPAT, 'UTF-8') . "</author>\n"; 195 } 196 197 /* 198 * @todo: On hold 199 * if ($data->items[$i]->source!='') 200 * { 201 * $data.= " <source>" . htmlspecialchars($data->items[$i]->source, ENT_COMPAT, 'UTF-8') . "</source>\n"; 202 * } 203 */ 204 205 if (empty($data->items[$i]->category) === false) { 206 if (\is_array($data->items[$i]->category)) { 207 foreach ($data->items[$i]->category as $cat) { 208 $feed .= " <category>" . htmlspecialchars($cat, ENT_COMPAT, 'UTF-8') . "</category>\n"; 209 } 210 } else { 211 $feed .= " <category>" . htmlspecialchars($data->items[$i]->category, ENT_COMPAT, 'UTF-8') . "</category>\n"; 212 } 213 } 214 215 if ($data->items[$i]->comments != '') { 216 $feed .= " <comments>" . htmlspecialchars($data->items[$i]->comments, ENT_COMPAT, 'UTF-8') . "</comments>\n"; 217 } 218 219 if ($data->items[$i]->date != '') { 220 $itemDate = Factory::getDate($data->items[$i]->date); 221 $itemDate->setTimezone($tz); 222 $feed .= " <pubDate>" . htmlspecialchars($itemDate->toRFC822(true), ENT_COMPAT, 'UTF-8') . "</pubDate>\n"; 223 } 224 225 if ($data->items[$i]->enclosure != null) { 226 $feed .= " <enclosure url=\""; 227 $feed .= $data->items[$i]->enclosure->url; 228 $feed .= "\" length=\""; 229 $feed .= $data->items[$i]->enclosure->length; 230 $feed .= "\" type=\""; 231 $feed .= $data->items[$i]->enclosure->type; 232 $feed .= "\"/>\n"; 233 } 234 235 $feed .= " </item>\n"; 236 } 237 238 $feed .= " </channel>\n"; 239 $feed .= "</rss>\n"; 240 241 return $feed; 242 } 243 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |