Thursday, August 28, 2014

Wie erzeuge ich in einer ExtBase Extension einen Link auf eine Seite/Seiten-ID?


Im Controller:

$puid = 123; // uid zielseite
$url = $this->controllerContext->getUriBuilder()->reset()->setTargetPageUid($puid)->buildFrontendUri();

oder auch:

$puid = 123; // uid zielseite
$url = $this->controllerContext()->getUriBuilder()->reset()->setArguments(array('myparam' => '456'))->setTargetPageUid($puid)->setCreateAbsoluteUri(true)->buildFrontendUri();


(Frage: gibt es nicht einfachere Moeglichkeiten, z.b. via typolink() od. linkData()?) 

Wednesday, August 6, 2014

Ein gutes Beispiel fuer eine ExtBase Extension mit bidirektionaler Datenbank-Beziehung


https://lbrmedia.net/codebase/Eintrag/extbase-bidirektionale-mm-relation/

Wednesday, July 23, 2014

Wie kann ich das TYPO3 Protokoll / Sys-Log fuer eigene Ausgabe/Meldungen nutzen?


(TYPO3 6.x)
NICHT GETESTET!

mit dem Funktionsaufruf:
\TYPO3\CMS\Core\Utility\GeneralUtility::sysLog('[write message in English here]', 'extension_key', 'severity'); 
 

definiert in typo3/sysext/core/Classes/Utility/GeneralUtility.php

Am Anfang der Datei stehen die Konstanten die man fuer 'severity' einsetzen kann (soll?)

z.b. SYSLOG_SEVERITY_INFO (das duerfte der default sein) oder SYSLOG_SEVERITY_WARNING etc.

Friday, June 13, 2014

Warum kann ich mich ins TYPO3-Backend nicht mehr einloggen?


1. falscher Login/Passwort ;-)


2. Speicherplatz voll

   -> Webspace und Datebank ueberpruefen


3. Session kann nicht geschrieben werden

   -> PHP-Session-Pfad ueberpruefen, ggf. Verzeichnis anlegen, ggf. Zugriffsrechte fuer Webserver setzen (chown/chmod)


4. lockIP (TYPO3-Konfiguration) verhindert Login

   -> falls sich waehrend der Session die IP des Benutzers geaendert hat, verhindert die Einstellung evtl. den Login. Browser wechseln (startet neue Session), oder via Install-Tool "lockIP" Einstellung ueberpruefen/anpassen.


Tipp:
Per mysql-shell-Client in die TYPO3-Datenbank einloggen, und dort das TYPO3-Log ansehen, das kann Aufschluss darueber geben welcher Fehler vorliegt:

select * from sys_log order by tstamp desc limit 10;

...zeigt die 10 letzten Log-Eintraege

Thursday, June 12, 2014

Wie kann ich neue Klassen/Typen von Links im RTE hinzufuegen?


Das hier koennte helfen:

http://www.typo3.net/forum/thematik/zeige/thema/55280/?tx_mmforum_pi1[showForm]=0&cHash=bba46f5ddf25406044a78253196a7aea

Wednesday, June 11, 2014

Warum werden meine Bilder in der Extension tx_news nicht skaliert / gecroppt?


Wenn die TypoScript-Konfiguration in etwa so aussieht...

plugin.tx_news.settings.list.media.image.maxWidth = 100c
plugin.tx_news.settings.list.media.image.maxHeight = 100c

...dann koennte der Fehler evtl. darin bestehen dass "...c" (das c am Ende fuer croppen) nicht kombiniert werden kann - entweder Hoehe ODER Breite croppen, nicht beides.

Hier auch ein Forumsbeitrag zum Thema:
http://www.typo3.net/forum/thematik/zeige/thema/117141/

Thursday, May 8, 2014

Wie kann ich die Sortierung von Datensaetzen in einem ExtBase-Repository beeinflussen?

Eine default/Standard-Sortierung kann folgendermassen gesetzt werden:

Im Deklarations-Bereich eines Repositories (.../Classes/Domain/Repository/...) diese Variable setzen, hier z.b. fuer die Sortierung ueber das Feld "sorting" (wie im TYPO3-Backend):

protected $defaultOrderings = array("sorting"=> Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING);

bzw. in Namespace-Schreibweise

protected $defaultOrderings = array("sorting"=>
\TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING);


Auch mehrere Sortierungen sind moeglich:

