Beiträge der Kategorie TYPO3

Extbase Plugin per TypoScript einbinden

Wenn man ein auf Extbase/Fluid-Basis erstelltes Plugin auf jeder Seite einsetzen möchte, dann braucht man folgenden Code im Setup des Seitentemplates:

temp.myPlugin = USER
temp.myPlugin {
   userFunc = tx_extbase_core_bootstrap->run
   pluginName = MyPlugin
   extensionName = MyExtension
 
   settings =< plugin.tx_myextension.settings
   persistence =< plugin.tx_myextension.persistence
   view =< plugin.tx_myextension.view
}

Statt MyPlugin und MyExtension muss man natürlich den Namen des eigenen Plugins und der Extension einsetzen. Wichtig ist, dass das Plugin mit configurePlugin und registerPlugin in ext_localconf.php bzw. ext_tables.php registriert und konfiguriert ist. In meinem Fall ist MyPlugin so konfiguriert, dass TestController->listAction aufgerufen werden soll.

Nun hatte ich das Problem, dass ich meine Klassen bereits nach TYPO3 6 Manier also mit Namespaces geschrieben habe. Wenn der Extbase Bootstrapper aber aus den Angaben den Controller-Klassennamen zusammenbaut, dann bekommt er folgendes: Tx_MyExtension_Controller_TestController. Die Klasse existiert natürlich nicht, denn sie heißt genamespaced ja so: \Vendor\MyExtension\Controller\TestController.

Ich habe rausgefunden, dass es eine ClassAliasMapper.php gibt, in der die alten Klassennamen auf die neuen Namen mit Namespace gemappt werden. So funktioniert ja z.B. der Aufruf Tx_Extbase_Core_Bootstrap immer noch, obwohl es die Klasse nicht gibt. Dann hab ich rausgefunden, dass alle Extensions nach der gleichen Datei durchsucht werden und diese Mapping-Liste erweitert wird. Im Extension-Ordner die Ordnerstruktur Migrations/Code/ und darin die Datei ClassAliasMap.php anlegen. Die Datei hat folgenden Inhalt:

return array(
	'Tx_MyExtension_Controller_TestController' => 'Vendor\\MyExtension\\Controller\\TestController'
);

Extbase-Klassen auf bestehende Tabellen mappen

Wenn man noch ohne Namespaces arbeitet, dann fügt man folgenden Code ins Setup der eigenen Extension ein:

config.tx_extbase.persistence.classes {
	Tx_MyExtension_Domain_Model_Page {
		mapping {
			tableName = pages
		}
	}
}

Seit TYPO3 6.0 sind nun Namespaces hinzugekommen, und nun sieht es so aus:

config.tx_extbase.persistence.classes {
	Vendor\MyExtension\Domain\Model\Page {
		mapping {
			tableName = pages
		}
	}
}

Wichtig ist, dass vor dem Vendor kein Slash steht.

Geschrieben in TYPO3 | Kommentare deaktiviert für Extbase-Klassen auf bestehende Tabellen mappen

Mehrspaltigkeit in TYPO3 6.0

Ich habe mich letzte Woche mit Mehrspaltigkeit in TYPO3 auseinandergesetzt. Ich habe bisher in 4er-Versionen gearbeitet und wollte nun der neuen Version 6 eine Chance geben. Da die Layouts, die ich serviert bekomme, meistens abwechslungsreich sind (2 oder 3 Spalten innerhalb einer Content-Spalte), habe ich bisher immer TemplaVoila genutzt. Die Flexibilität von TV und der Einsatz von FCEs macht TV zu einem mächtigen Templating-Tool in TYPO3.

(mehr …)

“Page not configured” Fehler bei Extension pagerating

