0

在 TYPO3 中使用新的链接处理程序时,如下面的链接:

https://usetypo3.com/linkhandler.html

我只有一个详细信息页面的参数:

config.recordLinks.tx_news {
    typolink {
        parameter = {$myConstants.newsDetailPid}
}
}

我如何更改链接处理程序(挂钩等)以便从新闻类别(sys 类别)中获取详细信息页面?

4

3 回答 3

1

使用以下代码:

config.recordLinks.tx_news {
    typolink {
        parameter.stdWrap.cObject = CONTENT 
        parameter.stdWrap.cObject { 
            table = sys_category 
            select { 
                pidInList = 100
                # pid of category records 
                max = 1
                selectFields = sys_category.single_pid AS detailPid 
                join = sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid 
                where = sys_category_record_mm.uid_foreign = { field: uid } 
                where.insertData = 1 
                andWhere.stdWrap.intVal = 1 
                andWhere.stdWrap.stripHtml = 1 
            }     
            renderObj = TEXT 
            renderObj.field = detailPid 
            renderObj.wrap = | 
        }   
        additionalParams.data = field:uid
        additionalParams.wrap = &tx_news_pi1[news]=|
        useCacheHash = 1
    }   
}   

https://www.clickstorm.de/blog/linkhandler-typo3/

于 2018-03-06T15:30:17.120 回答
0

您可以在此处找到链接处理程序集成的文档: https ://docs.typo3.org/typo3cms/extensions/core/8.7/Changelog/8.6/Feature-79626-IntegrateRecordLinkHandler.html

在那里你可以看到你可以为处理指定一个自己的类。据我所知,没有提供任何挂钩。

于 2017-10-12T06:12:52.320 回答
0

这可以在下一个即将发布的 ext:news 版本中实现,有关详细信息,请参阅此更改

通过使用以下 TypoScript

config.recordLinks.tx_news {
    typolink {
        # Detail page
        parameter.cObject = USER
        parameter.cObject {
            userFunc = GeorgRinger\News\Service\LinkHandlerTargetPageService->process
            news.data = field:uid
            # Page used if no detail page is set in the category
            fallback = 123
        }
        additionalParams.data = field:uid
        additionalParams.wrap = &tx_news_pi1[controller]=News&tx_news_pi1[action]=detail&tx_news_pi1[news]=|
    }
}

和相应的用户函数

<?php

declare(strict_types=1);

namespace GeorgRinger\News\Service;

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;

/**
 * This file is part of the "news" Extension for TYPO3 CMS.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 */
class LinkHandlerTargetPageService
{

    /** @var ContentObjectRenderer */
    public $cObj;

    public function process(string $content = '', array $configuration = []): int
    {
        $fallbackPageId = (int)($configuration['fallback'] ?? 0);

        $newsId = (int)$this->cObj->stdWrapValue('news', $configuration, null);
        if ($newsId === 0) {
            return $fallbackPageId;
        }

        $singlePid = $this->getSinglePidFromCategory($newsId);
        return $singlePid ?: $fallbackPageId;
    }

    /**
     * Obtains a pid for the single view from the category.
     *
     * @param int $newsId
     * @return int
     */
    protected function getSinglePidFromCategory(int $newsId): int
    {
        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
            ->getQueryBuilderForTable('sys_category');
        $categoryRecord = $queryBuilder
            ->select('title', 'single_pid')
            ->from('sys_category')
            ->leftJoin(
                'sys_category',
                'sys_category_record_mm',
                'sys_category_record_mm',
                $queryBuilder->expr()->eq('sys_category_record_mm.uid_local', $queryBuilder->quoteIdentifier('sys_category.uid'))
            )
            ->where(
                $queryBuilder->expr()->eq('sys_category_record_mm.tablenames', $queryBuilder->createNamedParameter('tx_news_domain_model_news', \PDO::PARAM_STR)),
                $queryBuilder->expr()->gt('sys_category.single_pid', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)),
                $queryBuilder->expr()->eq('sys_category_record_mm.uid_foreign', $queryBuilder->createNamedParameter($newsId, \PDO::PARAM_INT))
            )
            ->orderBy('sys_category_record_mm.sorting')
            ->setMaxResults(1)
            ->execute()->fetch();
        return (int)$categoryRecord['single_pid'];
    }

}

当然,您可以将 PHP 类复制到您的站点包并采用 TS 中的命名空间,以使其在您的安装中工作

于 2022-02-18T09:54:00.443 回答