Extbase Extensions - Snippets und Glossar: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 81: Zeile 81:
 
# Action registrieren (localconf.php)
 
# Action registrieren (localconf.php)
 
# Methode für die Action schreiben (im Controller des Objektes)
 
# Methode für die Action schreiben (im Controller des Objektes)
# Auf gewünschten View weiterleiten
+
# Auf gewünschten View weiterleiten (z.B. ''$this->redirect('list');'' )
  
 
=== Auf Daten andererer Modelle / Repositorys im Controller zugreifen. (verknüpfte Daten auflisten) ===
 
=== Auf Daten andererer Modelle / Repositorys im Controller zugreifen. (verknüpfte Daten auflisten) ===

Version vom 2. März 2015, 12:27 Uhr

Hinweis neue Namespace Regelung für Klassen

Extbase Änderungen ab TYPO3 V6

Glossar

Extbase

ist ein MVC Framework für die Extension entwicklung in TYPO3

FLOW3

- ist ein PHP-Framework, welches TYPO3 Version 5 verwenden wird.

Fluid

- Template Engine ähnlich wie Smarty ab Version 5

Namespace

Im Model hinterlegt z.B. : namespace TripMaps\Slidercalc\Domain\Model; taucht in vielen Funktionen wieder auf.

Snippets Links

http://typo3.org/documentation/snippets/

Objekt-Abfragen steuern

Das Ergebnis der findAll() Funktion im Controller läßt sich mit dem QueryInterface steuern. Z.B. kann man im Repository die Standardsortierung festlegen. Extbase - Sortierung und Abfrage von Objekten

TypoScript Konfiguration im Controller nutzen

Hinweis zu Settings in TypoScript

Im Action Controller und im Fluid Template sind nur die Objekte über $this->settings bzw. settings.objektname sichtbar die in plugin.tx_extname.settings liegen.

TypoScript

plugin.tx_some-extname.settings {
    myXsetting = XXXX
}

PHP

$valX = $this->settings['myXsetting'];

E-Mails mit Extbase

http://t3-developer.com/extbase-fluid/extensions-erweitern/e-mail-versand-aus-extensions/mailversand/

http://www.benny-vs-web.de/typo3/extbase-fluid-zum-rendern-von-e-mail-templates-verwenden/

Lokalisierung - Language Files

Im Extbase Controller lokalisieren

Z.B. bei Fehlermeldungen. flashMessages oder speziellen Ausgaben

Tx_Extbase_Utility_Localization::translate($langkey,$extensionName)

$extensionName = Extbase name (UpperCammelCase ohen Unterstriche)

$langkey muss der locallang.xml datei bzw. xlf hinzugefügen.

<label index="tx_t3easyplugins_domain_model_plugin.createdSuccessful">Your new Plugin was created.</label>

Unten ein kleines Beispiel. Tx_Extbase_Utility_Localization::translate

/**
 * action create
 *
 * @param $newEntry
 * @return void
 */
public function createAction(Tx_T3easyPlugins_Domain_Model_Plugin $newEntry) {
    $this->entryRepository->add($newEntry);
    $this->flashMessageContainer->add(Tx_Extbase_Utility_Localization::translate('tx_t3easyplugins_domain_model_Plugin.createdSuccessful', 'T3easyPlugins'));
    $this->redirect('list');
}

locallang.xml

...
<label index="tx_t3easyplugins_domain_model_plugin.createdSuccessful">Your new Plugin was created.</label>
...

Actions

Controller und Actions Basics

http://docs.typo3.org/typo3cms/ExtbaseFluidBook/7-Controllers/1-Creating-Controllers-and-Actions.html

Neue Action realisieren

  1. Action registrieren (localconf.php)
  2. Methode für die Action schreiben (im Controller des Objektes)
  3. Auf gewünschten View weiterleiten (z.B. $this->redirect('list'); )

Auf Daten andererer Modelle / Repositorys im Controller zugreifen. (verknüpfte Daten auflisten)

