Another Blog about the Wide Web World
Header image

Ich konnte es kaum glauben, dass ich so lange an der Lösung eines manuellen (ohne Extension, sondern nur mit TypoScript) printlinks saß. Teilweise waren die Lösungen veraltet (z.B. GPvar anstatt GP) oder nahmen keine Rücksicht auf die Get Variablen von tt_news. Außerdem war es mir wichtig, dass ich nicht direkt über JavaScript ein window.print aufrufe und dann “nur” noch die print.css genommen wird. Ich wollte ein komplett neues Template, somit eine Druck-Vorschaufunktion für den User und erst dann das automatische OS Druck-Fenster. Das TypoScript kann natürlich nach belieben angepasst werden.

Hiermit erstelle ich den Printlink und später kopiere ich ihn einen Marker.


temp.print-link = COA
temp.print-link {
	10 = TEXT
	10.value = Seite drucken
	stdWrap.wrap = |
	stdWrap.typolinkno_cache = 1
	stdWrap.typolink.target = print
	stdWrap.typolink.ATagParams = target = _top
	stdWrap.typolink.parameter.cObject = COA
	stdWrap.typolink.parameter.cObject {

        5 = TEXT
        5.data = page:uid
        5.wrap = index.php?id=|
        5.required = 1

        10 = TEXT
        10.value = &no_cache=1

        20 = TEXT
        20.data = GP:L
        20.wrap = &L=|
        20.required = 1

        30 = TEXT
        30.data = GP:tx_ttnews | backPid
        30.wrap = &tx_ttnews[backPid]=|
        30.required = 1

        40 = TEXT
        40.data = GP:tx_ttnews | tt_news
        40.wrap = &tx_ttnews[tt_news]=|
        40.required = 1

        50 = TEXT
        50.data = GP:cHash
        50.wrap = &cHash=|
        50.required = 1

        60 = TEXT
        60.value = &type=98
    }
}

Und hiermit definiere ich das Drucktemplate


print = PAGE
print {
  typeNum = 98
  bodyTag = <body onload="javascript:window.print()">
  ##disable typo3 index
  config.index_enable = 0

  ##disable google index
  headerData.123 = TEXT
  headerData.123.value = <meta name="robots" content="noindex, nofollow" />

  includeCSS.fileDefault = fileadmin/templates/css/print.css
  10 = TEMPLATE
  10 {
      template = FILE
      template.file = fileadmin/templates/print.tmpl
      workOnSubpart = DOCUMENT_BODY

      marks {
        CONTENT < styles.content.get
      }
   }
}

Stellt man nachträglich die TYPO3 RealURL Konfiguration mit folgendem Befehl 'defaultToHTMLsuffixOnPrev' => false um und erhält dadurch Seiten ohne eine *.html Endung, erscheint für bestehende Links mit der Endung ein Server Error. Das Entfernen der *.html Endung soll aus SEO Sicht vorteilhaft sein. Daher sollte man auf jeden Fall auch eine Weiterleitung einrichten. Diese Weiterleitung leitet dann allgemeingültig alle *.html Dateien zu dem Verzeichnis um. Dies tut man am besten über die htaccess Datei mit folgendem Befehl:


RedirectMatch (.*)\.html$ $1/

Aus http://domain.de/datei.html wird http://domain.de/datei/

Am besten wäre es noch, wenn man alle URLs von http://domain.de/datei auf http://domain.de/datei/ leiten würde, somit jedesmal den endenen Slash (trailing slash) hinzufügen würde. Somit vermeidet man Duplicate Content. Leider hat bei mir u.g. Code nicht funktioniert. Vielleicht weiß jemand Rat?


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)([^/])$ http://domain.de/$1$2/ [R=301,L]