protected $defaultOrderings = array( 
    "title"=> \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
    "name"=> \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
);


Im Programmcode kann die Sortierung auch naetraeglich geaendert werden:

$query->setOrderings(
    "title"=> \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
    "name"=> \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
);

Eine Menge hilfreiche Code-Schnipsel fuer TYPO3 finden sich auf der Seite von in2code


http://www.in2code.de/community/snippet-datenbank/snippets/liste/?tx_in2snippets_pi1[controller]=Snippet

Tuesday, April 15, 2014

Wie kann man felogin in TYPO3 6.1 um eine XCLASS erweitern? / Wie nutzt man hooks in TYPO3 6.1?

Wie kann man felogin in TYPO3 6.1 um eine XCLASS erweitern?

In der Theorie ist das hier beschrieben:

http://docs.typo3.org/TYPO3/CoreApiReference/ApiOverview/Xclasses/Index.html

In der Praxis ist es mir aber noch nicht gelungen.



Wie nutzt man hooks in TYPO3 6.1?

Ein kurzes Tutorial findet sich z. B. unter:

http://www.schmutt.de/456/hook-mit-extbase-implementieren/comment-page-1/

Verfuegbare hooks findet man idealerweise in der Dokumentation (z.b. einer Extension). Fall nicht, kann man den Programmcode z.b. nach dem Begriff "hook" durchsuchen.

Die Extension "felogin" bietet z.b. einen hook namens "postProcContent" an, womit sich der gesamte von der Extension erzeugte HTML-Code nachbearbeiten laesst. (Damit lassen sich evtl. XCLASS Implementierungen umgehen. XCLASSes sind nur sehr bedingt empfehlenswert - siehe die entspr. Dokumentationen.)

Thursday, April 3, 2014

Wie kann ich eine TypoScript-Constants Datei ohne die TYPO3-Frontend-Umgebung benutzen/lesen/parsen/auswerten?


Eine grundlegende Beschreibung zum parsen von TypoScript-Dateien befindet sich hier:
http://docs.typo3.org/typo3cms/TyposcriptSyntaxReference/TypoScriptParserApi/Index.html

Diese wendet sich aber an (Core-)Extension-Entwickler, die z.b. TypoScript-Erweiterungen implementieren moechten.

Falls man die bestehenden TypoScript-Moeglichkeiten, d.h. das bestehende Framework nutzen moechte, wird etwas mehr benoetigt.

Hier ein gekuerztes Beispiel, das aus folgender Situation entstanden ist: in einem eigenen PHP-Page-Not-Found-Handler sollen Werte aus einer TypoScript-Constants-Datei verwendet werden. Im Page-Not-Found-Handler stehen die Werte aus $GLOBALS['TSFE'] nur unvollstaendig zur Verfuegung (da ja keine Seite gefunden wurde), und vor allem kein $GLOBALS['TSFE']->tmpl->setup (d.h. ausgewertetes TypoScript-Setup).


