Skip to content

Instantly share code, notes, and snippets.

@georgringer
Last active November 13, 2019 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save georgringer/c0f8263aa719c7f0373723011158e455 to your computer and use it in GitHub Desktop.
Save georgringer/c0f8263aa719c7f0373723011158e455 to your computer and use it in GitHub Desktop.
Get relevant langage ids for menus, e.g. hreflang or language switch
<?php
namespace GeorgRinger\News\Hooks;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* Get language ids for news language menu
*
* Having a language menu with
* [globalVar = GP:tx_news_pi1|news > 0]
* page.headerData.25.special.value.cObject = USER
* page.headerData.25.special.value.cObject.userFunc = GeorgRinger\Bda\Hooks\HrefLangNews->run
* [global]
*
* The userfunc will return the relevant ids
*
*/
class HrefLangNews
{
public function run(): string
{
$newsUid = $this->getNewsUid();
if ($newsUid === 0) {
return '';
}
return $this->getLanguageIdsFromNews($newsUid);
}
/**
* @param int $newsUid
* @return string
*/
protected function getLanguageIdsFromNews(int $newsUid): string
{
$list = [];
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_news_domain_model_news');
$rows = $queryBuilder
->select('*')
->from('tx_news_domain_model_news')
->where(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($newsUid, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($newsUid, \PDO::PARAM_INT))
)
)
->execute()
->fetchAll();
foreach ($rows as $row) {
$list[] = $row['sys_language_uid'];
}
return implode(',', $list);
}
protected function getNewsUid(): int
{
$vars = GeneralUtility::_GET('tx_news_pi1');
if ($vars['news']) {
return (int)$vars['news'];
}
return 0;
}
}
page.headerData.25 = HMENU
page.headerData.25 {
special = language
special.value = 0,1,2
1 = TMENU
1 {
NO = 1
NO.stdWrap.cObject = TEXT
NO.stdWrap.cObject.value = en || de || fr
NO.linkWrap = <link rel="alternate" hreflang="|
NO.doNotLinkIt = 1
NO.after.cObject = TEXT
NO.after.cObject {
stdWrap.wrap = " href="|" />
stdWrap.typolink.parameter.data = page:uid
stdWrap.typolink.additionalParams = &L=0 || &L=1 || &L=2
stdWrap.typolink.addQueryString = 1
stdWrap.typolink.addQueryString.exclude = L,id,cHash,no_cache
stdWrap.typolink.addQueryString.method = GET
stdWrap.typolink.returnLast = url
stdWrap.typolink.forceAbsoluteUrl = 1
}
ACT < .NO
CUR < .NO
}
}
[globalVar = GP:tx_news_pi1|news > 0]
page.headerData.25.special.value.cObject = USER
page.headerData.25.special.value.cObject.userFunc = GeorgRinger\News\Hooks\HrefLangNews->run
[global]
@iprokhorov
Copy link

hi Georg,

the optionsplits:

NO.stdWrap.cObject.value = en || de || fr
stdWrap.typolink.additionalParams = &L=0 || &L=1 || &L=2

remain unchanged by this userfunc, this mashes up the rendered menu. What would the best solution for this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment