• Модуль "News" для NextCloud

 #10673   IgorA100
 12 фев 2023, 16:12
Страница модуля: https://github.com/nextcloud/news/
В данном модуле отсутствует поддержка относительных ссылок, что довольно печально, и никто не собирается это исправлять: https://github.com/nextcloud/news/issues/1952
Для исправления ситуации есть два пути:

Первый путь, не совсем правильный! Будем "на лету" исправлять ссылку, т.к. в БД она вообще будет отсутствовать!
Правим файл \apps\news\lib\Db\Item.php, находим функцию:
Код: Выделить всё    public function getUrl(): ?string
    {
        return $this->url;
    }

и заменяем на:
Код: Выделить всё    public function getUrl(): ?string
    {
      if (is_null($this->url)){
         $_url = 'ТУТ ПИШЕМ что-то типа http://www.zakupki.gov.ru' . $this->guid;
      } else {
         $_url = $this->url;
      }
        return $_url;
    }


Второй путь, более правильный. Будем сразу в БД заносить правильный URL
Все изменения проводим в файле \apps\news\lib\Fetcher\FeedFetcher.php
1. Найти в функции protected function buildItem( строки:
Код: Выделить всё    protected function buildItem(
        ItemInterface $parsedItem,
        ?string $body = null,
        bool $RTL = false,
        $feedAuthor = null
    ): Item {

и заменить на:
Код: Выделить всё    protected function buildItem(
        ItemInterface $parsedItem,
        ?string $body = null,
        bool $RTL = false,
        $feedAuthor = null,
        $location = null
    ): Item {


2. Найти в функции protected function buildItem( строку:
Код: Выделить всё        $item->setUrl($itemLink);

и заменить на:
Код: Выделить всё      if ((strpos($location, 'http') === 0 || strpos($location, 'magnet') === 0)){
         $UrlLocation = parse_url($location);
         $item->setUrl($UrlLocation['scheme']."://".$UrlLocation['host'].$itemLink);
      } else {
         $item->setUrl($itemLink);
      }


3. Найти в функции public function fetch(
Код: Выделить всё$builtItem = $this->buildItem($item, $body, $currRTL, $feedAuthor);

и заменить на:
Код: Выделить всё$builtItem = $this->buildItem($item, $body, $currRTL, $feedAuthor, $location);


4. Найти в функции protected function buildItem((
Код: Выделить всё$item->setBody($body);

и заменить на:
Код: Выделить всё$item->setBody(preg_replace('!(<a\s*[^>]*)(href=)(.)(\/[^\/])([^"\']+)("|\')!','\1 href=\3'.$UrlLocation['scheme']."://".$UrlLocation['host'].'\4\5\6', $body ));

ВСЕ!!!


Функция public function setUrl(string $url = null): self
В файле \apps\news\lib\Service\ImportService.php есть функция public function importArticles(string $userId, array $json): ?\OCP\AppFramework\Db\Entity в которой перебираются фиды и происходит заполнение массива данными $item = Item::fromImport($entry);
В какой момент работает эта ф-ция - не понятно.