Im Controller steht wegen der strikten Trennung der Modelle erstmal das Repository (Die Datenstruktur) des Models zur Verfügung. Die verknüpften Daten (hier im Beispiels die Genres, gibt der View zwar über die Verknüpfung aus, das sind aber nur die mit dem jeweiligen Datensatz verknüpften Daten. Z.B. die Genres einer Band. Will man z.B. alle Genres im Listview der Bands ausgeben braucht man ein Repository der Genres und muß den Genre Controller in den Band Controller injecten. Dann kann man auf alle Funktionen des Genre Controllers auch aus dem Band Controller zugreifen. So bleibt auch alles sauber getrennt.

  • eigenes Repository für verknüpfte Daten erstellen (z.B. Genre)
	/**
	 * genreRepository
	 *
	 * @var \Geobit\Gbbandpass\Domain\Repository\GenreRepository
	 * @inject
	 */
	protected $genreRepository = NULL;
  • in gewünschten Controller (Hauptcontroller) injecten dazu innerhalb der Klasse folgendes hinzufügen:

You can inject every repository of every installed extbase extension. Just add the dependency injection code to your controller. Depending on your TYPO3 version ist either:

TYPO3 >= 6.0:

/**
 * @var \Vendor\Extension\Domain\Repository\SomeRepository
 * @inject
 */
protected $someRepository;
'''TYPO3 = 4.7:'''
<pre>
/**
 * @var Tx_MyExtension_Domain_Repository_SomeRepository
 * @inject
 */
 protected $someRepository;

TYPO3 < 4.7

/**
 * @var Tx_MyExtension_Domain_Repository_SomeRepository
 */
 protected $someRepository;

/**
 * Inject SomeRepository
 * @param Tx_MyExtension_Domain_Repository_SomeRepository $someRepository
 * @return void
 */
public function injectSomeRepository(Tx_MyExtension_Domain_Repository_SomeRepository $someRepository) {
  $this->someRepository = $someRepository;
}

Jetzt kann man $this->someRepository mit all seinen Methoden auch in diesem Controller nutzen.

Hinweis: Nach Änderung System Cache löschen !

Controller-Action Kombinationen für Frontend-Plugins definieren

http://docs.typo3.org/typo3cms/ExtbaseFluidBook/b-ExtbaseReference/Index.html

In ext_localconf.php sind erlaubte Actions hinterlegt. Der erste Eintrag ist die Default-Action.

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'Geobit.' . $_EXTKEY,
	'Mailformtest',
	array(
		'Mailform' => 'list, show, new, create',
		
	),
	// non-cacheable actions
	array(
		'Mailform' => 'create, ',
		
	)
);

Zu diesem Beispiel gehört der Controller unter

Classes/Controller/MailformController.php

Diverse

Actions anlegen

Im Controller:

/**
 * action list
 *
 * @return void
 */
public function listAction() {
	$myextname = $this->myextRepository->findAll();
	$this->view->assign('myextname', $myextname);
}

addFlashMessage

Im Controller

 $this->addFlashMessage('This is a simple success message');
 $this->addFlashMessage('The message body', 'Message title', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK, TRUE);
 $this->addFlashMessage('<strong>HTML-Messageplement</strong>', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR);

Default Sortierung in Extbase

Quelle: http://t3n.de/magazin/zehn-tipps-tricks-extbase-fluid-227639/2/ (11/2014)

Default-Sortierung im Repository

Nicht unbedingt unbekannt, aber weitestgehend ungenutzt ist ein Feature, welches in Extbase 1.3 hinzugekommen ist: Im Repository besteht die Möglichkeit, das Ergebnis nach bestimmten Feldern aufsteigend oder absteigend zu sortieren. Dies wird beispielsweise mittels „

$query->setOrderings(array('name' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));

erledigt.

Um dies nicht für jede einzelne Repository-Funktion einstellen zu müssen, gibt es die Eigenschaft defaultOrderings:

Im Repository

protected $defaultOrderings = array ('name' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);

Debugging

Debugging im Controller

Beispiel

print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( $this );

Beispiel

t3lib_utility_Debug::debug($var, 'Debug: ' . __FILE__ . ' in Line: ' . __LINE__);
 
