TCA für RTE und link wizards in 7.6

Der Code für ein RTE-Feld in einer eigenen Extension hat sich mit der Version 7.6 geändert. Die Syntax von TCA wizards hat sich geändert, das betrifft vor allem RTE und Typolinks.

Fehlermeldung:

The way registering a wizard in TCA has changed in 6.2 and was removed in CMS 7. Please set module[name]=module_name instead of using script=path/to/script.php in your TCA.

Alter Code für RTE (bis 6.2):

'wizards' => array(
   'RTE' => array(
      'icon' => 'wizard_rte2.gif',
      'notNewRecords'=> 1,
      'RTEonly' => 1,
      'script' => 'wizard_rte.php',
      'title' => 'LLL:EXT:cms/locallang_ttc.xlf:bodytext.W.RTE',
      'type' => 'script'
   )
)

Neuer Code für RTE wizard:

'wizards' => array(
    '_PADDING' => 2,
    'RTE' => array(
        'notNewRecords' => 1,
        'RTEonly' => 1,
        'type' => 'script',
        'title' => 'Full screen Rich Text Editing',
        'icon' => 'wizard_rte2.gif',
        'module' => array(
            'name' => 'wizard_rte',
        ),
    ),
),

Alter Code für Links (bis 6.2):

"wizards"  => array(
     "_PADDING" => 2,
     "link"     => array(
        "type"         => "popup",
        "title"        => "Link",
        "icon"         => "link_popup.gif",
        "script"       => "browse_links.php?mode=wizard",
        "JSopenParams" => "height=300,width=500,status=0,menubar=0,scrollbars=1"
     )
),

Neuer Code für Link wizard:

'wizards' => array(
   '_PADDING' => 2,
   'link' => array(
      'type' => 'popup',
      'title' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header_link_formlabel',
      'icon' => 'actions-wizard-link',
      'module' => array(
          'name' => 'wizard_link',
      ),
      'JSopenParams' => 'height=300,width=500,status=0,menubar=0,scrollbars=1'
   ),
),
'softref' => 'typolink'

userFunc Tutorial 7.6

Mit UserFunc kann man PHP Code per TypoScript einbinden. Doch je nach Version werden UserFuncs anders eingebunden:

Geänderte userFunc Syntax

Die alten Namens-Konventionen (muss mit „user“ beginnen) entfallen.

Ab 7.4 hat sich die include Syntax geändert, config.includeLibrary und config.includeLibs wurden entfernt. Userfuncs müssen ab TYPO3 7.4 folgendermaßen eingebunden werden:

page.20 = USER_INT
page.20 {
  userFunc = user_printTime
  includeLibs = fileadmin/example_time.php
}

Einfache Extension für die userFunc

Empfohlen wird aber, die benötigten Klassen über eine Extension einzubinden und das Autoload-Verhalten mit Namepaces auszunutzen. Dafür ist minimal nötig (Beispiel – danke dafür an Peter Linzenkirchner):

Ein Ordner in typo3conf/ext/ mit diesem Inhalt:

  • typo3conf/ext/myincludes
  • typo3conf/ext/myincludes/Classes/
  • typo3conf/ext/myincludes/Classes/Example.php
  • typo3conf/ext/myincludes/ext_emconf.php
  • typo3conf/ext/myincludes/ext_icon.gif

Der Inhalt der ext_emconf.php:

<?php
$EM_CONF[$_EXTKEY] = array(
    'title' => 'Include all my Classes',
    'description' => 'Einbinden der Klassen für userFunc',
    'category' => 'fe',
    'author' => 'my Name',
    'author_email' => 'my Email',
    'state' => 'alpha',
    'author_company' => 'my Company',
    'version' => '0.0.1',
    'constraints' => array(
        'depends' => array(
        ),
        'conflicts' => array(
        ),
        'suggests' => array(
        ),
    ),
);

Der Inhalt der Example.php:

<?php 
namespace Myvendor\Myincludes;
class Example {
    public function myExampleFunction($content, $conf) {
        $color = $conf['userFunc.']['color'];
        return '<p style="color:' . $color. ';">Dynamic time: ' . date('H:i:s') . '</p><br />';
    }
}

Und der Aufruf im TS:

page.30 = USER_INT
page.30 {
  userFunc = Myvendor\Myincludes\Example->myExampleFunction
  userFunc.color = #ff0000
}

ExtBase Extension mit userFunc Action

Oft hat man bereits eine Extbase Extension und will eine bestimmte Action als userFunc aufrufen. Das geht so:

10 = USER_INT
10 {
    userFunc       = TYPO3\CMS\Extbase\Core\Bootstrap->run
    vendorName     = MyVendor\Myincludes
    extensionName  = MyExtension
    pluginName     = Pi1
    switchableControllerActions {
        Example {
            1 = myUserFunc
        }
    }
}

Und das ist der zugehörige Controller. Der Eintrag in switchableControllerActions ist nötig, da sonst die default listAction aufgerufen wird:

<?php
namespace MyVendor\MyExtension\Controller;

class ExampleController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
    public function listAction() {
        ...
    }
    
    public function myUserFuncAction() {
        return '<p style="color: red;">Dynamic time: ' . date('H:i:s') . '</p><br />';
    }

}

Weitere Infos zu der ExtBase Variante findet man hier: http://blog.teamgeist-medien.de/2014/03/typo3-eine-extbase-extension-per-typoscript-einbinden.html