Страница модуля: https://github.com/nextcloud/news/
В данном модуле отсутствует поддержка относительных ссылок, что довольно печально, и никто не собирается это исправлять: https://github.com/nextcloud/news/issues/1952
Для исправления ситуации есть два пути:
Первый путь, не совсем правильный! Будем "на лету" исправлять ссылку, т.к. в БД она вообще будет отсутствовать!
Правим файл \apps\news\lib\Db\Item.php, находим функцию:
и заменяем на:
Второй путь, более правильный. Будем сразу в БД заносить правильный URL
Все изменения проводим в файле \apps\news\lib\Fetcher\FeedFetcher.php
1. Найти в функции protected function buildItem( строки:
и заменить на:
2. Найти в функции protected function buildItem( строку:
и заменить на:
3. Найти в функции public function fetch(
и заменить на:
4. Найти в функции protected function buildItem((
и заменить на:
ВСЕ!!!
Функция 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);
В какой момент работает эта ф-ция - не понятно.
В данном модуле отсутствует поддержка относительных ссылок, что довольно печально, и никто не собирается это исправлять: 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);
В какой момент работает эта ф-ция - не понятно.