Vielleicht haben es einige von euch bemerkt: Hat man einen geschützten Bereich in TYPO3 (4.5.5) mit feuser und srfeuserregister laufen, außerdem eine Mehrsprachigkeit (in meinem Fall deutsch als default und englisch als id=1) und das 404 Handling an, dann kommt es zu Problemen. Anstatt die Login Maske von feuser aufzurufen, nachdem ein Link zum geschützen Bereich aufgerufen wurde, erscheint eine 404 Seite. Dieses Problem habe ich folgendermaßen mit einer kleinen Funktion behoben:


<?php
define(LOGIN_URL, "http://www.domain.de/login.html");
define(LOGIN_URL_EN, "http://www.domain.de/en/login.html");
define(NOTFOUND_URL, "http://www.domain.de/404.html");
define(NOTFOUND_URL_EN, "http://www.domain.de/en/404.html");

class user_pageNotFound {
  function pageNotFound($param, $ref) {
    if ($param["pageAccessFailureReasons"]["fe_group"] != array(""=>0)) {
      header("HTTP/1.0 403 Forbidden");
	  if ($_GET['L'] == 1){
      	$url = LOGIN_URL_EN."?redirect_url=" . $param["currentUrl"];
       } else {
			$url = LOGIN_URL."?redirect_url=" . $param["currentUrl"];
	  }
    } elseif ((substr($param['currentUrl'], 1, 2)) == "en") {
      	$url = NOTFOUND_URL_EN;
    } else {
		$url = NOTFOUND_URL;
	}

    session_start();
    $strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
    session_write_close();

    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, $url);
    curl_setopt($c, CURLOPT_COOKIE, $strCookie);
    $contents = curl_exec($c);
    curl_close($c);

    if ($contents) return $contents;
        else return FALSE;
  }
}
?>

Hierbei wird vor dem 404 Handling auch noch die RealURL abgefragt und je nach Sprache (in meinem Fall “en”) eine andere 404 Seite ausgegeben. Bitte ersetzt oder erweitert diesen Bereich nach euren Anforderungen. Außerdem müssen von euch natürlich auch die vier Konstanten (LOGIN_URL, NOTFOUND_URL..) geändert werden.

Zuvor muss in dem Install Tool oder in der localconf.php folgender Eintrag geändert werden: [FE][pageNotFound_handling] = USER_FUNCTION:fileadmin/scripts/pageNotFoundHandling.php:user_pageNotFound->pageNotFound und natürlich der oben genannte Code in das jeweilige Verzeichnis unter fileadmin in die Datei pageNotFoundHandling.php eingefügt werden.

Da die Nachfrage über die komplette Einbindung von Facebook und Twitter kam, hier nochmal der Code für die Einbindung der Buttons über das TypoScript Template.

Das ganze basiert auf den Anforderung, dass die Buttons auf allen Seiten eingeblendet werden sollen. Ich habe außerdem über eine kleine Extension das Abschalten der Buttons für jede Seite in den Seiteneigenschaften erstellt.

Den Code kann man mit Sicherheit auch für den Google+ Button erweitern.

temp.bookmarks = COA
temp.bookmarks {
		5 = TEXT
		5.value = <br/>
		5.if.isFalse.field = tx_nobookmarks_nobookmarks
		10 = COA
	   	10 {
	     	10 = TEXT
			10.value (
			<div style="float:left">
 			<a href="http://twitter.com/share" data-count="horizontal" data-lang="de">Tweet</a>
 			<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
 			</div>
			)
			10.if.isFalse.field = tx_nobookmarks_nobookmarks
	   	   }
  	   	20 = COA
	   	20 {
	     	10 = TEXT
			10.typolink.parameter.data = TSFE:id
			10.typolink.returnLast = url
			10.dataWrap = {TSFE:baseUrl}|
			10.rawUrlEncode = 1

		wrap (
                        <iframe src="http://www.facebook.com/plugins/like.php?href=|&layout=standard&show_faces=true&width=450&action=like&colorscheme=light&height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px; margin:-2px 0 0 15px;background-color:transparent;" allowTransparency="true"></iframe>
		)

	   }
		20.if.isFalse.field = tx_nobookmarks_nobookmarks

	}