# namespaces
\TYPO3\CMS\Core\Utility\DebugUtility::debug($var, 'Debug: ' . __FILE__ . ' in Line: ' . __LINE__);

Beispiel

Tx_Extbase_Utility_Debugger::var_dump($var);
 
# namespaces
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($var);

Zugriff auf TypoScript

https://typo3.org/api/typo3cms/class_t_y_p_o3_1_1_c_m_s_1_1_extbase_1_1_configuration_1_1_configuration_manager.html#ac6b6323862565409eddac516dca08c10

getConfiguration	(
 	$configurationType,
 	$extensionName = NULL,
 	$pluginName = NULL 
)	

AJAX mit Extbase

AJAX über neuen Page Type

Quelle: http://t3-developer.com/extbase-fluid/extensions-erweitern/ajax-in-extensions/ajaxcalls-mit-pagetype/ (2014/12)

Die Verwendung eines eigenen page Types für Ajax Calls ist relativ simpel. Zunächst müsst ihr euer Extensionsetup um einen neuen PageType erweitern. Die PageType Nummer muss einmalig in der Installation sein, also ggf. bereits vergebene PageTypes für RSS, Sitemaps, Print & Co beachten.

= Extensionsetup

Bitte beachtet das ihr in der letzten Zeile eure den Extensionnamen ohne 'tx_' Prefix angeben müsst!

TypoScript

ajaxCall = PAGE 
ajaxCall { 
typeNum = 999 
     config.disableAllHeaderCode = 1 
     config.metaCharset = UTF-8 
    10 = COA 
    10 < tt_content.list.20.myextension_myplugin 
 }

Der AjaxCall in jQuery

$('#jq-send').click(function(e) { 
    $.ajax({ 
        var controller = tx_myExt_myplugin[controller]= blabla; 
        var action = tx_myExt_myplugin[action]= meineControllerFunction; // ohne Action am Ende 
        var pagetype = 999;
        var path = $(location).attr('href');

        url: path +  '/?' + controller + '&' + action + '&type=' + pagetype 
        //optionale Parameter 
        data: 'useruid=' + useruid, 

        success: function(result) { 
            console.log(result); 
            //hier kommen eure Anweisungen rein
        }, 
        error: function(error) { 
            console.log(error); 
        } 
    }); 
});

Ein Beispiel findet ihr auch in meiner Blogextension "multiblog" auf Github: ajaxCall in Blogextension

Ajax Function im Controller

Die Controllerfunction muss natürlich wie jede Action in der ext_localconf.php registriert sein. Innerhalb dieser Action steht euch die ganz normale Extbase Umgebung zur Verfügung, also alles das was ihr in 'normalen' Funktionen auch habt (injected Repositories, mapped Tables, settings etc.) Genau das ist der Unterschied zu einem AjaxCall über eID, das komplette TSFE ist geladen.

Am Ende der Funktion müsst Ihr euch nur entscheiden, was Ihr zurückgeben wollt:

Rückgabe eine json strings (z.B. Ergebnisarray):

return json_encode($myArray);

Rückgabe eines kompletten Views als html string. Am Ende der Ajax Funktion im Controller setzt Ihr ganz normal euren View (Template muss vorhanden sein):

$this->view->assign('myAjaxAction, $values);

Keinerlei Rückgabe z.B wenn Ihr nur Daten nur für einen Counter speichert:

exit;

Innerhalb von der jQuery Funktion success:function(result) { } wird dann das Ergebnis ausgewertet. Die vom Controller zurückgegebenen Werte stehen in der Variablen result zur Verfügung.

AJAX Call über eid Mechanismus

Quelle: http://t3-developer.com/extbase-fluid/extensions-erweitern/ajax-in-extensions/ajax-dispatcher-eid-in-typo3-61/ (2014/12)

Ajax Dispatcher für TYPO3 6.2 - wichtige Hinweise!

Damit das nachfolgende Script auch unter TYPO3 6.2.3 funktioniert, müssen folgende Zeilen geändert werden:

Zeile 101:

\TYPO3\CMS\Core\Core\Bootstrap::getInstance();

Siehe auch forge.typo3.org/issues/59070.

Ajax Dispaytcher für TYPO3 6.1 und Namespaces. Die Datei ist getestet und läuft auch ;). Ihr müsst in Zeile 82 + 83 den von Euch benutzen Vendor und Extension Namen einsetzten.

