Zum Inhalt springen

TypoLink zu MountPoint

Erstellt am 14. April 2011 · 4 Antworten · letzte Antwort am 3. Dezember 2013

Tags: Links, Frage

scripper ·

Hallo zusammen,

bin kurz vorm verzweifeln. Ich habe ein Typo3 Menü gebaut, bei dem ich über stdwrap und typolink ein Menü Element verlinke.

Das funktioniert auch toll jedoch nicht bei Mount Points.

Hier mal mein TS Code

NO {
		doNotLinkIt =1
		stdWrap.cObject = COA
    	stdWrap.cObject {
			wrap = <div class="level3-menu-item">|</div>
			10 = TEXT
			10.typolink.parameter.field = uid
        	10.field = title

ich denke statt parameter.field = uid sollte vielleicht da etwas anderes stehen oder vielleicht kann ich das per additional parameters noch hinzufügen ...

Ich danke euch mal im vorraus falls einer eine Idee hat.

Viele Grüße

pinerski ·

Hallo snipper und auch gerne alle Anderen,

stehe hier gerade vor dem selben Problem.
Gibt es hierzu schon eine Lösung?

Kleine Anmerkung:
Wenn ich "doNotLinkIt =1" entferne, dann bekomme ich den gewünschten link, jedoch wird er um das ganze Element gesetzt.
Was zu keinen Validen Code führt

Gruß

dachande ·

Hi,

genau vor dem gleichen Problem stehe ich auch gerade. Ich habe eine sitemap.xml mit TypoScript gebaut (mittels TMENU, welches ein COA enthält um die einzelnen Abschnitte der XML Struktur abzubilden). Auf meiner Website gibt es einige Seiten, die als MountPoint eingerichtet sind und sich den Inhalt einer anderen Seite hineinziehen.

Nun werden allerdings in der Sitemap die Links der gemounteten Seite ausgeben und nicht, wie eigentlich gewünscht, die des MountPounts selbst. Ich nutze ebenfalls den Schalter doNotShowLink = 1, da ich die XML Struktur selber zusammenbauen muss und hier nicht auf die generierten <a> Tags aus dem TMENU zurückgreifen kann.

Schalte ich doNotLinkIt auf 0, werden die korrekten Links generiert, jedoch, wie schon oben erwähnt, kann ich diese generierten <a>-Tags nicht richtig weiter verwenden.

Interessant an der ganzen Sache ist folgendes:
ich nutze, wie scripper auch, typolink.parameter.field = uid. Die UID ist die des MountPounts. In der Datenbank gibt es noch ein Feld mount_uid, d.h. typolink.parameter.field = mount_uid müsste eigentlich zu dem aktuell falschen Verhalten führen, jedoch nicht die Verwendung von uid.

Hat hier jemand vielleicht eine Lösung parat?

dachande ·

Ich habe hierzu mittlerweile ein wenig rausgefunden.

wenn HMENU durch die Navigation läuft, baut es intern Typolinks zusammen und nutzt für den Typolink als additionalParams Wert so etwas wie ?MP=xx-yy wobei xx die UID der eingebundenen Einstiegsseite und yy die UID der als MountPoint definierten Seite enthält. Wo HMENU diese Werte bisher herbekommt, konnte ich noch nicht rausfinden.

Fakt ist, möchte man so etwas nachbilden, muss man diesen MP Parameter irgendwie selbst zusammenbauen.

dachande ·

Ok, ich habe es nun letztendlich, nach ein wenig hacking hinbekommen. Und das Ganze, ohne den Core anfassen zu müssen. Es ist also wunderbar Update-Kompatibel.

Das Zauberwort meines letztendlichen Erfolgs lautet 'IProcFunc'.

Wie ich oben ja bereits erwähnt habe, enthalten die, durch das TMENU (oder besser gesagt HMENU) generierten Links den korrekten Pfad, da diese den MP-Parameter enthalten, welcher dann beispielsweise von RealURL zum richtigen Pfad umgewandelt wird.

HMENU besitzt die Typoscript-Option IProcFunc. Hier kann man eine Funktion angeben, welche den von HMENU generierten Link bearbeiten kann, bevor dieser gerendert wird. Letztendlich ging ich soweit, dass meine IProcFunc nichts weiter macht, als den öffnenden sowie den schließenden a-Tag entfernt und den Linktitel durch das href-Attribut ersetzt.

<?php

class UserFuncUtils {

	/**
	 * Modifies sitemap links. Whith this modification, a menu will only generate a plain url instead of an <a>-Tag
	 *
	 * This is an IProcFunc for a HMENU. The only parameter supplied by this method call is $this->I from the
	 * Menu ContentObject. The function call expects a modified $I array to be returned.
	 */
	function IProcFunc_plainURL($I) {
		// Show what $I has to offer
		// print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($I, NULL, 8, FALSE, FALSE, FALSE, array(), array());

		// Remove opening and closing tags and replace title with href attribute. This results in a plain URL being rendered by the menu
		$I['parts']['ATag_begin'] = '';
		$I['parts']['ATag_end'] = '';
		$I['parts']['title'] = $I['linkHREF']['HREF'];

		return $I;
	}
}

?>

Und so sieht dann letztendlich mein Typoscript Code zum Generieren der Sitemap aus. Diesen Code habe ich mir aus verschiedenen Quellen zusammengesucht und nachträglich für meine Bedürfnisse etwas angepasst:

includeLibs.userFuncUtils = fileadmin/ratec/libs/class.userFuncUtils.php

temp.cr = TEXT
temp.cr.char = 10

temp.tab = TEXT
temp.tab.char = 9

sitemap = PAGE
sitemap {
	typeNum = 101

	config {
		no_cache = 1
		disableAllHeaderCode = 1
		additionalHeaders = Content-Type: application/xml
	}

	wrap (
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">|
</urlset>
)

	4 < temp.cr

	# Home
	9 = LOAD_REGISTER
	9 {
		# 6 = ID of home page
		datum.data = DB : pages:6:lastUpdated // DB : pages:6:SYS_LASTCHANGED // DB : pages:6:tstamp // DB : pages:6:crdate
		datum.date = c
	}
	10 = TEXT
	10 {
		value (
	<url>
		<loc>{$BASEURL}</loc>
		<lastmod>{register:datum}</lastmod>
		<changefreq>weekly</changefreq>
		<priority>1.0</priority>
	</url>
)
		insertData = 1
	}

	11 = RESTORE_REGISTER

	12 < temp.cr

	# The MENU
	30 = HMENU
	30 {
		special = directory
		special.value = 6

		# Hide Upcrete Shortcut
		excludeUidList = 19

		1 = TMENU
		1 {
			expAll = 1
			noBlur = 1
			IProcFunc = UserFuncUtils->IProcFunc_plainURL

			NO = 1
			NO {
				before.cObject = COA
				before.cObject {
					10 = TEXT
					10.noTrimWrap = |	<url>|

					20 < temp.cr

					30 = TEXT
					30.noTrimWrap = |		<loc>|
				}

				after.cObject = COA
				after.cObject {
					10 = TEXT
					10.value = </loc>

					20 < temp.cr

					30 = TEXT
					30 {
						noTrimWrap = |		<lastmod>|</lastmod>
						data = field:lastUpdated // field:SYS_LASTCHANGED // field:tstamp // field:crdate
						date = c
					}

					40 < temp.cr

					50 = TEXT
					50 {
						noTrimWrap = |		<changefreq>|</changefreq>
						# always / hourly / daily / weekly / monthly / yearly / never
						value = weekly
					}

					60 < temp.cr

					70 = TEXT
					70 {
						noTrimWrap = |		<priority>|</priority>
						# 0.1 - 1.0
						value = 1.0
					}

					80 < temp.cr

					90 = TEXT
					90.noTrimWrap = |	</url>|

					100 < temp.cr
				}
			}
		}

		2 < .1
		2.NO.after.cObject.70.value = 0.9

		3 < .1
		3.NO.after.cObject.70.value = 0.8

		4 < .1
		4.NO.after.cObject.70.value = 0.7

		5 < .1
		5.NO.after.cObject.70.value = 0.6
	}

	40 < .30
	40.special.value = 40
	40.excludeUidList >

	50 < .40
	50.special.value = 45

	60 < .40
	60.special.value = 35
}

Wie man sehen kann nutze ich also keine typolinks mehr sondern lediglich den Link, der von dem Menu generiert wird und schleuse diesen vor dem Rendern durch meine eigene Funktion.

Ich hoffe, ich konnte damit ein bischen weiterhelfen.

Schöne Grüße und gebt mal Bescheid, ob's geklappt hat.