[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/libraries/src/Document/Renderer/Feed/ -> RssRenderer.php (source)

   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  }


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer