Tach zusammen,
ich suche nach einer geschmeidigen Lösung, um aus einer FE-Extensions heraus den Titel (also genauer: das title-Tag) einer Seite zu manipulieren.
Hintergrund: Meine Extension greift auf eine Datenbank außerhalb von Typo zu und stellt die Datensätze entweder als Übersichtsliste oder aber aus Detailansicht dar. In der Detailansicht hätte ich gerne den Namen des aktuellen Datensatzes als Seitentitel. Auch deshalb, weil sich Google dann so freut ;-)
Ich stehe ehrlich gesagt ein bisschen auf dem Schlauch. Offensichtlich rendert Typo den Seitenanfang mit head, title und metas bereits, bevor die Extensions ihren content produzieren dürfen. Darum hat es keinen Zweck, den Seitentitel in den $GLOBALS zu ändern. Die schmutzige Alternative: Im bereits gerenderten Inhalt mittels preg_replace() den Titel zu ersetzen.
Hat von euch vielleicht jemand einen eleganteren Weg? Richtig gefallen tut mir das nicht...
Schönen Gruß
Sven
so machts die tt_news:
// set the title of the single view page to the title of the news record
if ($this->conf['substitutePagetitle']) {
$GLOBALS['TSFE']->page['title'] = $row['title'];
// set pagetitle for indexed search to news title
$GLOBALS['TSFE']->indexedDocTitle = $row['title'];
}
Heißen Dank für eure Antworten!
@Tetramatrix:
Die titleTagFunction hatte ich mir auch schon angesehen. Aber so ganz gefallen will mir das nicht. Den Seitentitel zu ändern ist strukturell und prinzipiell die Aufgabe der Extension. Zusätzlich noch über die config zu gehen, erscheint mir "von hinten durch dir Brust ins Auge". Das muss besser gehen!
@steffenk:
Das ist genau die Art, wie es laufen sollte. Leider kriege ich das auch bei tt_news nicht hin. Setze ich das entsprechende Parameter
plugin.tt_news.substitutePagetitle = 1
wird das title-Tag leider auch nicht geändert.
Lasse ich mir an der von dir angeführten Stelle im Quelltext von tt_news den Inhalt des Objekts $GLOBALS['TSFE'] ausgeben, z.B. so:
// set the title of the single view page to the title of the news record
if ($this->conf['substitutePagetitle']) {
t3lib_div::debug($GLOBALS['TSFE']); die();
$GLOBALS['TSFE']->page['title'] = $row['title'];
// set pagetitle for indexed search to news title
$GLOBALS['TSFE']->indexedDocTitle = row['title'];
}
sieht man, dass unter $GLOBALS['TSFE']->content der HTML-Head bereits vollständig geschrieben ist und bloß noch auf seine Ausgabe wartet.
Das es an der Stelle mittlerweile Probleme mit tt_news gibt, ist im Forum auch unter
#28877 schon beschrieben worden.
Was läuft da falsch? Bin für jeden Tipp wirklich dankbar!
Schönen Gruß
Sven
mein tip auf anhieb:
- title in der pages tabelle neu beschreiben
- caching tabellen leeren (auch die realurl pathcache)
wenn du das aber mehrmals täglich machst, ist da schon enorme belastung zu spüren.
Verstehe ich nicht, Du kannst doch auch die Funktion in die Extension integrieren. Da muß man dann nichts zusätzlich einstellen. Außerdem kann der User die Funktion dann ganz bequem bei Bedarf über TS an und ausschalten. Und diese andere Methode scheint ja gar nicht zu funktionieren. Die ist in meinen Augen aber auch sehr unsauber, weil direkt ins Array geschrieben wird. Was willst Du dann damit genau bezwecken?
Nochmals ein Dankeschön für eure Antworten!
Ich habe mittlerweile des Rätsels Lösung gefunden 🙂
1. Die Extension muss im "USER"-Modus eingebunden werden (nicht "USER_INT"!)
2. Für die entsprechende Seite muss das Caching deaktiviert werden über:
$GLOBALS['TSFE']->set_no_cache();
Dann kann man in der Tat direkt innerhalb der Extension den Seitentitel verändern:
$GLOBALS['TSFE']->page['title'] = $string;
$GLOBALS['TSFE']->indexedDocTitle = $string;
Das gleiche gilt übrigens auch für tt_news...
Schönen Gruß
Sven
Hallo Tastendrücker,
du hattest am 17.05.06 zum Thema 'Seitentitel dynamisch ändern'...
#431871
...eine Lösung gezeigt.
Leider funktioniert die in meiner Ext. nicht. Den ersten beiden Punkten...
1. Die Extension muss im "USER"-Modus eingebunden werden (nicht "USER_INT"!)
2. Für die entsprechende Seite muss das Caching deaktiviert werden über.
...bin ich so nachgekommen:
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
// Extension muss im "USER"-Modus eingebunden werden
// USER_INT deaktivieren
// -> Definition des Title Tags
// $this->pi_USER_INT_obj=1;
// Variablen setzen
$content='';
$marker=array();
// für die Seite das Caching **deaktivieren**
$GLOBALS['TSFE']->set_no_cache();
...
In der Single View habe ich dann dies.
// <title> Tag der SingleView Seite definieren
// Seitentitel ändern
$GLOBALS['TSFE']->page['title'] = $row["surname"];
$GLOBALS['TSFE']->indexedDocTitle = $row["surname"];
Leider wird immer nur der Titel der Seite ausgegenen, auf dem die Ext. läuft. Was mache ich falsch?
Gruß Rène
Hallo Rène,
das sieht doch eigentlich ganz prima aus. Läuft die Extension denn tatsächlich im USER-Modus? Es reicht vielleicht nicht aus, wenn man das USER_INT-Setzen in der Extension selber auskommentiert.
Schau mal in deinem Haupttemplate in den Typo Script Object Browser in die Rubrik "plugins" und suche nach dem Namen deiner Extension. Ich tippe, sie ist da noch als USER_INT drin.
Schönen Gruß
Sven
$GLOBALS['TSFE']->set_no_cache();
das sollte man vermeiden ! Das wiederspricht auch dem Typ USER
Ansonsten wie Sven gesagt hat, man kann den Typ auch im ObjectBrowser ändern, ausserdem noch in der ext_localconf.php
t3lib_extMgm::addPItoST43($_EXTKEY,'pi1/class.tx_sksoftlinks_pi1.php','_pi1','list_type',1);
Die 1 ist USER, 0 ist USER_INT
Hallo!
Ich habe jetzt im TS meine Ext. ausdrücklich als 'USER' definiert...
plugin.tx_t3xapplikation_pi1 >
plugin.tx_t3xapplikation_pi1 = USER
plugin.tx_t3xapplikation_pi1 {
...
}
...das sehe ich auch im Objekt-Browser.
Leider kommt jetzt meine SingleView nicht mehr.
In meiner SingleView wird eine Sedcard gezeigt - also ein Foto und Daten, die aus der Datenbank ausgelesen werden. Kann es am Inhalt der SingleView liegen?
Warum will meine SingleView nur im USER_INT Modus laufen? Das ...set_no_cache() habe ich jetzt auch weggeleassen.
Gruß Renè
Hi René,
das kann natürlich viele Ursachen haben. Wie verlinkst du denn zwischen Listen- und Detailansicht? Wodurch unterscheidet dein FE-Plugin (sprich die PHP-Klasse) zwischen den beiden Zuständen? Da würde ich beim Debuggen mal ansetzen. Ist einfach ein zu weites Feld, um hier "mal eben" was Schlaues dazu zu sagen.
Schönen Gruß
Sven
Hallo Sven,
So ist der Aufbau meiner pi1/class.tx_t3xMyExt_pi1.php
class tx_t3xMyExt_pi1 extends tslib_pibase {
var $prefixId = 'tx_t3xMyExt_pi1'; // Same as class name
var $scriptRelPath = 'pi1/class.tx_t3xMyExt_pi1.php'; // Path to this script relative to the extension dir.
var $extKey = 't3x_MyExt'; // The extension key.
...
function main($content,$conf) {
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
$this->pi_USER_INT_obj=1;
// Variablen setzen
$content='';
$marker=array();
// START Funktionsweichen
// zur SingleView
if (!empty($this->piVars['showUid']))
{
$content = $this->singleView($this->piVars['showUid'], $this->conf);
}
// zur ListView
else
{
$content = $this->listView( $this->conf, $this->piVars['uid']);
}
// STOP Funktionsweichen
return $this->pi_wrapInBaseClass($content);
}
# ----------------------------------------------------
function listView($conf,$uid='') {
...
$sql="...'";
$res = $GLOBALS['TYPO3_DB']->sql_query($sql);
while($row = $GLOBALS["TYPO3_DB"]->sql_fetch_assoc($res)) {
...
}
return $content;
}
# ----------------------------------------------------
function singleView($showUid,$conf) {
// für die Seite das Caching **deaktivieren** so???
// $GLOBALS['TSFE']->set_no_cache();
...
$sql="...'";
$res = $GLOBALS['TYPO3_DB']->sql_query($sql);
while($row = $GLOBALS["TYPO3_DB"]->sql_fetch_assoc($res)) {
...
$GLOBALS['TSFE']->page['title'] = $row["mein_seitentitel"];
$GLOBALS['TSFE']->indexedDocTitle = $row["mein_seitentitel"];
...
}
return $content;
}
}
Wie gesagt im USER_INT Modus läuft die Ext. bestens. Schalte ich den USER Modus gibt es keine SingleView mehr.
tt_news läuft übrigens bei mir im USER Modus und jede tt_news SingleView bekommt einen eigenen Title-Tag.
Kannst du oben schon irgendetwas entdecken, was den USER Modus verhindert??
Gruß Renè
Hi Renè,
kurz und auf die Schnelle:
Zum einen setzt du in der main-Methode die Extension wieder in den USER_INT-Modus, das solltest du besser nicht tun. Ich setze bei meinen Extensions immer
$this->pi_USER_INT_obj=0;
Zum anderen: Die Extension entscheidet offensichtlich anhand $this->piVars['showUid'], in welchem Modus sie laufen soll. Woher kommt dieser Wert? Passiert das über die Verlinkung?
In deinem Quelltext sehe ich keine entsprechende Input-Verarbeitung. Ist da ein Wert drin, wenn du die Extension im Single-Modus aufrufst?
Ich würd mal ein
t3lib_div::debug($this->piVars['showUid']);
in die main-Methode setzen und nachschauen, ob die showUid tatsächlich ankommt.
Wenn nicht, musst du dich sicherlich noch um die Verarbeitung der $_GET-Variablen kümmern.
Schönen Gruß
Sven
Hallo!
Ich habe jetzt die Lösung gefunden Und zwar lag es daran, dass das TypoScript Setup nicht vollständig war. Dies mußte ich zum Setup meiner Ext. ergänzen:
includeLibs.tx_t3x_myExt = EXT:t3x_myExt/pi1/class.tx_t3x_myExt_pi1.php
plugin.tx_t3x_myExt_pi1 >
plugin.tx_t3x_myExt_pi1 = USER
plugin.tx_t3x_myExt_pi1 {
userFunc = tx_t3x_myExt_pi1->main
...
}
Jetzt klappt es mit der dynamischen Erzeugung der Seitentitel :-)
Dank nochmal an Sven und steffenk!
Renè
Hallo,
das Thema ist schon alt, aber das Problem noch immer aktuell.
ich hab nämlich das gleiche.
Meine Ext ist vom Typ USER , unter "userFunc" ruf ich auch die richtige Funktion auf ( -> main ) .
und in meiner DetailView steht auch ziemlich weit oben:
$GLOBALS['TSFE']->page['title'] = "Test";
$GLOBALS['TSFE']->indexedDocTitle = "TEST";
( mit einer vorhergehenden DB abfrage )
jetzt eine Bitte an die Meister: wo ist mein Fehler?
Hallo zusammen,
das Thema ist ja leider schon etwas älter, aber ich quäle mich da gerade auch mit rum.
Ich lasse meine Extension als User_int laufen, da ich ständig user Eingaben verarbeite und die Extension nicht cachen soll / darf.
Nun suche ich nach einer Möglichkeit den Seitentitel zu beeinflussen. Ist das mit Extension, die als User_int laufen einfach generell nicht möglich?!?!
Viele Grüße
Sven
Hallo,
ich glaube es sollte so funktionieren:
Schreibe in deiner Extension einfach mal
$GLOBALS['TSFE']->additionalHeaderData[$this->prefixId] = "<title>Mein Titel</title>";
Damit du aber keine doppelten Title-Tags hast, solltest du den Standard-Title ausschalten mit:
config.noPageTitle = 2
Bitte gebe hier bescheid, ob es so klappte.
Hallo Sturmi,
danke erst mal für Deine Antwort. Hatte mir das gestern noch etwas genauer angesehen und anders gelöst.
Wie ich festgestellt habe, wir bei einer Extension, die als user_int läuft, bereits die komplette Seite generiert und in die
$GLOBALS['TSFE']->content
geschrieben. Im Gegensatz zum User Object, wo ich den Titel der Seite per
$GLOBALS['TSFE']->page['title'] = "mein titel"
setzen kann.
Da ich nur in meiner Extension den Titel überschreiben möchte, sonst aber mein normales TS für den Page Title greifen soll, suche und ersetze ich einfach den fertigen Inhalt per regulärem Ausdruck. funktioniert prima. 😉
$GLOBALS['TSFE']->content = ereg_replace("<title>.+<\/title>","<title>".$newpagetitle."</title>",$GLOBALS['TSFE']->content);
(und ja ich weiss, dass ereg_replace veraltet ist... ändere ich noch. 😉)
Dafür extra ereg_replace anwerfen, was wieder mehr Arbeit für den Server bedeutet? Dann würde ich eher preg_replace nehmen, da es schneller ist. Den u.s. Code kannst du doch einfach auf der Seite einfügen, wo sich dein Plugin befindet, oder?