Die Extension ermöglicht, dass ausschalten der Buttons über die Seiteneigenschaften.

So sieht es dann im Backend ausSie kann hier runtergeladen werden: TYPO3 Extension für die Facebook und Twitter Buttos (deaktiviert obigen Code)

Für WordPress gibt es ja mittlerweile ein Plugin, welches das Thumbnail-Bild für Facebooks Like Button festlegt. Früher hat Facebook das erste Bild im Quelltext als Thumbnail gewählt, heutzutage nimmt Facebook einfach irgendeins; manchmal sogar gar keins!

Ich habe also mal in TYPO3 etwas geTYPOscriptet ;)

Da nie Descriptions gepflegt wurden bei dem Kunden, sollte auch hier die Beschreibung bei den Like Button automatisch generiert werden.

Das Facebook Thumbnail-Bild im like Button, lasse ich über das Content-Element textpic (Text mit Bild) erstellen. Man kann das sicherlich noch erweitern auf CEs mit nur Bild. Außerdem muss das Bild über den Reiter media hochgeladen worden sein. Gibt es das CE nicht oder kein Bild unter media, dann wird auch einfach keins genommen. Der Like Button funtktioniert dann natürlich weiterhin.

Facebook Thumbnail festlegen

temp.metabild = COA
temp.metabild {
         10=CONTENT
         10.table= tt_content
         10.select {
           orderBy = sorting
           where = CType="textpic"
           selectFields = image
           max=1
           begin=0
           languageField = sys_language_uid
         }
         10.renderObj=COA
         10.renderObj {
         10 = TEXT
		 10 {
			field = image
			stdWrap.dataWrap = <link rel="image_src" href="/uploads/pics/|">
		}
	}
}
page.headerData.35 < temp.metabild

Für die Beschreibung neben dem Like Button, nutze ich den Meta-Tag Description. Hier werden aus dem ersten CE die ersten 300 Zeichen genommen und in den Meta-Tag geschrieben.

Facebook Like Button Beschreibung aus dem ersten Content-Element oder automatische Generierung der description aus den ersten Zeilen

temp.meta = COA
temp.meta {
         10=CONTENT
         10.table= tt_content
         10.select {
           selectFields = bodytext
           orderBy = sorting
           languageField = sys_language_uid
           where=colPos=0
           max=1
           begin=0
         }
         10.renderObj=COA
  	 10.renderObj{
    		10=TEXT
    		10{
      			field=bodytext
      			stripHtml=1
      			crop = 300 | ... | 1
    		}

  	}
}

page.headerData.76 < temp.meta
page.headerData.76.wrap = <meta name="description" content="|">

Ich habe außerdem noch die Extension tweet_and_like genutzt. Hier wird jeweils der Twitter-Share Button und der Facebook-Like Button in der LIST Ansicht unter jedem News Artikel eingefügt. Das tolle an der Extension: Der Facebook Like zeigt direkt auf die SINGLE Ansicht. Doch auch hier war es in meinem Fall nötig, die description zu generieren und das Thumbnail festzulegen. Das habe ich so getan:

tt_news Facebook Like Thumbnail

[globalVar = TSFE:id = 167]
temp.newsImage = COA
temp.newsImage {
        wrap=<link rel="image_src" href="/uploads/pics/|">
        5=RECORDS
        5 {
                source = {GPvar:tx_ttnews|tt_news}
                source.insertData = 1
                tables = tt_news
                conf.tt_news >
                conf.tt_news = TEXT
                conf.tt_news.field = image
        }
}
page.headerData.35 < temp.newsImage
[end]

Die ID 167 muss dann natürlich gegen die eigene ID der SINGLE Ansicht ausgetauscht werden.

tt_news Facebook Like Beschreibung setzen oder automatisch Generierung der description aus den ersten Zeilen

