Zum Inhalt springen

Linkhandler + tt_news: Single PID pro Kategorie setzen

Erstellt am 10. August 2009 · 14 Antworten · letzte Antwort am 27. April 2015

Tags: Frage

einpraegsam.​net ·

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

just2b ·

das geht doch schon seit ewigkeiten per default. pro news kategorie kann man die single seite angeben, oder versteh ich da was falsch?

georg

einpraegsam.​net ·
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...

kimpixel ·

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

einpraegsam.​net ·
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 🙂

tobiasschaefer ·

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

j-spot ·

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
	}
}
tobiasschaefer ·

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?

tobiasschaefer ·

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.

ammannd ·
just2b schrieb

ts muss mans halt noch aktivieren, aber das feature gibts

danke, das mit dem Aktivieren war bei mir soeben der springende punkt! 😉

Unbekannter Benutzer ·
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.

anderlk ·

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