Indexed Search: Seitentitel indizieren

Relativ einfach lässt sich den von TYPO3 generierte Seitentitel für die Ausgabe im Frontend wegnehmen und via headerData mit einem beliebigen TypoScript-Objekt befüllen. Leider ignoriert die Indexed Search dies und greift stattdessen auf eine interne (und via TS unzugängliche) Variable zurück. Chris (SwiftLizard) hat schon vor laaaanger Zeit das Problem bemerkt und auch einen Lösungsweg gefunden.

Danke, mir hat das tiefes Suchen im Core erspart :-)

Forcing indexed search to display the title you want.
(als PDF-Backup, Extension als Backup)

Scheduler Cronjob bei Mittwald

Im Januar 2014 hatte Mittwald u.a. via Newsletter verkündet, dass jetzt der Scheduler auch ohne eigens angelegtes Shell-Skript in Cronjobmanager angelegt werden kann.
Mit welchen genauen Einstellungen das klappt, findet sich leider (noch) nirgends bei Mittwald.

Neuen Cronjob anlegen

media_1417123541046.png
  1. Unter „Tools“ in den „Cronjobmanager“ wechseln.
  2. Via „Neu“ einen neuen Cronjob anlegen.

Cronjob definieren

media_1417123596820.png
  1. Die Art des Cronjob ist ein „Benutzerdefinierter Aufruf“
  2. Als Interpreter wird „/usr/local/bin/php_cli“ gewählt (Wir wollen ja ein PHP-Skript ausführen)
  3. Als Pfad zum CLI-Dispatcher empfiehlt sich die Pfadangabe innerhalb des Symlinks auf die TYPO3-Sourcen (Damit überlebt der Cronjob auch das nächste TYPO3-Update)
  4. Dem Dispatcher müssen wir nun noch sagen, dass der Scheduler ausgeführt werden soll.
  5. …dann den Cronjob noch als aktiv anhaken…
  6. … und die gewünschte Frequenz einstellen.

Fertig!

EXT:comments: Labels via TypoScript

Die Extension „comments“ lässt sich sehr schnell integrieren udn sehr gut für eigene Anwendungsfälle konfigurieren. Einzige Ausnahme: man möchte Sprachlabels ändern, was normalerweise via TypoScript möglich ist:

plugin.tx_comments_pi1 {
    _LOCAL_LANG {
        de {
            pi1_template.add_comment = Schreiben Sie einen Kommentar
        }
   }
}