[globalVar = TSFE:id = 167]
temp.newsDesc = COA
temp.newsDesc {
        wrap=<meta name="description" content="|">
        5=RECORDS
        5 {
                source = {GPvar:tx_ttnews|tt_news}
                source.insertData = 1
                tables = tt_news
                conf.tt_news >
                conf.tt_news = TEXT
                conf.tt_news.field = bodytext
                conf.tt_news.stripHtml = 1
                conf.tt_news.crop = 300 | ... | 1
        }
}
page.headerData.76 < temp.newsDesc
[end]

Ihr nutzt nur lokale Extensions. Klickt ihr auf Update und es kommt die Meldung

ERROR: Could not remove extension directory "/pfad/zur/extension/httpdocs/typo3/ext/extensionname/". Reasons:
Error: "pfad/zur/extension/httpdocs/typo3/ext/extensionname/datei.php" could not be deleted!
[...]

Das liegt dann daran, dass TYPO3 nicht die Berechtigung hat diese Dateien zu löschen. Hier hat wahrscheinlich der FTP User vielleicht die Dateien nach einem Umzug hochgeladen (somit liegen die Rechte am FTP user und nicht bei TYPO3). Hat man keinen SSH Zugang wird es etwas schwieriger diese Dateirechte zu ändern.

Bei hosteurope gibt es glücklicherweise die Möglichkeit unter Allgemeines > Dateiverwaltung diese Rechte zu ändern.

Lang, lang ist’s her. Ich gebe zu, ich bin keine “richtige Bloggerin”. Trotzdem möchte ich gerne einige Erfahrungen mit euch teilen. An Erfahrungen hat es in letzter Zeit nicht gefehlt, was fehlte war die Zeit zum Schreiben. Als kleine Entschädigung gibt es ein neues, frisches WordPress Theme und eine kleine Ankündigung auf die nächsten Beiträge.

Ich werde nächstes Wochenende (21. – 23. Mai 2010) beim TYPO3camp Hamburg dabei sein und einen Bericht dazu verfassen.

Zudem bin ich am 1. und 2. Juni 2010 bei der webinale in Berlin und freue mich schon unheimlich darauf. Auf beiden Events werd ich eine geliehene DigiCam mitnehmen (meine ist kaputt gegangen) und hoffentlich ein paar schöne Fotos schießen. Die wird es dann auf meinen Flickr Account zu sehen geben. Werde mir nun endlich auch einen Pro Account registrieren. Mein nächster Einkauf wird eine neue DigiCam sein, so wird es dann auch endlich mehr Fotos auf meinem Flickr Account geben.

Ganz abgesehen davon entschädige ich meine Besucher demnächst mit meinen Projekten, an denen ich arbeite. Im Moment geht mein Studium in den Endspurt, freue mich bereits jetzt auf meine Bachelor-Arbeit über ein noch nicht veröffentlichtes SEO-Monitoring-Tool. Zur Zeit arbeite ich noch mit zwei Freunden an einem Film, 3D, Flash, TYPO3 Projekt. Ihr dürft gespannt sein! Wenn ihr auf dem aktuellen Stand bleiben wollt, dann: follow me on Twitter!

Zudem arbeite ich unter Hochdruck an einem Relaunch von unserem Rezept-Portal kochen OHNE. Wir setzen die bereits bestehende, selbst programmierte Website und Datenbank in Drupal um und werden aus dem Portal eine Community machen. Wenn ihr an einer Lebensmittelallergie oder einer Lebensmittelunverträglichkeit leidet, dann solltet ihr das Portal dringend besuchen. Ihr findet dort Rezepte laktosefrei, fructosearm, ohne Ei, ohne Milch glutenfrei, ohne Weizen, ohne Soja oder histaminarm. Zudem könnt ihr unser privates Projekt unterstützen indem ihr Fan, äh ein “Gefällt mir” von kochen OHNE bei Facebook werdet.

