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

3

我正在尝试在我的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>');
}

我将该操作注册为不可缓存(不确定是否需要)。

3个回答

6
在 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 Setup中的pageTitleProviders中,主要思想是类之间互相覆盖,可以设置顺序(优先级)。像这样:

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

解释:首先,检查普通页面标题和所有常规设置。

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

将所有页面标题设置为“页面标题 | 网站标题”。

“网站标题”将从“站点 -> 网站标题”中获取。然后,在优先级方面,我们的下一个提供程序将覆盖正常的页面标题。例如,“Ext标题 | 网站标题”。

最后,在我们的设置中,seo_title会进行覆盖。

现在,我们的标题设置已经准备好在ExtBase控制器中使用。我们只需要在showAction中添加即可。

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

6

如果您使用的是 TYPO3 >= 9 LTS,请遵循以下步骤:

https://dev59.com/UZ_ha4cB1Zd3GeqP2KU0#63745294

对于 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中有特殊的页面标题配置,或者其他扩展程序覆盖了该标题。

太好了。运行得很顺利。非常感谢! - Philipp M
无法使其正常工作。调用 setTitle() 后,我可以使用 getTitle() 检查标题是否已设置。然而,实际的标题标签仍然包含页面标题。我创建了一个空的 TypoScript,其中只包含最基本的设置,page.10 =< styles.content.get。在页面上 colPos=0 中没有其他扩展。我做错了什么? - j4k3
1
糟糕,是我的错。原来安装在我这里的扩展程序“metaseo”覆盖了页面标题。 - j4k3

5

尝试使用TS(示例来自Georg Ringer的出色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]

您只需要根据您的扩展做出一些相应的更改即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接