[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/libraries/src/Document/Renderer/Feed/ -> AtomRenderer.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\Document\DocumentRenderer;
  13  use Joomla\CMS\Factory;
  14  use Joomla\CMS\Language\Text;
  15  use Joomla\CMS\Router\Route;
  16  use Joomla\CMS\Uri\Uri;
  17  use Joomla\CMS\Version;
  18  
  19  // phpcs:disable PSR1.Files.SideEffects
  20  \defined('JPATH_PLATFORM') or die;
  21  // phpcs:enable PSR1.Files.SideEffects
  22  
  23  /**
  24   * AtomRenderer is a feed that implements the atom specification
  25   *
  26   * Please note that just by using this class you won't automatically
  27   * produce valid atom files. For example, you have to specify either an editor
  28   * for the feed or an author for every single feed item.
  29   *
  30   * @link   http://www.atomenabled.org/developers/syndication/atom-format-spec.php
  31   * @since  3.5
  32   *
  33   * @property-read  \Joomla\CMS\Document\FeedDocument  $_doc  Reference to the Document object that instantiated the renderer
  34   */
  35  class AtomRenderer extends DocumentRenderer
  36  {
  37      /**
  38       * Document mime type
  39       *
  40       * @var    string
  41       * @since  3.5
  42       */
  43      protected $_mime = 'application/atom+xml';
  44  
  45      /**
  46       * Render the feed.
  47       *
  48       * @param   string  $name     The name of the element to render
  49       * @param   array   $params   Array of values
  50       * @param   string  $content  Override the output of the renderer
  51       *
  52       * @return  string  The output of the script
  53       *
  54       * @see     DocumentRenderer::render()
  55       * @since   3.5
  56       */
  57      public function render($name = '', $params = null, $content = null)
  58      {
  59          $app = Factory::getApplication();
  60  
  61          // Gets and sets timezone offset from site configuration
  62          $tz  = new \DateTimeZone($app->get('offset'));
  63          $now = Factory::getDate();
  64          $now->setTimezone($tz);
  65  
  66          $data = $this->_doc;
  67  
  68          $url = Uri::getInstance()->toString(array('scheme', 'user', 'pass', 'host', 'port'));
  69          $syndicationURL = Route::_('&format=feed&type=atom');
  70  
  71          $title = $data->getTitle();
  72  
  73          if ($app->get('sitename_pagetitles', 0) == 1) {
  74              $title = Text::sprintf('JPAGETITLE', $app->get('sitename'), $data->getTitle());
  75          } elseif ($app->get('sitename_pagetitles', 0) == 2) {
  76              $title = Text::sprintf('JPAGETITLE', $data->getTitle(), $app->get('sitename'));
  77          }
  78  
  79          $feed_title = htmlspecialchars($title, ENT_COMPAT, 'UTF-8');
  80  
  81          $feed = "<feed xmlns=\"http://www.w3.org/2005/Atom\"";
  82  
  83          if ($data->getLanguage() != '') {
  84              $feed .= " xml:lang=\"" . $data->getLanguage() . "\"";
  85          }
  86  
  87          $feed .= ">\n";
  88          $feed .= "    <title type=\"text\">" . $feed_title . "</title>\n";
  89          $feed .= "    <subtitle type=\"text\">" . htmlspecialchars($data->getDescription(), ENT_COMPAT, 'UTF-8') . "</subtitle>\n";
  90  
  91          if (!empty($data->category)) {
  92              if (\is_array($data->category)) {
  93                  foreach ($data->category as $cat) {
  94                      $feed .= "    <category term=\"" . htmlspecialchars($cat, ENT_COMPAT, 'UTF-8') . "\" />\n";
  95                  }
  96              } else {
  97                  $feed .= "    <category term=\"" . htmlspecialchars($data->category, ENT_COMPAT, 'UTF-8') . "\" />\n";
  98              }
  99          }
 100  
 101          $feed .= "    <link rel=\"alternate\" type=\"text/html\" href=\"" . $url . "\"/>\n";
 102          $feed .= "    <id>" . str_replace(' ', '%20', $data->getBase()) . "</id>\n";
 103          $feed .= "    <updated>" . htmlspecialchars($now->toISO8601(true), ENT_COMPAT, 'UTF-8') . "</updated>\n";
 104  
 105          if ($data->editor != '') {
 106              $feed .= "    <author>\n";
 107              $feed .= "        <name>" . $data->editor . "</name>\n";
 108  
 109              if ($data->editorEmail != '') {
 110                  $feed .= "        <email>" . htmlspecialchars($data->editorEmail, ENT_COMPAT, 'UTF-8') . "</email>\n";
 111              }
 112  
 113              $feed .= "    </author>\n";
 114          }
 115  
 116          $versionHtmlEscaped = '';
 117  
 118          if ($app->get('MetaVersion', 0)) {
 119              $minorVersion       = Version::MAJOR_VERSION . '.' . Version::MINOR_VERSION;
 120              $versionHtmlEscaped = ' version="' . htmlspecialchars($minorVersion, ENT_COMPAT, 'UTF-8') . '"';
 121          }
 122  
 123          $feed .= "    <generator uri=\"https://www.joomla.org\"" . $versionHtmlEscaped . ">" . $data->getGenerator() . "</generator>\n";
 124          $feed .= "    <link rel=\"self\" type=\"application/atom+xml\" href=\"" . str_replace(' ', '%20', $url . $syndicationURL) . "\"/>\n";
 125  
 126          for ($i = 0, $count = \count($data->items); $i < $count; $i++) {
 127              $itemlink = $data->items[$i]->link;
 128  
 129              if (preg_match('/[\x80-\xFF]/', $itemlink)) {
 130                  $itemlink = implode('/', array_map('rawurlencode', explode('/', $itemlink)));
 131              }
 132  
 133              $feed .= "    <entry>\n";
 134              $feed .= "        <title>" . htmlspecialchars(strip_tags($data->items[$i]->title), ENT_COMPAT, 'UTF-8') . "</title>\n";
 135              $feed .= "        <link rel=\"alternate\" type=\"text/html\" href=\"" . $url . $itemlink . "\"/>\n";
 136  
 137              if ($data->items[$i]->date == '') {
 138                  $data->items[$i]->date = $now->toUnix();
 139              }
 140  
 141              $itemDate = Factory::getDate($data->items[$i]->date);
 142              $itemDate->setTimezone($tz);
 143              $feed .= "        <published>" . htmlspecialchars($itemDate->toISO8601(true), ENT_COMPAT, 'UTF-8') . "</published>\n";
 144              $feed .= "        <updated>" . htmlspecialchars($itemDate->toISO8601(true), ENT_COMPAT, 'UTF-8') . "</updated>\n";
 145  
 146              if (empty($data->items[$i]->guid)) {
 147                  $itemGuid = str_replace(' ', '%20', $url . $itemlink);
 148              } else {
 149                  $itemGuid = htmlspecialchars($data->items[$i]->guid, ENT_COMPAT, 'UTF-8');
 150              }
 151  
 152              $feed .= "        <id>" . $itemGuid . "</id>\n";
 153  
 154              if ($data->items[$i]->author != '') {
 155                  $feed .= "        <author>\n";
 156                  $feed .= "            <name>" . htmlspecialchars($data->items[$i]->author, ENT_COMPAT, 'UTF-8') . "</name>\n";
 157  
 158                  if (!empty($data->items[$i]->authorEmail)) {
 159                      $feed .= "            <email>" . htmlspecialchars($data->items[$i]->authorEmail, ENT_COMPAT, 'UTF-8') . "</email>\n";
 160                  }
 161  
 162                  $feed .= "        </author>\n";
 163              }
 164  
 165              if (!empty($data->items[$i]->description)) {
 166                  $feed .= "        <summary type=\"html\">" . htmlspecialchars($this->_relToAbs($data->items[$i]->description), ENT_COMPAT, 'UTF-8') . "</summary>\n";
 167                  $feed .= "        <content type=\"html\">" . htmlspecialchars($this->_relToAbs($data->items[$i]->description), ENT_COMPAT, 'UTF-8') . "</content>\n";
 168              }
 169  
 170              if (!empty($data->items[$i]->category)) {
 171                  if (\is_array($data->items[$i]->category)) {
 172                      foreach ($data->items[$i]->category as $cat) {
 173                          $feed .= "        <category term=\"" . htmlspecialchars($cat, ENT_COMPAT, 'UTF-8') . "\" />\n";
 174                      }
 175                  } else {
 176                      $feed .= "        <category term=\"" . htmlspecialchars($data->items[$i]->category, ENT_COMPAT, 'UTF-8') . "\" />\n";
 177                  }
 178              }
 179  
 180              if ($data->items[$i]->enclosure != null) {
 181                  $feed .= "        <link rel=\"enclosure\" href=\"" . $data->items[$i]->enclosure->url . "\" type=\""
 182                      . $data->items[$i]->enclosure->type . "\"  length=\"" . $data->items[$i]->enclosure->length . "\"/>\n";
 183              }
 184  
 185              $feed .= "    </entry>\n";
 186          }
 187  
 188          $feed .= "</feed>\n";
 189  
 190          return $feed;
 191      }
 192  }


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