Ein schönen Restsonntag wünsch ich euch!

Paulina

Ich erinnere mich grad an mein anderen Kampf mit der recht schönen, aber doch sehr unwilligen Extension Glossary Extended v. 1.0.200 (EXT: sg_glossary) im Zusammenspiel mit RealURL v. 1.5.3 (EXT: realurl) bei Typo3 (4.2.6).

1. Tipp: Um eine Meldung auf Seiten auszuwerfen, die noch keine Einträge besitzen muss man ein Teil der Datei glossary_list.tmpl (typo3conf/ext/sg_glossary/pi1/) ändern. Zum Beispiel so:

[...]
<!-- ###EMPTYRESULT_PART### -->
<p>Noch keine Eintr&auml;ge vorhanden</p>
<!-- ###EMPTYRESULT_PART### -->
[...] 

Und im TS:

plugin.tx_sgglossary_pi1.search.emptyResultAsSubpart = 1

2. Tipp: Im gleichen Ordner ist auch die locallang.php zu finden. Hier man kann man andere Ausgaben ändern. Grundsätzlich wird deutsch genutzt, wenn auch die Lokalisierung deutsch ist. Leider tauchte bei mir ein Problem mit den Umlauten auf. Denn in den url’s waren auf einmal bei den Einträgen A, O und U Umlaute mitdabei. Wie man sich vorstellen kann hat RealURL bzw. die Konfiguration diese nicht richtig aufgelöst. Dies scheint meiner Meinung nach ein noch immer ungelöstet Problem bei der Glossary zu sein. Mir hat bisher nur dies geholfen: Ich habe in der Datei ext_typoscript_setup.txt in Zeile 187 den index geändert. Dies würde dann so aussehen: (more…)

Beim update von Typo3 (4.2.2 -> 4.2.6) tauchte mein bereits gelöstet erneut Problem auf. Hätte ich keine Sicherung der alten Version gemacht, wäre das Problem nicht so schnell behoben. Ich nutze mit meiner Typo3 Installation RealURL v. 1.5.3 (EXT: realurl) und die Extended Glossary v. 1.0.200 (EXT: sg_glossary). Beim erstmaligen Aufruf einer Seite der Glossary tauchte ein Mysql Fehler auf:

Warning: mysql_free_result(): supplied argument is not a valid
MySQL result resource in /.../t3lib/class.t3lib_db.php on line 836
Warning: mysql_fetch_assoc(): supplied argument is not a valid
MySQL result resource in /.../t3lib/class.t3lib_db.php on line 809

Eine Notlösung habe ich bereits gefunden: In der genannten Zeile einfach eine if-Schleife um das Problemkind bauen. Das würde dann so aussehen:

function sql_fetch_assoc($res) {
     if ($res) {
        $this->debug_check_recordset($res);
        return mysql_fetch_assoc($res);
     }
}

Genau das selbe dann in der Funktion sql_free_result.

Wenn jemand eine schönere Lösung gefunden hat, möge er sie mir bitte mitteilen!

Bei der sehr schönen Extension namens Customer References (EXT: customref) tauchte ein Fehler auf. Nach einem Serverumzug sind die Kategoriezuordnung der Kunden verloren gegangen. Die Liste war somit unvollständig und auch im Quellcode tauchte die Punkte nicht mehr auf. Die Seiteninhalte, sowie die Datensatzsammlung waren vollständig. Der Fehler befindet sich in der Datei “class.tx_customref_refcustomer.php”. Dort sollte man im Bereich “Returns an Array of Categorie IDs this refcustomer is assigned with” (im Bereich der Zeilen 200) die Zeile

'tx_customref_categorie, tx_customref_referencecustomer ' .

durch

'tx_customref_categorie INNER JOIN tx_customref_referencecustomer ' .

ersetzen. Fertig!

Quelle: Dank an ManuH bei Typo3.net