require_once(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('core') . 'Classes/Utility/GeneralUtility.php');
require_once(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('core') . 'Classes/TypoScript/Parser/TypoScriptParser.php');
require_once(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/Configuration/TypoScript/ConditionMatching/ConditionMatcher.php');


class myPhpObjectClass {
    function myMethod() {
        // 1. read our typoscript constants file:
        $constants_ts = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/path/to/your/constantsfile.ts');
        // 2. build typoscript parser:
        $TSparserObject = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser');
        // 3. build matchObject for TypoScript conditions to work (ooh, very typo3-ish...):
        $matchObject = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Configuration\TypoScript\ConditionMatching\ConditionMatcher');
        // 4. add to (incomplete, because page-not-found) $GLOBALS['TSFE'], required by our $matchObject
        //    (actually only rootLine required, but we build complete tmpl object, just for the sake of typo3-ness...):
        $GLOBALS['TSFE']->tmpl = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Core\TypoScript\TemplateService');
        $GLOBALS['TSFE']->tmpl->rootLine = $pObj->rootLine;
        // 5. parse typoscript (ooh, again, very typo3-ish: must check include lines... separately...)
        $constants_ts = \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser::checkIncludeLines($constants_ts);
        $TSparserObject->parse($constants_ts, $matchObject);
        // 6. whatever we have parsed is now in $TSparserObject->setup:
        $constants = $TSparserObject->setup;
        // 7. finally, we can grab the values needed! :-)
        $myValue = $constants['myValueFromConstantsfile'];

    }
}

(entwickelt mit TYPO3 6.1.7)

Moegliche Verbesserungen:
- Wie parsed man eine Setup-Datei einschliesslich Konstanten (z.b. {$myConstant})?
- bessere Methode (statt file_get_contents($_SERVER['DOCUMENT_ROOT']...)) zum Einlesen der TypoScript-Datei?

Tuesday, April 1, 2014

Wie kann man den Layout-Schalter eines Content-Elements nutzen?


...im TSConfig Feld einer Seite eingeben:

TCEFORM {
    tt_content {
        layout {

            # neue eintraege hinzufuegen:
            addItems {
                4 = Layout fuer hervorgehobene Elemente
            }

            # mit "altLabels" koennen die bestehenden eintraege veraendert werden:
            altLabels {
                2 = Mein Layout
            }
        }
    }
}


 
...im TypoScript Template Feld "Setup":

lib.layoutSwitchCObject = CASE
lib.layoutSwitchCObject {
    key.field = layout
    4 = TEXT
    4.value = <div id="c{field:uid}" class="csc-default step-by-step-guide">|</div>
    4.insertData = 1
}


# nun ergaenzen wir die ausgabe der content-elemente via styles.content.get
# durch unser cObject (siehe oben)

page = PAGE
page {
    10 < styles.content.get
    10 {
        renderObj {
            stdWrap.innerWrap.cObject < lib.layoutSwitchCObject
        } 
    } 
}


Wednesday, February 26, 2014

Wie kann ich PHP TYPO3-Datenbank-Abfragen debuggen?


(fuer TYPO3 <= 4.7 ?)

Hier ein kurzes Beispiel:

$GLOBALS['TYPO3_DB']->debugOutput = true;
$GLOBALS['TYPO3_DB']->store_lastBuiltQuery = true;
 

$res = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
...

);

echo $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;



Extbase SQL Queries ausgeben

(fuer TYPO3 >= 6.0 ?)
 
Quelle:
http://www.in2code.de/community/snippet-datenbank/snippets/detail/extbase-sql-queries-debuggen/

Extbase SQL Queries werden in der Datei...
typo3\sysext\extbase\Classes\Persistence\Storage\Typo3DbBackend.php

...in der Methode "buildQuery" erstellt. Hier koennen diese ausgegeben werden.
 Um nicht jede Query (gesamter Seitenaufbau) auszugeben kann die gewuenschte Tabelle herausgefiltert werden:

if (in_array("table_name", $sql['tables'])) {
    echo $statement;
}
 

Monday, February 10, 2014

Wie kann man bei Powermail 2.0 das TabMenu (die Seiten-Links/-Buttons) bearbeiten?


Das TabMenu wird via JavaScript in der Datei typo3conf/ext/powermail/Resources/Public/Js/tabs.js erzeugt.

Diese sollte natuerlich nicht direkt veraendert werden, da sie Bestandteil der Powermail-Extension ist (und beim naechsten Update ggf. ueberschrieben wird).

Man kann eine Kopie der Datei aber z.b. am Ende der Seite einbinden - diese ueberschreibt dann (im Webbrowser) die durch Powermail selbst inkludierte Orginal-Datei, wodurch individuelle Anpassungen moeglich werden.

Kopiert man also typo3conf/ext/powermail/Resources/Public/Js/tabs.js z.b. nach fileadmin/js/powermail_custom_tabs.js (und nimmt hier Anpassungen vor), dann koennte man in TypoScript-Setup schreiben:

page.includeJSFooterlibs.powermailCustomTabs = fileadmin/js/powermail_custom_tabs.js

Monday, January 27, 2014

Wie kann ich bei powermail 2.0 andere Templates/Layout/Partials verwenden? / Wie kann ich bei powermail 2.0 unterschiedliche Formulare unterschiedlich behandeln?

Zunaechst gibt es die Moeglichkeit per TypoScript den TemplatesRootPath etc. in TS-Setup zu veraendern:

plugin.tx_powermail {
    view {
        templateRootPath = {$plugin.tx_powermail.view.templateRootPath}
        partialRootPath = {$plugin.tx_powermail.view.partialRootPath}
        layoutRootPath = {$plugin.tx_powermail.view.layoutRootPath}
    }

}

