TYPO3 Extbase - 在单个视图中更改浏览器页面标题

TYPO3 Extbase - Change browser page title in single view

我试图在我的 extbase 扩展的单个视图中更改浏览器页面标题。我所有的尝试都失败了:

/**
 * action show
 *
 * @param \Vendor\Abc\Domain\Model\Abc $record
 * @return void
 */
public function showAction(\Vendor\Abc\Domain\Model\Abc $record) {
    $this->view->assign('record', $record);

    //$GLOBALS['TSFE']->page['title'] = $record->getAbc();
    //$GLOBALS['TSFE']->indexedDocTitle = $record->getAbc();        

    //$GLOBALS['TSFE']->page['title'] = $record;
    //$GLOBALS['TSFE']->indexedDocTitle = $record;  

    //$GLOBALS['TSFE']->additionalHeaderData['CustomUserIntTitle']
    //= '<title>' . $this->getAbc($record) . '</title>';

    //$myNewTitle = 'Title';
    //$title = '<title>' . $myNewTitle . '</title>';
    //$this->response->addAdditionalHeaderData($title);

    //$GLOBALS['TSFE']->content = preg_replace('#<title>.*<\/title>#', '<title>' . $record->getTitle() . '</title>', $GLOBALS['TSFE']->content);

    //$this->response->addAdditionalHeaderData('<title>Mein eigener Title</title>');
}

我将此操作注册为 non-cacheable(但不确定我是否真的必须这样做)

尝试使用 TS(样本来自 Georg Ringers 优秀 ext:news):

[globalVar = TSFE:id = NEWS-DETAIL-PAGE-ID]
config.noPageTitle = 2

temp.newsTitle = RECORDS
temp.newsTitle {
  dontCheckPid = 1
    tables = tx_news_domain_model_news
    source.data = GP:tx_news_pi1|news
    source.intval = 1
    conf.tx_news_domain_model_news = TEXT
    conf.tx_news_domain_model_news {
        field = title
        htmlSpecialChars = 1
    }
    wrap = <title>|</title>
}
page.headerData.1 >
page.headerData.1 < temp.newsTitle

[global]

您只需要相应地对您的扩展程序进行一些更改

如果 TYPO3 >= 9 LTS 遵循:

https://whosebug.com/a/63745294/4533462

对于 TYPO3 <= 8 LTS 你可以这样做

Jan 的解决方案是根据 GET 参数或页面 ID 更改的常规方法。

当您尝试更改控制器内的标题时,取决于页面标题在 Typoscript 中的设置方式。但是,可以使用 PageRenderer 更改控制器内的标题:

$this->objectManager->get(\TYPO3\CMS\Core\Page\PageRenderer::class)->setTitle('My title');
// For the search
$GLOBALS['TSFE']->indexedDocTitle = 'My title';

如果它不能与 PageRenderer 一起使用,您必须在 Typoscript 或其他扩展中为您的页面标题进行特殊配置以覆盖标题。

在TYPO3 9-10新逻辑。最后一个答案对我不起作用所以我用了这个 https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PageTitleApi/Index.html

首先。创建您自己的标题提供程序。路径 'ext/Classes/PageTitle/MyRecordTitleProvider.php'

<?php
namespace Vendor\Ext\PageTitle;

use TYPO3\CMS\Core\PageTitle\AbstractPageTitleProvider;

class MyRecordTitleProvider extends AbstractPageTitleProvider
{
    /**
     * @param string $title
     */
    public function setTitle(string $title)
    {
        $this->title = $title;
    }
}

其次。在您的 TypoScript 设置页面 TitleProviders 中。主要思想是 类 相互覆盖,您可以设置顺序(优先级)。那样

config.pageTitleProviders.myext {
      provider = Vendor\Ext\PageTitle\MyRecordTitleProvider
      before = altPageTitle,record,seo
   }
}

解释。首先,检查正常页面标题和所有正常设置,如

config{
    pageTitleFirst = 1
    pageTitleSeparator = |
    pageTitleSeparator.noTrimWrap = | | |
}

将使所有页面标题都像“页面标题 | 网站标题”

'Website title' 将取自站点 -> websiteTitle 然后优先考虑我们的下一个 Provider,将覆盖正常的页面标题。喜欢“分机标题 | 网站标题”

最后在我们的设置中 seo_title 覆盖。

现在一切就绪,可以在 ExtBase 控制器中设置我们的标题。我们只需要添加 showAction

    $GLOBALS['TSFE']->indexedDocTitle = $title;
    $titleProvider = GeneralUtility::makeInstance(MyRecordTitleProvider::class);
    $titleProvider->setTitle($title);