Zum Testen hatte ich die Extension “pagerating” installiert auf meinem XAMPP. Habe das Template inkludiert, jQuery meiner Seite hinzugefügt. Dann klickt man auf den Link zum Voten (es kommt ein Alert) und die Konsole zeigt eine Fehlermeldung an. Hab auf den Link geklickt – es kommt eine TYPO3 Fehlermeldung “Page type not configured”. In der Configuration der Extension wird ein Seitenobjekt definiert – sieht soweit alles richtig aus, komisch, dass es nicht funktioniert.
Dann hab ich mir mal die typeNums der Seiten anzeigen lassen. In der Extension ist es so gesetzt:
pageTypeNum = 43873923824
Wir auch in den Links so generiert. Aber in der Fehlermeldung steht folgendes:
The page is not configured! [type=2147483647]

Die Ursache dieser unterschiedlichen Zahlen ist der Typ des pageTypeNum-Wertes. Dieser ist nämlich int. Und der maximale Wert für einen int-Wert (zumindest in Windows) ist eben 2147483647. Das Problem ist somit behoben, wenn man über Konstanten-Editor den pageTypeNum auf einen geringeren Wert setzt als eben den maximalen int-Wert.

TYPO3 6.0 Inhaltselemente anlegen nicht möglich

Hab mir das TYPO3 6.0 Government Package installiert. Als ich versucht habe, ein Inhaltselement anzulegen, kam folgende Fehlermeldung:

Call to undefined method TYPO3\CMS\Core\Utility\GeneralUtility::readLLXMLfile()

TYPO3 ist scheinbar in der Lage aus t3lib_div die korrekte Klasse zu ermittelt, aber der Funktionsname hat sich inzwischen geändert. Zwei Lösungsvarianten:

Datei typo3conf/ext/tt_news/pi/class.tx_ttnews_wizicon.php

Variante 1) Nur den Funktionsnamen ändern

function includeLocalLang()	{
	$llFile = t3lib_extMgm::extPath('tt_news').'locallang.xml';
	$LOCAL_LANG = t3lib_div::readLLfile($llFile, $GLOBALS['LANG']->lang);
	return $LOCAL_LANG;
}

Variante 2) Auch die Klassennamen ändern (mit Namespaces)

function includeLocalLang()	{
	return \TYPO3\CMS\Core\Utility\GeneralUtility::readLLfile(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('tt_news') .
		'locallang.xml', $GLOBALS['LANG']->lang);
}

TYPO3 6.0 Extension Manager funktioniert nicht

Habe mir TYPO3 Version 6.0 zum Anschauen installiert (XAMPP 1.8.1, Windows 7). Bisher funktioniert alles, außer dass beim Aufruf des Extension Managers der Apache abstürzt und eine leere Seite mit der Fehlermeldung angezeigt wurde, dass die Seite nicht geladen werden konnte. Hab dann ein bisschen gesucht und folgende Lösung gefunden, die tatsächlich schnell geholfen hat.
Ursache “Fluid uses complex regular expressions which require a lot of stack space during the first processing. On Windows the default stack size for Apache is a lot smaller than on unix. You can increase the size to 8MB (default on unix) by adding to the httpd.conf:”.

Also am Ende der httpd.conf-Datei folgendes einfügen und Apache neu starten:
ThreadStackSize 8388608

Quelle: Probleme beim Zugriff auf den Erweiterungsmanager typo3forum.net

Extbase: Tabellenname in Repository ermitteln

Ich dachte, es wäre etwas einfacher, aber es funktioniert wohl (nur) so. Diese Funktion in die Repository-Klasse einfügen:

/**
* Return the current tablename
*
* @return string
*/
protected function getTableName() {
	return $this->persistenceManager->getBackend()->getDataMapper()->getDataMap($this->getRepositoryClassName())->getTableName();
}

Gefunden habe ich es beim TYPO3 Blogger Adventskalender von 2011.

Geschrieben in TYPO3 | Kommentare deaktiviert für Extbase: Tabellenname in Repository ermitteln

Bildgröße im Data Structure überschreiben

