Problem:
Über die Extension linkhandler können auch Redakteure ganz einfach interne Links auf tt_news Detailansichten setzen - und natürlich auch auf andere Detailansichten (tt_address, wt_directory, etc...).
Jedoch kann es sein, dass verschiedene News auf verschiedenen Seiten angezeigt werden sollen - eben je nach News Kategorie.
Idee:
Linkhandler macht es einem wirklich nicht schwer über Typoscript dementsprechend einzugreifen und den Ablauf zu ändern: Also muss eine kleine userFunc her. Interessant ist auch, dass die tt_news Kategorien bereits ein Feld "Single PID" (Single-Anzeige (Newsdetails) für Nachrichten dieser Kategorie) beinhalten (war mir bis vor kurzem unbekannt) - das kann gleich hierfür benutzt werden.
Umsetzung:
Beispiel TS:
includeLibs.linkhandler_helper = fileadmin/user_linkhandler_helper.php
# TS for linkhandler
plugin.tx_linkhandler {
tt_news {
forceLink = 1
#parameter = 15
parameter.stdWrap.cObject = USER
parameter.stdWrap.cObject {
userFunc = user_linkhandler_helper->main
userFunc {
# tt_news uid
uid = TEXT
uid.field = uid
# Default pid if no pid given
pid = TEXT
pid.value = 13
}
}
additionalParams = &tx_ttnews[tt_news]={field:uid}
additionalParams.insertData = 1
useCacheHash = 1
}
}
Dann noch eine kleine userFunc direkt mit Namen "user_linkhandler_helper.php" in fileadmin ablegen:
<?php
// This class could manipulate the target pid of the linkhandler
class user_linkhandler_helper {
// Main function linkhandler pid change
function main($content = '', $conf = array()) {
$this->conf = $conf['userFunc.']; // ts configuration
$uid = $this->cObj->cObjGetSingle($this->conf['uid'], $this->conf['uid.']); // get tt_news uid
$pid = $this->cObj->cObjGetSingle($this->conf['pid'], $this->conf['pid.']); // get default pid
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'tt_news_cat.single_pid',
'tt_news LEFT JOIN tt_news_cat_mm ON (tt_news.uid = tt_news_cat_mm.uid_local) LEFT JOIN tt_news_cat ON (tt_news_cat_mm.uid_foreign = tt_news_cat.uid)',
'tt_news.uid = ' . intval($uid),
'',
'tt_news_cat_mm.sorting',
1
);
if ($res) $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
if (is_array($row) && intval($row['single_pid']) > 0) { // if there is a category to the current news and if there is the single_pid field filled
return intval($row['single_pid']); // give single pid from category back
} else { // no cat given or no single pid given
return intval($pid); // give default pid back
}
}
}
?>
Danach kann man die Single PID einfach über die Newskategorie setzen:
Bild: design-and-style.de/…/tt_news_cat_single_pid.jpg
Abschließend:
Über TS kann man eine alternative PID eintragen, falls eine Kategorie keinen Single PID Eintrag beinhaltet.
Cheers, Alex
das geht doch schon seit ewigkeiten per default. pro news kategorie kann man die single seite angeben, oder versteh ich da was falsch?
georg
just2b schrieb
das geht doch schon seit ewigkeiten per default. pro news kategorie kann man die single seite angeben, oder versteh ich da was falsch?
Na ich kann mich natürlich auch geirrt haben, jedoch ging das bei mir nicht per Default...
ts muss mans halt noch aktivieren, aber das feature gibts
Blamage hin oder her - ich lass den Post mal stehen, falls es anderen Leuten ähnlich geht 😃
ob das bei der News Extension geht weis ich nicht aber ich habe mich sehr über den post gefreut da das ich das für meine eigene Extension dringend gebraucht habe.
Danke
kimpixel schrieb
ob das bei der News Extension geht weis ich nicht aber ich habe mich sehr über den post gefreut da das ich das für meine eigene Extension dringend gebraucht habe.
Danke
Na dann war es doch nicht ganz umsonst 🙂
Hallo Alex,
die Userfunction von Dir funktioniert bei mir schon mal ganz gut, allerdings habe ich bei manchen News das Problem, dass der Redakteur vergisst eine Kategorie auszuwählen, da die News auch ohne eine Kategorie angezeigt wird.
Im TSConfig des Sysfolders in dem sich die News befindet, ist per tx_ttnews.singlePid die PID der Einzelseite gesetzt.
Wie könnte man diese PID in der Userfunction auslesen und zurückgeben, wenn keine Kategorie ausgewählt wurde?
Vielen Dank schon mal im Voraus.
Tobias
Schon ein Weilchen her, aber ich habs wie folgt gelöst:
plugin.tx_linkhandler {
tt_news {
forceLink = 1
parameter.stdWrap.cObject = CONTENT
parameter.stdWrap.cObject {
table = tt_news_cat
select {
fields = tt_news_cat.single_pid
join = tt_news_cat_mm ON tt_news_cat_mm.uid_foreign = tt_news_cat.uid INNER JOIN tt_news ON tt_news.uid = tt_news_cat_mm.uid_local
where = 1
andWhere = tt_news.uid = '{field:uid}'
andWhere.insertData = 1
# PID der Kategorien (bzw. des Seitenbaum)
pidInList = 1
# ggf. notwendig, wenn Kategorien über den Seitenbaum verteilt sind
#recursive = 5
max = 1
orderBy = tt_news_cat_mm.sorting
}
renderObj = COA
renderObj {
10 = TEXT
10.field = single_pid
}
}
additionalParams = &tx_ttnews[tt_news]={field:uid}
additionalParams.insertData = 1
useCacheHash = 1
}
}
Ich habe das TS von j-spot getestet, woraufhin die Links im Frontend nicht mehr angezeigt wurden.
@j-spot: Welche TYPO3 und tt_news-Version setzt Du ein?
Dann könnte es an beiden liegen, da im Moment noch T3 4.2.17 und tt_news 2.5.2 im Einsatz ist. Ein Update auf 4.4 bzw. 3 ist aber schon länger geplant.
just2b schrieb
ts muss mans halt noch aktivieren, aber das feature gibts
danke, das mit dem Aktivieren war bei mir soeben der springende punkt! 😉
einpraegsam.net schrieb
Problem:
Über die Extension linkhandler können auch Redakteure ganz einfach interne Links auf tt_news Detailansichten setzen - und natürlich auch auf andere Detailansichten (tt_address, wt_directory, etc...).
Jedoch kann es sein, dass verschiedene News auf verschiedenen Seiten angezeigt werden sollen - eben je nach News Kategorie.
Idee:
Linkhandler macht es einem wirklich nicht schwer über Typoscript dementsprechend einzugreifen und den Ablauf zu ändern: Also muss eine kleine userFunc her. Interessant ist auch, dass die tt_news Kategorien bereits ein Feld "Single PID" (Single-Anzeige (Newsdetails) für Nachrichten dieser Kategorie) beinhalten (war mir bis vor kurzem unbekannt) - das kann gleich hierfür benutzt werden.
Umsetzung:
Beispiel TS:
includeLibs.linkhandler_helper = fileadmin/user_linkhandler_helper.php
# TS for linkhandler
plugin.tx_linkhandler {
tt_news {
forceLink = 1
#parameter = 15
parameter.stdWrap.cObject = USER
parameter.stdWrap.cObject {
userFunc = user_linkhandler_helper->main
userFunc {
# tt_news uid
uid = TEXT
uid.field = uid
# Default pid if no pid given
pid = TEXT
pid.value = 13
}
}
additionalParams = &tx_ttnews[tt_news]={field:uid}
additionalParams.insertData = 1
useCacheHash = 1
}
}
Dann noch eine kleine userFunc direkt mit Namen "user_linkhandler_helper.php" in fileadmin ablegen:
<?php
// This class could manipulate the target pid of the linkhandler
class user_linkhandler_helper {
// Main function linkhandler pid change
function main($content = '', $conf = array()) {
$this->conf = $conf['userFunc.']; // ts configuration
$uid = $this->cObj->cObjGetSingle($this->conf['uid'], $this->conf['uid.']); // get tt_news uid
$pid = $this->cObj->cObjGetSingle($this->conf['pid'], $this->conf['pid.']); // get default pid
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'tt_news_cat.single_pid',
'tt_news LEFT JOIN tt_news_cat_mm ON (tt_news.uid = tt_news_cat_mm.uid_local) LEFT JOIN tt_news_cat ON (tt_news_cat_mm.uid_foreign = tt_news_cat.uid)',
'tt_news.uid = ' . intval($uid),
'',
'tt_news_cat_mm.sorting',
1
);
if ($res) $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
if (is_array($row) && intval($row['single_pid']) > 0) { // if there is a category to the current news and if there is the single_pid field filled
return intval($row['single_pid']); // give single pid from category back
} else { // no cat given or no single pid given
return intval($pid); // give default pid back
}
}
}
?>
Danach kann man die Single PID einfach über die Newskategorie setzen:
Bild: design-and-style.de/…/tt_news_cat_single_pid.jpg
Abschließend:
Über TS kann man eine alternative PID eintragen, falls eine Kategorie keinen Single PID Eintrag beinhaltet.
Cheers, Alex
Danke Alex,
das hat toll funktioniert.
Hallo,
hat von Euch schon jemand das Script auf Ext:News ummünzen können? Ich scheitere nämlich gerade daran. wahrscheinlich liegt an der Datenbank Abfrage.
Mein Script sieht so aus und er nimmt immer die default pid her:
<?php
// This class could manipulate the target pid of the linkhandler
class user_linkhandler_helper {
// Main function linkhandler pid change
function main($content = '', $conf = array()) {
$this->conf = $conf['userFunc.']; // ts configuration
$uid = $this->cObj->cObjGetSingle($this->conf['uid'], $this->conf['uid.']); // get news uid
$pid = $this->cObj->cObjGetSingle($this->conf['pid'], $this->conf['pid.']); // get default pid
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
'sys_category.single_pid',
'tx_news_domain_model_news LEFT JOIN sys_category_record_mm ON (tx_news_domain_model_news.uid = sys_category_record_mm.uid_local) LEFT JOIN sys_category ON (sys_category_record_mm.uid_foreign = sys_category.uid)',
'tx_news_domain_model_news.uid = ' . intval($uid),
'',
'sys_category_record_mm.sorting',
1
);
if ($res) $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
if (is_array($row) && intval($row['single_pid']) > 0) { // if there is a category to the current news and if there is the single_pid field filled
return intval($row['single_pid']); // give single pid from category back
} else { // no cat given or no single pid given
return intval($pid); // give default pid back
}
}
}
?>
Gruß Andreas