Entsprechende TypoScript-Abfragen nach PIDInRootline, stdWrap.if, etc. nehmen die Unterscheidung vor.

Anschliessend koennen unter den neuen Pfaden die fluid-Templates separat bearbeitet werden.

Dies ist aber wenig elegant, da der komplette Satz an fluid-Templates kopiert, und in ggf. in wechselnden Verzeichnissen und Dateien bearbeitet werden muss.

Ein anderer, zunaechst umstaendlicherer, spaeter aber weit flexiblerer Weg, besteht darin ein TypoScript-Objekt zu erzeugen, und dieses dann direkt in den fluid-Templates abzufragen:

lib.powermail {
    # write back form-id from powermail hidden field to typoscript...
    formid = TEXT
    formid.data = GP:tx_powermail_pi1|form

    # some if's we need below:
    if_is_form_kontakt1 {
        value < lib.powermail.formid
        equals = {$uid.forms.kontaktform1}
    }
    if_is_form_kontakt2 {
        value < lib.powermail.formid
        equals = {$uid.forms.kontaktform2}
    }

    # ...then build some identifier from form-id and current language, for fluid-template selection:
    # (something like: main_kontakt2_de)
    fluidsectionidentifier = COA
    fluidsectionidentifier {
        # some prefix:
        100 = TEXT
        100.value = main

        # if... then... else... - a string for each type of form (compare if's above)
        200 = COA
        200 {
            1 = COA
            1 {
                if < lib.powermail.if_is_form_kontakt1
                10 = TEXT
                10.value = _kontakt1
            }
            2 = COA
            2 {
                if < lib.powermail.if_is_form_kontakt1
                if.negate = 1
                1 = COA
                1 {
                    if < lib.powermail.if_is_form_kontakt2
                    10 = TEXT
                    10.value = _kontakt2
                }
                2 = COA
                2 {
                    if < lib.powermail.if_is_form_kontakt2
                    if.negate = 1
                    10 = TEXT
                    10.value = _default
                }
                  10.value = _default
                }
            }
        }

        # ... add language suffix:
        500 = TEXT
        500.value = _
        600 = TEXT
        600.value < config.language
    }
}


Diese maechtige Konstruktion unterscheidet anhand der verschickten Formular-ID zwischen den Formularen "kontakt1" und "kontakt2" bzw. jedem anderen powermail-Formular ("default") auf der Website, und haengt das Kuerzel der eingestellten Frontend-Sprache an.

Das erzeugte Objekt kann nun im fluid-Template fuer Mails verwendet werden, um unterschiedliche fluid-Sections zu rendern:

in "Layouts/Mail.html":

<f:render section="{f:cObject(typoscriptObjectPath:'lib.powermail.fluidsectionidentifier')}" />

in "Templates/Mails/SenderMail.html" (z.b.):

<f:section name="main_default_de">
...
</f:section>
<f:section name="main_kontakt1_de">
...
</f:section>
<f:section name="main_kontakt2_de">
...
</f:section>



Frage:
Wie kann die Formular-ID in anderen fluid-Templates *VOR* dem Abschicken des Formulars ausgelesen und verwendet werden? Vgl. oben: Verwendung des GET-Parameters wohl nur *NACH* dem Verschicken moeglich.

Antwort:
In Templates/Forms/Form.html stehen die Formulardaten ({form.uid}, {form.css}, etc.) zur Verfuegung. Auch in anderen fluid-Templates (Partials?)

Frage:
Wie koennen die Formulardaten ({form.uid}, {form.css}, etc.) z.b. in
Templates/Mails/SenderMail.html verwendet werden? Vgl. oben, das waere eleganter als der GET-Parameter, man koennte z.b {form.css} verwenden


Friday, January 24, 2014

Wie gibt man ein Feld in der Standard-Sprache aus, waehrend die Seite in einer anderen Sprache angezeigt wird?


Hier ein Beispiel fuer den Titel der darueberliegenden Seite:

fuer TYPO3 v4.7 und hoeher (getestet mit v6.1):
 

10 = TEXT
10.data.orderedStdWrap {

    10.field = pid
    20.wrap = DB:pages:|:title
}



und evtl. auch in vorigen versionen von TYPO3 (nicht getestet, d.h. nur mit v6.1) :
 
10 = TEXT
10.data.stdWrap {

   cObject = TEXT
   cObject.field = pid
   cObject.wrap = DB:pages:|:title
}