Der große Vorteil von TemplaVoila ist die große Flexibilität bei den Templates. Wenn man nun ein Template erstellt mit z.B. zwei Spalten, bei denen die erste 600px und die andere nur 300px breit ist, ist es sehr schwer einen allgemeinen Wert für maximale Bildgrößen anzugeben. Zum Glück kann man im Data Structure die maximale Bildbreite für eine bestimmte Spalte überschrieben. Dazu in den TypoScript Abschnitt folgendes einsetzen:

<TypoScript>
<![CDATA[
5 = LOAD_REGISTER
5.maxImageWidth = 300
 
10= RECORDS
10.source.current=1
10.tables = tt_content
10.wrap = <!--TYPO3SEARCH_begin--> | <!--TYPO3SEARCH_end-->
 
15 = RESTORE_REGISTER
]]>
</TypoScript>

Die maximale Bildgröße wird dadurch in der Spalte auf nur 300px gesetzt. Hat man am normalen Verhalten bzgl. Bild in Text nichts geändert, dann ist in diesem Fall ein Bild im Text nur 150px breit.

Geschrieben in TYPO3 | Kommentare deaktiviert für Bildgröße im Data Structure überschreiben

TCA in Plugin laden

Um Werte aus dem TCA im einenen Plugin zu verwenden, kann man die Funktion t3lib_div::loadTCA(‘fe_users’) nutzen, um das TCA zu laden. Dann steht es unter $GLOBALS[‘TCA’][‘fe_users’] zur Verfügung und kann ausgelesen werden. Leider lädt diese Funktion nur die Felder, die im Core definiert sind. Wenn das TCA durch Extensions erweitert wird, sind diese Felder nicht darin gelistet. Warum das so ist, kann man im TYPO3 Bugtracker nachlesen.
Wenn mann stattdessen folgende Funktion verwendet, werden alle Felder inkl. der Felder aus den Extensions geladen:

$GLOBALS['TSFE']->includeTCA();

Geschrieben in TYPO3 | Kommentare deaktiviert für TCA in Plugin laden

Fluid Pagination Widget

Nachdem ich es geschafft habe, dem Fluid Pagination Widget ein eigenes Template aufzuzwingen, musste ich nun weitere Anpassungen vornehmen. Da ich so viele Datensätze habe, umfasste meine Liste mit Seiten über 1000 Stück. Selbst wenn ich sie alle nebeneinander darstellen kann, ist die Blätterfunktion kaum zu gebrauchen. Ich wollte daher folgendes erreichen:
– konfigurierbare Anzahl der Seiten, die neben der aktuellen Seite angezeigt werden
– Link zu allerersten und allerletzten Seite
– falls Seiten übersprungen werden, sollte es erkennbar sein
Mein Ziel also:

Um das zu erreichen, habe ich zunächst den Controller angepasst: ich führe einen neuen Parameter ein (adjacentPagelinks), damit kann die Anzahl der Seiten neben der aktuellen Seite konfiguriert werden. In der Funktion buildPagination, die ich zunächst aus der PaginateController-Klasse von Fluid übernommen habe verarbeite ich den neuen Parameter. Die For-Schleife, die die Links zu den Seiten generiert, beginnt nun nicht mehr bei 1 und endet bei $this->numberOfPages. Stattdessen beginnt sie bei einer erreichneten $firstPage und endet bei $lastPage. Wenn $firstPage größer als 2 ist, dann wurde eine Seite übersprungen und es müssen Punkte (…) angezeigt werden. Das gleiche mache ich mit $lastPage.
Hier ist der komplette PaginationController-Code.

Es müssen natürlich Anpassungen im Template vorgenommen werden. Die im Controller gesetzten Variablen firstPage, spacerAfterFirst, lastPage und spacerBeforeLast müssen im Template entsprechend verarbeitet werden. Ein Auszug aus dem Code des Templates ist hier.