Siehe auch alle weiteren Angaben im Kommentarbereich des Dispatchers.

<?php
/** *************************************************************
*
* Extbase Dispatcher for Ajax Calls TYPO3 6.1 namespaces
*
* IMPORTANT Use this script only in Extensions with namespaces
*
* Klaus Heuer <klaus.heuer@t3-developer.com>
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
* ************************************************************* */
/** ************************************************************
* Usage of this script:
*
* - Copy this script in your Extension Dir in the Folder Classes
* - Set the Vendor and Extension Name in Line 82 + 83
* - Include the next line in the ext_localconf.php, change the ext name!
* - $TYPO3_CONF_VARS['FE']['eID_include']['ajaxDispatcher'] = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('myExtension').'Classes/EidDispatcher.php';
*
* Use for Ajax Calls in your jQuery Code:
*
* $('.jqAjax').click(function(e) {
* var uid = $(this).find('.uid').html();
* var storagePid = '11';
*
* $.ajax({
* async: 'true',
* url: 'index.php',
* type: 'POST',
*
* data: {
*     eID: "ajaxDispatcher",
*     request: {
*          pluginName: 'patsystem',
*          controller: 'Todo',
*          action: 'findTodoByAjax',
*          arguments: {
*               'uid': uid,
*               'storagePid': storagePid
*               }
*           }
*      },
*      dataType: "json",
*
*      success: function(result) {
*           console.log(result);
*      },
*      error: function(error) {
*           console.log(error);
*      }
* });
*************************************************************** */
/**
* Gets the Ajax Call Parameters
*/
$ajax = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('request');
/**
* Set Vendor and Extension Name
*
* Vendor Name like your Vendor Name in namespaces
* ExtensionName in upperCamelCase
*/
$ajax['vendor'] = 'T3Developer';
$ajax['extensionName'] = 'ProjectsAndTasks';
/**
* @var $TSFE \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
*/
$TSFE = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController', $TYPO3_CONF_VARS, 0, 0);
\TYPO3\CMS\Frontend\Utility\EidUtility::initLanguage();
// Get FE User Information
$TSFE->initFEuser();
// Important: no Cache for Ajax stuff
$TSFE->set_no_cache();
//$TSFE->checkAlternativCoreMethods();
$TSFE->checkAlternativeIdMethods();
$TSFE->determineId();
$TSFE->initTemplate();
$TSFE->getConfigArray();
\TYPO3\CMS\Core\Core\Bootstrap::getInstance()->loadConfigurationAndInitialize();
$TSFE->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');
$TSFE->settingLanguage();
$TSFE->settingLocale();
/**
* Initialize Database
*/
\TYPO3\CMS\Frontend\Utility\EidUtility::connectDB();
/**
* @var $objectManager \TYPO3\CMS\Extbase\Object\ObjectManager
*/
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
/**
* Initialize Extbase bootstap
*/
$bootstrapConf['extensionName'] = $ajax['extensionName'];
$bootstrapConf['pluginName'] = $ajax['pluginName'];
$bootstrap = new TYPO3\CMS\Extbase\Core\Bootstrap();
$bootstrap->initialize($bootstrapConf);
$bootstrap->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tslib_cObj');
/**
* Build the request
*/
$request = $objectManager->get('TYPO3\CMS\Extbase\Mvc\Request');
$request->setControllerVendorName($ajax['vendor']);
$request->setcontrollerExtensionName($ajax['extensionName']);
$request->setPluginName($ajax['pluginName']);
$request->setControllerName($ajax['controller']);
$request->setControllerActionName($ajax['action']);
$request->setArguments($ajax['arguments']);
$response = $objectManager->create('TYPO3\CMS\Extbase\Mvc\ResponseInterface');
$dispatcher = $objectManager->get('TYPO3\CMS\Extbase\Mvc\Dispatcher');
$dispatcher->dispatch($request, $response);
echo $response->getContent();
//die();
?>