В CMS Joomla помимо установочных модулей, плагинов, компонентов, можно так же расширять ядро системы совершенно не принося никакого ему вреда. В этой статье я опишу механизм установки и использования библиотек, на примере RSS - ленты Яндекс новостей, где разработчики используют не совсем стандартный подход, а вносят текст в специальные теги, типа: <yandex:full-text>, для возможности использования с помощью пространства имен (namespace).

Начнем с того, что создадим установочный xml-файл как и при любом расширении, но как и полагается, с отличиями характерными именно конкретному типу расширения.

Установочный xml - файл библиотеки:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <extension type="library" method="upgrade" version="3.1">
  3.       <name>Rss Parse Yandex</name>
  4.       <libraryname>src</libraryname>
  5.       <author>Korotkov Vadim</author>
  6.       <authorEmail>Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.</authorEmail>
  7.       <authorUrl>http://siterybinsk.ru</authorUrl>
  8.       <creationDate>23.01.2018</creationDate>
  9.       <copyright>Copyright (C) 2018 http://siterybinsk.ru. All rights reserved.</copyright>
  10.       <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
  11.       <version>1.0</version>
  12.       <description>Library Rss Parser Yandex</description>
  13.       <files folder="libraries">
  14.             <file>Feed/Parser/RssParserYandex.php</file>
  15.       </files>
  16. </extension>
ВНИМАНИЕ!
Сразу обратите внимание на файлы указанные в тегах <files>. Надо быть очень внимательным указывая данные каталоги/файлы. Так как указав к примеру: <files><folder>Feed</folder></files>, при удалении библиотеки вы рискуете удалить системные файлы ядра, в папке Feed!

Далее по установочному файлу:

  1. Указывает тип: type="library"
  2. libraryname - в нашем случае это src, совпадает с системным название, у нас это служит наименование каталога в папке libraries

Так как у нас единственный файл в библиотеке (расширяет возможность вывода RSS - ленты из тегов yandex), то рассмотрим его исходный код с пояснениями:

  1. <?php
  2. /**
  3.  * @package Joomla.Site
  4.  * @subpackage mod_srrss
  5.  *
  6.  * @copyright Copyright (C) 2014 - 2018 Siterybinsk.ru, All rights reserved.
  7.  * @license GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9. namespace Joomla\CMS\Feed\Parser;
  10. defined('JPATH_PLATFORM') or die;
  11. use Joomla\CMS\Feed\Feed;
  12. use Joomla\CMS\Feed\FeedEntry;
  13. use Joomla\CMS\Feed\FeedLink;
  14. use Joomla\CMS\Feed\FeedParser;
  15. use Joomla\CMS\Feed\FeedPerson;
  16. /**
  17.  * Feed factory class.
  18.  *
  19.  * @since 12.3
  20.  */
  21. class RssParserYandex implements NamespaceParserInterface
  22. {
  23.       /**
  24.       * Method to handle an element for the feed given that the media namespace is present.
  25.       *
  26.       * @param Feed $feed The Feed object being built from the parsed feed.
  27.       * @param \SimpleXMLElement $el The current XML element object to handle.
  28.       *
  29.       * @return void
  30.       *
  31.       * @since 12.3
  32.       */
  33.        public function processElementForFeed(Feed $feed, \SimpleXMLElement $el)
  34.       {
  35.             return;
  36.       }
  37.       /**
  38.       * Method to handle the feed entry element for the feed given that the media namespace is present.
  39.       *
  40.       * @param FeedEntry $entry The FeedEntry object being built from the parsed feed entry.
  41.       * @param \SimpleXMLElement $el The current XML element object to handle.
  42.       *
  43.       * @return void
  44.       *
  45.       * @since 12.3
  46.       */
  47.       public function processElementForFeedEntry(FeedEntry $entry, \SimpleXMLElement $el)
  48.       {
  49.             $namespaces = $el->getNameSpaces(true);
  50.             $yandex = $el->children( $namespaces['yandex'] );
  51.             $fullText = (string) $yandex->{'full-text'};
  52.             $entry->yandexFullText = $fullText;
  53.             return;
  54.       }
  55. }

Далее опишу поверхностно и простым языком, откуда берется класс RssParserYandex и, что его заставляет работать, и как в целом происходит парсинг. 

Обратимся к исходному ядру, а именно к файлу: libraries\src\Feed\FeedParser.php.

В методе parse() на строке 65, происходит поиск пространства имен.

На 151 строке в этом же файле, в методе processElement(): выполняется в цикле перебор по пространству имён и вызывается метод класса в наследуемом интерфейсе, если таков существует (т.е. эти методы и есть в нашей библиотеке).

Для примера вывода новостей был использован фактически стандартный модуль rss - ленты, с небольшой доработкой вывода текста статьи получаемой из яндекс тегов.

Можете скачать рабочий пример из модуля(выводит новости) и бибилотеки(для парсинга rss - ленты):

zip
Пример использование библиотеки в Joomla (размер: 8.17 kb, скачиваний: 5)
Тестировался на версии Joomla 3.8
Просто поддержать нас
Создание сайтов

Читайте также:

Полезное из Web