Leider zeigt das (in Version 1.7.1) keinerlei Wirkung :-(

Ursachenforschung

Eine Ausgabe des $LOCAL_LANG-Arrays, welches via \TYPO3\CMS\Frontend\Plugin\AbstractPlugin::pi_loadLL() geladen wird, zeigt bereits, dass das gesetzte neue Label überhabt nicht ausgelesen wird.

Die main()-Methode der Extension bekommt jedoch mittels $conf die TS-Konfiguration übergeben. Folglich muss der Fehler irgendwo dazwischen liegen. Dazwischen gibt es aber nur einen Aufruf: $this->fixLL();
Dieser Aufruf ist (laut phpdoc-Kommentar) ein Workaround für einen Bug #7154. Der enthaltene Link führt inzwischen leider ins Leere… Der Workaround wurde im Jahr 2008 in die Extension eingebaut. Ob er überhaupt noch nötig ist, wurde nicht weiter geprüft.
Die fixLL()-Methode durchläuft via foreach das Sprach-Array aus der TS-Konfiguration und ruft die interne Methode fixLL_internal() auf. Im PHP-Code fällt dort schnell etwas auf:

    /**
     * Helper function for fixLL. Called recursively.
     *
     * @param    array        $LL    Current array
     * @param    array        $ll    Result array
     * @param    string        $prefix    Prefix
     * @return    void
     */
    function fixLL_internal($LL, $ll, $prefix = '') {
        while (list($key, $val) = each($LL)) {
            if (is_array($val))    {
                $this->fixLL_internal($val, $ll, $prefix . $key);
            } else {
                $ll[$prefix.$key] = $val;
            }
        }
    }

 

Die Methode gibt nichts zurück (@return void) und verändert keine Klassenvariablen. Wie also soll hier etwas bearbeitetes die Methode verlassen? Und warum ist $ll als „Result array“ kommentiert, wenn es doch nirgends als Ergebnis ankommt?

Lösung

Die Lösung des Problem ist das Ergänzen eines „&“ in der Methodendeklaration:

    function fixLL_internal($LL, &$ll, $prefix = '')

 

Und wenn man dann seine Debugging-Session beendet hat, findet man auch den passenden Bugtracker-Eintrag – samt Patch :-(

 

Links

tt_news Icons: Alternative für Datei Ressourcen

Der einfachste Weg für eigene Icons ist via TypoScript den den Icon-Pfad und ggf die Dateiendung zu setzen:

plugin.tt_news.newsFiles.icon.path = fileadmin/templates/images/icons/
plugin.tt_news.newsFiles.icon.ext = png

Zu beachten ist hier lediglich, dass auch eine Datei „default“ mit passender Endung im Ordner liegt.

Alternative

Eine Alternative könnte unter Umständen via replacement-Eigenschaft des stdWrap sein. Dies ist v.a. dann interessanter, wenn die Dateinamen nicht 1:1 von TYPO3 übernommen werden sollen, und bei replacement auch Reguläre Ausdrücke nutzbar wären.

plugin.tt_news.newsFiles {
  stdWrap {
    replacement {
      10 {
        search = typo3/sysext/cms/tslib/media/fileicons/
        replace = fileadmin/images/icons/
      }
      20 {
        search = gif
        replace = png
      }
    }
  }
}

Links

 

Neueste Meldung als Default in tt_news-SingleView

Ruft man die Detailseite des tt_news-Plugins ohne gültige News-ID auf, so erhält man die nur wenig interessante Information, dass eben keine ID übergeben wurde. Oftmals schöner bzw. gewünscht wird hier aber stattdessen eine Default-Inhalt – z.B. die aktuellste Meldung.

Mit ein wenig TypoScript ist das schnell zusammengebaut

plugin.tt_news.noNewsIdMsg_stdWrap.override.if.isFalse.data = GPvar:tx_ttnews|tt_news
plugin.tt_news.noNewsIdMsg_stdWrap.override.cObject = CONTENT
plugin.tt_news.noNewsIdMsg_stdWrap.override.cObject {
  table = tt_news
  select {
    // Seiten-ID der tt_news-Artikel
    pidInList = 8
    orderBy = datetimedesc
    max = 1
  }
}

Link-Feld: CSS-Klasse hinzufügen mittels Fluid

Sinn und Zweck: aus dem Link-Feld des Backends (in dem neben der Zielseite auch target-, CSS-Klasse und title-Attribut stehen kann) den Wert an Link-Viewhelper übergeben, dabei aber eine zusäztliche CSS-Klasse anhängen.

<vhs:if.string.isNumeric value="{field.link}">
  <f:then>
    <dce:typolink parameter="{field.link} - link" />
  </f:then>
  <f:else>
    <dce:typolink parameter="{vhs:format.regularExpression(pattern: '/^([^ ]+)\s+([^ ]+)((\s+-)|(\s+[^ ]*)) (.+)/Ui', replacement: '\1 \2 \"link\5\" \6', subject: '{field.link}')}" />
  </f:else>
</vhs:if.string.isNumeric>

Update 2014-04-07

Nette Idee, aber die Tücken liegen wie so oft im Detail. Die Kombinationsmöglichkeiten aus internem Link/externem Link, Linkziel (target) gegeben/nicht-gegeben, Linktitle gegeben/nicht-gegeben und CSS-Klasse gegeben/nicht-gegeben ergeben, sind derart groß, dass der reguläre Ausdruck von oben doch nicht immer greift (z.B. falls nur eine externe URL gegeben ist).

Entwicklungshilfe seit TYPO3 6.0

TYPO3 hat zwei kleine Gemeinheiten in sich, die einem manchmal das Leben erschweren:

  • zum einen den Cache (bzw. inzwischen die Caches),
  • zum anderen seine Verschwiegenheit über genauere Fehlerursachen (in produktiven Umgebungen).

Ersteres lässt sich v.a. während der Extbase-basierten Entwicklung (neben altbekannten TypoScript-Einstellungen) über eine Änderung am CachingFramework lösen. Denn nach Änderungen im Model bzw. in den Annotationen im Controller oder Repository entstehen  Fehlermeldungen oftmals durch veraltete Einträge im Reflection Cache von Extbase, welcher Modelproperties und Annotationen speichert.

Die Verschwiegenheit bei Fehlern lässt sich mit einer Reihe von Schaltern beheben, sodass TYPO3 sehr auskunftfreudig wird.

Weiterlesen