Внутренняя ссылка Новости: excludeAlreadyDisplayedNews - PullRequest
0 голосов
/ 02 ноября 2018

Я использую внутреннюю ссылку на новости, это означает, что я использую стандартные страницы в качестве страниц новостей. На этих страницах у меня есть слайдер новостей для отображения других новостей. Здесь мне нужна опция: excludeAlreadyDisplayedNews, чтобы удалить текущую страницу из новостей.

Но как добавить <n:excludeDisplayedNews newsItem="{newsItem}"/> на стандартные страницы? Есть ли опечатка для загрузки соответствующего элемента новостей для этой страницы? Может быть, обработчик данных справится, но я не знаю как?

Другая идея заключалась в добавлении дополнительного поля на страницы, поэтому пользователь добавляет новостную запись на страницу. Это на один клик больше, хорошо, но при передаче UID новостей в viewhelper я получаю это сообщение об ошибке:

The argument "newsItem" was registered with type "GeorgRinger\News\Domain\Model\News", but is of type "integer" in view helper "GeorgRinger\News\ViewHelpers\ExcludeDisplayedNewsViewHelper".

Любая помощь приветствуется :)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Это полное решение:

  1. написать DataProcessor для получения соответствующей записи новостей
  2. добавить NewsDataProcessor
  3. добавить n: excludeDisplayedNews в шаблон Fluid

Шаг 1: в свой Typoscript страницы добавьте DataProcessor, чтобы получить соответствующую новостную запись. Добавьте это в блок dataProcession вашей страницы. FLUIDTEMPLATE Typoscript:

10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
    table = tx_news_domain_model_news
    #pid for news folder
    pidInList = 123
    where.data = page : uid
    where.wrap = internalurl=|
    as = displayedNews
    dataProcessing {
        10 = MyCompany\MyExtension\DataProcessor\NewsDataProcessor
        10 {
            field = uid
        }
    }
}

Внимание: internalUrl - строка. Для меня это работает так, но может потребоваться синтаксический синтаксис. Любые улучшения запросов приветствуются!

Шаг 2. Добавление обработчика NewsData в MyExtension / Classes / DataProcessor / NewsDataProcessor.php

<?php
namespace MyCompany\MyExtension\DataProcessor;

use GeorgRinger\News\Domain\Repository\NewsRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface;

class NewsDataProcessor implements DataProcessorInterface
{
    /**
     * @param \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $cObj
     * @param array $contentObjectConfiguration
     * @param array $processorConfiguration
     * @param array $processedData
     * @return array
     */
    public function process(
        ContentObjectRenderer $cObj,
        array $contentObjectConfiguration,
        array $processorConfiguration,
        array $processedData
    ) {

        /** @var \TYPO3\CMS\Extbase\Object\ObjectManager $objectManager */
        $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
        /** @var \GeorgRinger\News\Domain\Repository\NewsRepository $newsRepository */
        $newsRepository = $objectManager->get(NewsRepository::class);

        $field = 'uid';
        if (array_key_exists('field',$processorConfiguration)) {
            $field = $processorConfiguration['field'];
        }

        $newsArray = $processedData['data'];
        $news = $newsRepository->findByUid((int)$newsArray[$field], false);

        $processedData['news'] = $news;
        return $processedData;
    }
}

В более поздних версиях EXT: news (в настоящее время 7.0.7) может быть доступен DataProcessor, тогда вы можете пропустить этот шаг и использовать существующий

Шаг 3. Добавьте средство просмотра n: excludeDisplayedNews в шаблон Fluid на своей странице. Не забудьте добавить пространство имен Viewhelper в шаблон.

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
  xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
  data-namespace-typo3-fluid="true">

<f:layout name="MyLayout"/>

<f:section name="main">
    <f:for each="{displayedNews}" as="newsItem">
        <n:excludeDisplayedNews newsItem="{newsItem.news}" />
    </f:for>
    <div class="main-content">
        ...
    </div>
</f:section>

</html>
0 голосов
/ 03 ноября 2018

Я не думаю, что есть простой, чистый способ сделать это. Страница не является реальными новостями, поэтому технически она не отображается. Я могу придумать 3 возможных решения:


На самом деле технически отображать запись новостей на странице с пустым шаблоном (за исключением n:excludeDisplayedNews ViewHelper), поэтому он ничего не показывает. Я не уверен, будет ли это работать с новостями "внутренней ссылки", но если это так, то это самый простой способ.

Вы можете сделать это, используя следующий TypoScript:

lib.displayedNews = USER
lib.displayedNews {
  userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
  extensionName = News
  pluginName = Pi1
  vendorName = GeorgRinger
  switchableControllerActions {
    News {
      1 = detail
    }
  }

  views =< plugin.tx_news.view
  view {
    templateRootPaths.200 = path/to/template/with/only/excludeDisplayedNews/
  }
  settings =< plugin.tx_news.settings
  settings {
    singleNews.current = 1
    useStdWrap = singleNews
    insertRecord = 1
  }
}

В шаблоне вашей страницы вы можете использовать:

<f:for each="{displayedNews}" as="newsItem">
    <f:cObject typoscriptObjectPath="lib.displayedNews" data="{newsItem.data.uid}" />
</f:for>

И ваш News/Detail.html шаблон будет просто:

<n:excludeDisplayedNews newsItem="{newsItem.uid}" />

Получите объект записи новостей с помощью пользовательского ViewHelper или DataProcessor, чтобы вы могли заполнить его в n:excludeDisplayedNews ViewHelper. На мой взгляд, это самое чистое решение, но также требует наибольшей работы.


Создайте пользовательскую функцию для заполнения глобального массива, который расширение новостей использует для отслеживания отображаемых записей новостей, например: $GLOBALS['EXT']['news']['alreadyDisplayed'][$newsUid] = $newsUid;

...