Wenn man eine ältere Version von tt_news installiert hat (z.B. 3.0.1) und dann auf TYPO3 Version 4.6. aktualisiert, dann werden keine News mehr angezeigt, es gibt keine Fehlermeldung, an der Stelle erscheint einfach keine Ausgabe. Zunächst habe ich selbst herausgefunden, dass das Plugin nicht mehr registriert wird in tt_content.list.20.9. Dann habe ich einen Forenthread gefunden zu dem Thema im typo3forum. Es hat geholfen, die neueste tt_news Version zu installieren.
Beiträge der Kategorie TYPO3
Installation TYPO3 4.6 auf Localhost
Bisher hatte ich wenig Probleme TYPO3 auf Localhost schnell zu installieren. Gerade die neue Version 4.5.6 runtergeladen, ausgepackt und Fehlermeldung im Installtool – Modul openssl in PHP fehlt. Ich habe kurz in Google geschaut, aber keine genaue Fehlerbeschreibung gefunden.
Im Verzeichnis xampp/php/ liegen mehrere Konfigurationsdateien, in der php.ini-development findet sich der auskommentierte Verweis auf das fehlende Modul. In der php.ini hingegen nicht, das hat mich am Anfang ein bisschen verwirrt. Daher in der php.ini-development nach openssl suchen, die Zeile kopieren. In der php.ini nach der Windows-Extension-Liste suchen und dort diese Zeile reinkopieren und Kommentar entfernen (Kommentar ist ; am Anfang der Zeile)
;extension=php_openssl.dll
Untertitel der Seite in TypoScript ausgeben mit Fallback auf Titel
Über einer Navigation in der linken Spalte soll der Titel der übergeordneten Seite aus Level 1 dargestellt werden. Da im Web keine Silbentrennung existiert, habe ich mir gedacht, dass das Wort inklusive Silbentrennung in den subtitle geschrieben wird. Wenn das Feld subtitle befüllt ist, dann soll statt titel der Inhalt von subtitle ausgegeben werden. Hier ist mein TypoScript:
lib.navigation.sub = COA lib.navigation.sub.10 = TEXT lib.navigation.sub.10 { data = levelfield: 1, title wrap = <h3>|</h3> override.required = 1 override.data = levelfield: 1, subtitle }
Eigenes Javascript vor dem der Extensions einbinden
Normalerweise inkludiert TYPO3 die JavaScript-Dateien in der Reihenfolge: zunächst was in den Extensions hinzugefügt wird, dann das was in page.includeJS definiert wurde und dann das, was über page.headerData hinzugefügt wurde. Man kann jedoch einzelne Dateien ganz an den Anfang dieser Kette setzen mit forceOnTop.
page.includeJS { jquery = fileadmin/path/to/jquery-1.6.2.min.js jquery.forceOnTop = 1 }
Mühsame Installation von TYPO3 auf Localhost
Ich hatte die letzten zwei Mal schwierigkeiten die neueste TYPO3 Version 4.5.x auf Localhost (XAMPP) zu installieren. In XAMPP ist der Datenbank-User, der bereits eingerichtet ist root ohne Passwort. Solange man lokal arbeitet ist es ja auch in Ordnung. Im Install-Tool kann man das Feld Passwort nicht einfach frei lassen, da es erforderlich ist. Also überspringe ich den 1-2-3-Modus und will die Datenbankzugangsdaten selbst in localconf.php eingeben. Das funktioniert aber auch nicht – TYPO3 Install Tool meldet noch immer „Keine Verbindung zur Datenbank“. Ich versuche einen neuen Datenbank-Benutzer über phpMyAdmin anzulegen – mit Passwort – und trage die Daten dann in localconf.php ein. Immer noch kein Erfolg. Nachdem ich schließlich den Datenbank-Namen in die Konfigurationsdatei geschrieben habe und eine Fehlermeldung auftauchte „ADONewConnection: Unable to load database driver“, hatte ich zumindest eine Fehlermeldung, nach der ich Suchen konnte.
Meine Recherche ergab, dass die Fehlermeldung auftaucht, wenn die Extensions adodb und dbal installiert sind, aber nicht korrekt konfiguriert sind (Quelle jweiland.net). Da es aber eine ganz neue TYPO3 Installation ist, konnte ich noch keine Extensions manuell aktivieren, also ist das wohl die Standardkonfiguration. Um die Extensions zu deaktivieren, habe ich in der localconf.php in der Extension Liste (extList) den Eintrag dbal entfernt. Und siehe da, es funktioniert sofort und die Verbindung zur Datenbank steht.
Fehler im allgemeinen Validator an ein Feld hängen
(attach object errors to a specific field)
Es gibt die Möglichkeit in Extbase Validatoren für Objekte zu definieren. Wenn man also ein Model mit dem Namen „Domain_Model_ObjectModel“ hat, wird falls vorhanden der Validator mit dem Namen „Domain_Validator_ObjectValidator“. Dabei wird nachdem die einzelnen Felder geprüft wurden mit dem angegebenen Validator das komplette Objekt überprüft. So kann man wie in meinem Beispiel feststellen, ob der Titel bereits vergeben worden ist (Unique). Normalweise wird die Fehlermeldung bei einer nicht erfolgreichen Validierung an das Objekt drangehängt. Da ich die Fehlermeldungen neben dem Feld ausgebe (siehe dazu Fehlermeldung mit Fluid direkt neben dem Feld ausgeben), wollte ich den Fehler an das Attribut title dranhängen.
class Tx_MyExtension_Domain_Validator_ObjectValidator extends Tx_Extbase_Validation_Validator_AbstractValidator { /** * Check if there is a object with the same name * @param Tx_MyExtension_Domain_Model_Object $object * @return bool */ public function isValid($object) { $objectRepository = t3lib_div::makeInstance('Tx_MyExtension_Domain_Repository_ObjectRepository'); $sameNameCount = $objectRepository->countByTitleExcludeUid($object->getTitle(), $object->getUid()); if($sameNameCount > 0) { if (!isset($this->errors['title'])) { $this->errors['title'] = new Tx_Extbase_Validation_PropertyError('title'); } $error = new Tx_Extbase_Validation_Error(Tx_Extbase_Utility_Localization::translate('error.object_title_exists', 'MyExtension'), '1312448731'); $this->errors['title']->addErrors(array($error)); return FALSE; } return TRUE; } }
Fluid If-Condition und String-Vergleich
Leider kann der Fluid-ViewHelper keine Strings vergleichen. Ich habe ein wenig recherchiert und Lösungen gefunden.
Die erste ist ein eigener View Helper, der in der Lage ist, zwei Objekte (Strings z.B.) zu vergleichen.
<?php class Tx_MyExt_ViewHelpers_CompareViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { /** * Returns true if $a and $b are type-equal, false otherwise. * * @param mixed $a * @param mixed $b * @return boolean */ public function render($a, $b) { return $a === $b; } } ?>
Dann soll es laut dem Eintrag so funktionieren:
<f:if condition="{myext:compare(a: 'foo', b: 'bar')}"> <f:then>...</f:then> <f:else>...</f:else> </f:if>
Leider hat es bei mir nicht funktioniert.
Aber der Vorschlag zwei hat hingegen funktioniert. Es wird mit Fluid ein Alias für den zu vergleichenden String defininiert und dann verglichen:
<f:alias map="{foobar: 'myString'}"> <f:if condition="{object.property} == {foobar}"><!-- do something --></f:if> </f:alias>
Tab-Menü im eigenen Modul verwenden
TYPO3 nutzt im BackEnd in in der letzten Version Tabs. Ich wollte diese Tabs in einem mit Extbase geschriebenen Modul nutzen. Das ist eigentlich nicht so schwer und funktioniert wunderbar.
Zunächst braucht man das tabmenu-Script, man kann es mit einem Hook ins Template einfügen. Den Extensionnamen habe ich immer durch xxx ersetzt.
ext_localconf.php
/* * Hook um eigenes JavaScript im BE hinzuzufügen */ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['preHeaderRenderHook'][] = t3lib_extMgm::extPath('xxx').'Resources/Private/Backend/Scripts/class.tx_xxx_templatehook.php:tx_xxx_templatehook->addBackendJavaScript';
Dann eine Klasse im Verzeichnis oben anlegen und Script mit einem Hook hinzufügen
class tx_xxx_templatehook { public function addBackendJavaScript(&$aParams, $oTemplate) { // ajax calls $oTemplate->getPageRenderer()->addJsFile('js/tabmenu.js'); } }
Im Template braucht man nur die entsprechenden Container anzulegen:
<div class="typo3-dyntabmenu-tabs"> <table class="typo3-dyntabmenu" cellspacing="0" cellpadding="0" border="0"> <tr> <td class="tab" id="DTM-xxx-1-MENU" nowrap="nowrap" onmouseover="DTM_mouseOver(this);" onmouseout="DTM_mouseOut(this);"> <a href="#" onclick="this.blur(); DTM_activate("DTM-xxx","1", 0); return false;">Tab Name</a> </td> <td class="tab" id="DTM-xxx-2-MENU" nowrap="nowrap" onmouseover="DTM_mouseOver(this);" onmouseout="DTM_mouseOut(this);"> <a href="#" onclick="this.blur(); DTM_activate("DTM-xxx","2", 0); return false;">Tab Name</a> </td> </tr> </table> </div> <div class="typo3-dyntabmenu-divs"> <div style="display: none; padding: 10px;" id="DTM-xxx-1-DIV" class="c-tablayer"> Tab Inhalt </div> <div style="display: none; padding: 10px;" id="DTM-xxx-2-DIV" class="c-tablayer"> Tab Inhalt </div> </div> <!-- Initialization JavaScript for the menu --> <script type="text/javascript"> DTM_array["DTM-xxx"] = new Array(); DTM_array["DTM-xxx"][0] = "DTM-xxx-1"; DTM_array["DTM-xxx"][1] = "DTM-xxx-2"; DTM_activate("DTM-xxx", top.DTM_currentTabs["DTM-xxx"]?top.DTM_currentTabs["DTM-xxx"]:1, 0); </script>
Extbase Fluid Tipps zur Fehlersuche
Ich entwickele nun schon ein wenig länger Extbase und Fluid Extensions bzw. Module. Bei jedem Fehler, der einem unterwegs begeget, lernt man ein wenig dazu und daher wollte ich mal ein paar Tipps geben.
Die Grundlage einer Extension kann man wunderbar mit dem Extension Builder anlegen. Er erstellt alles, was man braucht – Controller, Repositories, Models. Ist zwar nicht immer so, wie ich es brauche, aber schon eine sehr gute Grundlage. Allerdings kann es sein, dass man nicht alle Felder von Anfang an anlegen kann, da man sie nicht alle kennt. Dann fügt man neue Felder hinzu, und plötzlich funktioniert es nicht mehr – Fehler in der Liste oder beim Bearbeiten und Speichern.
Als erstes sollte man prüfen, ob die TCA-Definition korrekt ist. Das geht am besten darüber, dass man über die gewöhnliche Listenansicht im TYPO3-BackEnd sich die Elemente anschaut. Wenn alle Felder angezeigt werden, evtl. Relationen dargestellt werden, dann ist das TCA wohl korrekt.
Ich hatte nach dem Hinzufügen von Feldern einen ziemlich miesen Fehler. Das Formular zum Bearbeiten wurde angezeigt, nach dem Klick auf den Speichern-Button kam allerdings eine Fehlermeldung, die mir nicht unbedingt weitergeholten hat: „The value must be of type „Tx_XXX_Domain_Model_XXX“, but was of type „NULL“. “ Der Exception-Stack ist auch keine große Hilfe. Die Ursache: Ich hatte das Feld bereits im Formular angelegt, hatte es aber noch nicht im Model. d.h. wenn mal so ein Fehler auftaucht, dann prüfen, ob die Felder 1) im TCA drin sind, 2) im Model mit Getter und Setter Methoden komplett definiert sind und 3) im Formular genauso heissen.
ImageMagick Konfiguration auf Webspace bei 1und1
Bei 1und1 ist auf dem Webspace die ImageMagick-Version 6.2.4. installiert. Zum Glück ist TYPO3 sehr schlau und zeigt im Install Tool gleich den Pfad an. Das einzige, was tricky ist, ist die Konfiguration. Dabei muss die im_negate_mask auf 0 und die im_imvMaskState auf 1 gesetzt werden und das hab ich durch ausprobieren rausgefunden.
$TYPO3_CONF_VARS['GFX']['im_negate_mask'] = '0'; // Modified or inserted by TYPO3 Install Tool. $TYPO3_CONF_VARS['GFX']['im_imvMaskState'] = '1'; // Modified or inserted by TYPO3 Install Tool.
Dabei bin ich auf diesen Satz im Install-Tool gestoßen:
Boolean: If set, the ‚im_negate_mask‘ state is inverted. This is very useful with newer versions of IM5 (at least 5.4.3+) where the ‚im_version_5‘ setting will set ‚im_negate_mask‘ which will eventually be wrong… Halleluja for ImageMagick – have I ever regreted using that package…
Neueste Kommentare