Typo3 Extensions entwickeln: Unterschied zwischen den Versionen

Aus Vosp.info
Wechseln zu:Navigation, Suche
 
(36 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
[[typo3]]
 
[[typo3]]
alte Seite: [[Typo3 Extensions entwickeln @deprecated]]
+
* [[Typo3 Extensions entwickeln @deprecated]] mit der alten '''pibase'''-Klasse
 +
 
 +
* 29/03/2018: https://www.clickstorm.de/blog/extbase-objekte-ueberschreiben-erweitern/
 +
* 30/11/2016: https://www.schmutt.de/600/extension-settings-abfragen/
 +
= Allgemein =
 +
 
 +
grundsätzlich wichtig ist zu wissen, das die Namensgebung hier einiges ausmacht und sich vieles nur vom System durch die Namen aufschlüsseln läßt.
 +
* in Eigenschaften von Klassen ($this->eigenschaft) bzw Tabellenspalten keine _Unterstriche_ und Großbuchstaben benutzen
 +
 
 +
* [http://paul-rohrbeck.de/artikel/typo3/typo3-extbase-haeufige-fehler-und-loesungen/ TYPO3, Extbase: Häufige Fehler und Lösungen]
 +
 
 +
= extension_builder =
 +
[[Typo3_Extensions#extension_builder|extension_builder]] installieren und nutzen ;) kann viel Schreibarbeit und Flüchtigkeitsfehler tilgen
 +
 
 +
'''lose Notizen'''
 +
* Vererbung innerhalb des Projekts geht nur in dem mensch die noch nicht fertige Extension abspeichert und installiert, danach wieder das Projekt laden und nun vererben. ... Aber aufpassen mit dem richtigen Klassennamen
 +
** Extend existing model class: Tx_''EXTENSIONNAME''_Domain_Model_''MODELNAME''
 +
 
 +
== Probleme ==
 +
=== #1313855175: The action "new" (controller ..) is not allowed by this plugin. Please check Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information)===
 +
 
 +
* ist der controller und die actino in der ext_localconf.php eingetragen
 +
 
 +
* ist der controller und die action im flexform drinnen
 +
** 'extensionname'/Configuration/FlexForms/flexform_'extensionname'.xml
 +
 
 +
* im zweifel plugin im typo3 backend deaktivieren und neu einbinden, bzw neu konfigurieren
 +
** durch flexform änderungen gehen informationen verloren !!!!
 +
 
 +
===#1316104317: The default controller can not be determined. Please check for Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information) ===
 +
 
 +
#1316104317: The default controller can not be determined. Please check for Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information)
 +
 +
Tx_Extbase_MVC_Exception thrown in file
 +
/var/www/typo3/typo3_src-4.7.7/typo3/sysext/extbase/Classes/MVC/Web/RequestBuilder.php in line 185.
 +
 
 +
 
 +
Das Domain Object ist ein aggregate root Objekt!
 +
* Domain objects setting
 +
** Is aggregate root: aktivieren
  
 
= Hello world Extensions mit extbase und fluid =
 
= Hello world Extensions mit extbase und fluid =
 
* Grundlagen: [[Typo3 Flow]]
 
* Grundlagen: [[Typo3 Flow]]
 
* Vorraussetzung: Installation der Extension: [[typo3_Extensions#extbase|extbase]] und [[typo3_Extensions#fluid|fluid]]
 
* Vorraussetzung: Installation der Extension: [[typo3_Extensions#extbase|extbase]] und [[typo3_Extensions#fluid|fluid]]
 
+
* Extensionname des Beispiels: '''nctestitflow'''
 
== ext_emconf.php ==
 
== ext_emconf.php ==
 
Die grundsätzlichen Informationen für die Extension --- wichtig wären hier die Abhängigkeiten zu den extension extbase und fluid!!
 
Die grundsätzlichen Informationen für die Extension --- wichtig wären hier die Abhängigkeiten zu den extension extbase und fluid!!
Zeile 55: Zeile 94:
 
== ext_localconf.php ==
 
== ext_localconf.php ==
 
Sagen welche Klasse und welche Funktion aufgerufen werden soll!!!!
 
Sagen welche Klasse und welche Funktion aufgerufen werden soll!!!!
 
Achtung:
 
* Schlüssel: '''HelloWorldClass''' führt zur folgenden Namensgebung
 
** Datei in der die Klasse zu finden sein muß: '''Classes/Controller/HelloWorldClassController.php'''
 
** die Klasse muss folgenden Namen besitzen: '''Tx_Nctestitflow_Controller_HelloWorldClassController'''
 
* Wert: '''helloWorldFnc''' führt zur folgenden Namensgebung
 
** die Klasse muss folgende Funktion besitzen: '''public function helloWorldFncAction()'''
 
* Schlüssel und Wert führt zur folgenden Namensgebung
 
** Templatedatei muss folgenden Namen besitzen: '''Resources/Private/Templates/HelloWorldClass/HelloWorldFnc.html'''
 
 
  
 
'''ext_localconf.php'''
 
'''ext_localconf.php'''
Zeile 80: Zeile 109:
 
?>
 
?>
 
</source>
 
</source>
 +
 +
'''Achtung:'''
 +
* Schlüssel: '''HelloWorldClass''' führt zur folgenden Namensgebung
 +
** Datei in der die Klasse zu finden sein muß: ''Classes/Controller/'''HelloWorldClass'''Controller.php''
 +
** die Klasse muss folgenden Namen besitzen: ''Tx_Nctestitflow_Controller_'''HelloWorldClass'''Controller''
 +
* Wert: '''helloWorldFnc''' führt zur folgenden Namensgebung
 +
** die Klasse muss folgende Funktion besitzen: ''public function '''helloWorldFnc'''Action()''
 +
* Schlüssel und Wert führt zur folgenden Namensgebung
 +
** Templatedatei muss folgenden Namen besitzen: ''Resources/Private/Templates/'''HelloWorldClass'''/'''HelloWorldFnc'''.html''
 +
* '''"Die Einstellungen in ext_localconf.php sind unwichtig, sie werden nicht ausgewertet, wenn es eine Flexform mit <switchableControllerActions> gibt."''' [http://typo3.3.n7.nabble.com/Extbase-Problem-mit-switchableUserAction-in-Flexform-td49871.html]
 +
 +
== Classes/Controller/HelloWorldClassController.php ==
 +
 +
'''Achtung:''' Ordner-, Datei-, Klassen- und Funktionsnamen sind durch [[#ext_localconf.php]] vorgeschrieben!!!
 +
 +
'''Classes/Controller/HelloWorldClassController.php'''
 +
 +
<source lang="php">
 +
<?php
 +
class Tx_Nctestitflow_Controller_HelloWorldClassController extends Tx_Extbase_MVC_Controller_ActionController {
 +
public function helloWorldFncAction() {
 +
$this->view->assign('name', 'Vorname Nachname');
 +
}
 +
}
 +
?>
 +
</source>
 +
 +
== Resources/Private/Language/locallang.xml ==
 +
 +
'''Resources/Private/Language/locallang.xml'''
 +
<source lang="xml">
 +
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 +
<T3locallang>
 +
<meta type="array">
 +
<type>module</type>
 +
<description>Language labels for Hello World</description>
 +
</meta>
 +
<data type="array">
 +
<!--  ENGLISH LANGUAGE DATA -->
 +
<languageKey index="default" type="array">
 +
<label index="helloworld">hello world!!!</label>
 +
</languageKey>
 +
 +
<!--  GERMAN LANGUAGE DATA -->
 +
<languageKey index="de" type="array">
 +
<label index="helloworld">Hallo Welt!!!</label>
 +
</languageKey>
 +
</data>
 +
</T3locallang>
 +
</source>
 +
 +
 +
== Resources/Private/Templates/HelloWorldClass/HelloWorldFnc.html ==
 +
 +
'''Achtung:''' Ordner- und Dateinamen sind durch [[#ext_localconf.php]] vorgeschrieben!!!
 +
 +
'''Resources/Private/Templates/HelloWorldClass/HelloWorldFnc.html'''
 +
<source lang="html4strict">
 +
<p>
 +
<f:translate key="helloworld" /></br>
 +
{name}
 +
</p>
 +
</source>
 +
 +
== ext_tables.php ==
 +
 +
hier mit wird die Extension im Backend zur Auswahl eingebunden .... das Plugin registriert!
 +
 +
<source lang="php">
 +
<?php
 +
 +
Tx_Extbase_Utility_Extension::registerPlugin(
 +
    $_EXTKEY,
 +
    'Pi1',
 +
    'meine hello world fluid extbase extension'
 +
);
 +
 +
?>
 +
</source>
 +
 +
=  mm - Relationen zwischen Models =
 +
 +
== Ausgangslage ==
 +
mit dem Extension Builder erstellte verkürzte Klassen und die TCA Konfiguration dazu
 +
 +
[[Datei:ExtensionBuilder_Tag_Date.jpeg]]
 +
 +
=== Tag Klasse ===
 +
'''typo3conf/ext/ncnetz/Classes/Domain/Model/Tag.php'''
 +
<source lang="php">
 +
class Tag extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
 +
/**
 +
* dates
 +
*
 +
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\Ncnetz\Domain\Model\Date>
 +
* @lazy
 +
*/
 +
protected $dates;
 +
 +
public function addDate(\TYPO3\Ncnetz\Domain\Model\Date $date) {
 +
$this->dates->attach($date);
 +
}
 +
public function removeDate(\TYPO3\Ncnetz\Domain\Model\Date $dateToRemove) {
 +
$this->dates->detach($dateToRemove);
 +
}
 +
public function getDates() {
 +
return $this->dates;
 +
}
 +
public function setDates(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $dates) {
 +
$this->dates = $dates;
 +
}
 +
}
 +
</source>
 +
 +
=== Date Klasse ===
 +
'''typo3conf/ext/ncnetz/Classes/Domain/Model/Date.php'''
 +
<source lang="php">
 +
class Date extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
 +
/**
 +
* tags
 +
*
 +
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\Ncnetz\Domain\Model\Tag>
 +
*/
 +
protected $tags;
 +
public function addTag(\TYPO3\Ncnetz\Domain\Model\Tag $tag) {
 +
$this->tags->attach($tag);
 +
}
 +
public function removeTag(\TYPO3\Ncnetz\Domain\Model\Tag $tagToRemove) {
 +
$this->tags->detach($tagToRemove);
 +
}
 +
public function getTags() {
 +
return $this->tags;
 +
}
 +
public function setTags(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $tags) {
 +
$this->tags = $tags;
 +
}
 +
</source>
 +
 +
=== TCA Configuration Date ===
 +
typo3conf/ext/ncnetz/Configuration/TCA/Date.php
 +
<source lang="php">
 +
 +
$TCA['tx_ncnetz_domain_model_date'] = array(
 +
'columns' => array(
 +
'tags' => array(
 +
// ...
 +
'config' => array(
 +
'type' => 'select',
 +
'foreign_table' => 'tx_ncnetz_domain_model_tag',
 +
'MM' => 'tx_ncnetz_date_tag_mm',
 +
// ...
 +
),
 +
),
 +
)
 +
);
 +
</source>
 +
 +
== modifiziertes TCA Configuration Tag ==
 +
 +
folgende relevanten Zeilen müssen modifiziert werden
 +
''''MM' => 'tx_ncnetz_date_tag_mm','''
 +
''''MM_opposite_field' => 'tags', '''
 +
<source lang="php">
 +
$TCA['tx_ncnetz_domain_model_tag'] = array(
 +
'columns' => array(
 +
'dates' => array(
 +
// ...
 +
'config' => array(
 +
'type' => 'select',
 +
'foreign_table' => 'tx_ncnetz_domain_model_date',
 +
// 'MM' => 'tx_ncnetz_tag_date_mm',
 +
'MM' => 'tx_ncnetz_date_tag_mm',
 +
'MM_opposite_field' => 'tags',
 +
// ...
 +
),
 +
),
 +
)
 +
);
 +
</source>
 +
 
= Probleme =
 
= Probleme =
  
Zeile 86: Zeile 295:
  
 
= Quellen =
 
= Quellen =
 +
* [http://www.typo3lexikon.de/typo3-tutorials/extensions/fluid.html deutsches Fluid Tutorial]
 +
* [https://www.mittwald.de/fileadmin/downloads/pdf/dokus/Extbase_Fluid_Dokumentation.pdf ausführliche Extbase_Fluid_Dokumentation.pdf von mittwald]
 +
* [https://svn.typo3.org/TYPO3v4/Extensions/kiddog_news/trunk/Documentation/Semesterarbeit_Juerg_Langhard_V2.odt Extension Beispiel von 2010]
 +
* '''Backend Suche in den eigen entwickelten Extensions'''
 +
** [http://www.typo3-snippets.de/snippets/extension-programmierung/backend-suche-fuer-eigene-extension-aktivieren.html Backend-Suche für eigene Extension aktivieren]
 +
** [http://www.typo3erweiterungen.de/detail/article//backend-suche-ueberarbeitet-in-typo3-46/ 04.01.2012: Backend Suche überarbeitet in TYPO3 4.6]
 +
* '''Relationen''' MM_opposite_field
 +
** [http://blog.undkonsorten.com/datenbankrelationen-typo3-irre-extension]
 +
** [http://typo3.org/documentation/document-library/core-documentation/doc_core_tca/4.5.2/view/1/3/]
 +
** [http://www.noelboss.ch/2011/06/m-to-n-relations-with-extbase-fluid/]

Aktuelle Version vom 12. Januar 2019, 13:33 Uhr

typo3

Allgemein

grundsätzlich wichtig ist zu wissen, das die Namensgebung hier einiges ausmacht und sich vieles nur vom System durch die Namen aufschlüsseln läßt.

  • in Eigenschaften von Klassen ($this->eigenschaft) bzw Tabellenspalten keine _Unterstriche_ und Großbuchstaben benutzen

extension_builder

extension_builder installieren und nutzen ;) kann viel Schreibarbeit und Flüchtigkeitsfehler tilgen

lose Notizen

  • Vererbung innerhalb des Projekts geht nur in dem mensch die noch nicht fertige Extension abspeichert und installiert, danach wieder das Projekt laden und nun vererben. ... Aber aufpassen mit dem richtigen Klassennamen
    • Extend existing model class: Tx_EXTENSIONNAME_Domain_Model_MODELNAME

Probleme

#1313855175: The action "new" (controller ..) is not allowed by this plugin. Please check Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information)

  • ist der controller und die actino in der ext_localconf.php eingetragen
  • ist der controller und die action im flexform drinnen
    • 'extensionname'/Configuration/FlexForms/flexform_'extensionname'.xml
  • im zweifel plugin im typo3 backend deaktivieren und neu einbinden, bzw neu konfigurieren
    • durch flexform änderungen gehen informationen verloren !!!!

#1316104317: The default controller can not be determined. Please check for Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information)

#1316104317: The default controller can not be determined. Please check for Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information)

Tx_Extbase_MVC_Exception thrown in file
/var/www/typo3/typo3_src-4.7.7/typo3/sysext/extbase/Classes/MVC/Web/RequestBuilder.php in line 185.


Das Domain Object ist ein aggregate root Objekt!

  • Domain objects setting
    • Is aggregate root: aktivieren

Hello world Extensions mit extbase und fluid

  • Grundlagen: Typo3 Flow
  • Vorraussetzung: Installation der Extension: extbase und fluid
  • Extensionname des Beispiels: nctestitflow

ext_emconf.php

Die grundsätzlichen Informationen für die Extension --- wichtig wären hier die Abhängigkeiten zu den extension extbase und fluid!!

ext_emconf.php

<?php

$EM_CONF[$_EXTKEY] = array(
	'title' => 'nc testit flow',
	'description' => 'nc test it flow description',
	'category' => 'fe',
	'author' => 'frederick',
	'author_email' => 'frederik [at] netz [dot] coop',
	'shy' => '',
	'dependencies' => '',
	'conflicts' => '',
	'priority' => '',
	'module' => '',
	'state' => 'alpha',
	'internal' => '',
	'uploadfolder' => 0,
	'createDirs' => '',
	'modify_tables' => '',
	'clearCacheOnLoad' => 1,
	'lockType' => '',
	'author_company' => '',
	'version' => '0.0.0',
	'constraints' => array(
		'depends' => array(
			/**
			 * wichtig da die extbase und fluid extension unbedingt vorhanden sein müssen!
			 */
			'php'	=>	'5.2.0-0.0.0',
			'typo3'	=>	'4.3.dev-0.0.0',
			'extbase'=>	'1.0.1-0.0.0',
			'fluid'	=>	'1.0.1-0.0.0' 
		),
		'conflicts' => array(
		),
		'suggests' => array(
		),
	),
);

?>

ext_localconf.php

Sagen welche Klasse und welche Funktion aufgerufen werden soll!!!!

ext_localconf.php

<?php
if (!defined ('TYPO3_MODE')) die ('Access denied.');

Tx_Extbase_Utility_Extension::configurePlugin(
    $_EXTKEY,
    'Pi1',
    array(
		'HelloWorldClass' => 'helloWorldFnc',
    )
);
?>

Achtung:

  • Schlüssel: HelloWorldClass führt zur folgenden Namensgebung
    • Datei in der die Klasse zu finden sein muß: Classes/Controller/HelloWorldClassController.php
    • die Klasse muss folgenden Namen besitzen: Tx_Nctestitflow_Controller_HelloWorldClassController
  • Wert: helloWorldFnc führt zur folgenden Namensgebung
    • die Klasse muss folgende Funktion besitzen: public function helloWorldFncAction()
  • Schlüssel und Wert führt zur folgenden Namensgebung
    • Templatedatei muss folgenden Namen besitzen: Resources/Private/Templates/HelloWorldClass/HelloWorldFnc.html
  • "Die Einstellungen in ext_localconf.php sind unwichtig, sie werden nicht ausgewertet, wenn es eine Flexform mit <switchableControllerActions> gibt." [1]

Classes/Controller/HelloWorldClassController.php

Achtung: Ordner-, Datei-, Klassen- und Funktionsnamen sind durch #ext_localconf.php vorgeschrieben!!!

Classes/Controller/HelloWorldClassController.php

<?php
class Tx_Nctestitflow_Controller_HelloWorldClassController extends Tx_Extbase_MVC_Controller_ActionController {
	public function helloWorldFncAction() {
		$this->view->assign('name', 'Vorname Nachname');
	}
}
?>

Resources/Private/Language/locallang.xml

Resources/Private/Language/locallang.xml

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3locallang>
	<meta type="array">
		<type>module</type>
		<description>Language labels for Hello World</description>
	</meta>
	<data type="array">
		<!--  ENGLISH LANGUAGE DATA -->
		<languageKey index="default" type="array">
			<label index="helloworld">hello world!!!</label>
		</languageKey>

		<!--  GERMAN LANGUAGE DATA -->
		<languageKey index="de" type="array">
			<label index="helloworld">Hallo Welt!!!</label>
		</languageKey>
	</data>
</T3locallang>


Resources/Private/Templates/HelloWorldClass/HelloWorldFnc.html

Achtung: Ordner- und Dateinamen sind durch #ext_localconf.php vorgeschrieben!!!

Resources/Private/Templates/HelloWorldClass/HelloWorldFnc.html

<p>
	<f:translate key="helloworld" /></br> 
	{name}
</p>

ext_tables.php

hier mit wird die Extension im Backend zur Auswahl eingebunden .... das Plugin registriert!

<?php

Tx_Extbase_Utility_Extension::registerPlugin(
    $_EXTKEY,
    'Pi1',
    'meine hello world fluid extbase extension'
);

?>

mm - Relationen zwischen Models

Ausgangslage

mit dem Extension Builder erstellte verkürzte Klassen und die TCA Konfiguration dazu

ExtensionBuilder Tag Date.jpeg

Tag Klasse

typo3conf/ext/ncnetz/Classes/Domain/Model/Tag.php

class Tag extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
	/**
	 * dates
	 *
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\Ncnetz\Domain\Model\Date>
	 * @lazy
	 */
	protected $dates;

	public function addDate(\TYPO3\Ncnetz\Domain\Model\Date $date) {
		$this->dates->attach($date);
	}
	public function removeDate(\TYPO3\Ncnetz\Domain\Model\Date $dateToRemove) {
		$this->dates->detach($dateToRemove);
	}
	public function getDates() {
		return $this->dates;
	}
	public function setDates(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $dates) {
		$this->dates = $dates;
	}
}

Date Klasse

typo3conf/ext/ncnetz/Classes/Domain/Model/Date.php

class Date extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
	/**
	 * tags
	 *
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\Ncnetz\Domain\Model\Tag>
	 */
	protected $tags;
	public function addTag(\TYPO3\Ncnetz\Domain\Model\Tag $tag) {
		$this->tags->attach($tag);
	}
	public function removeTag(\TYPO3\Ncnetz\Domain\Model\Tag $tagToRemove) {
		$this->tags->detach($tagToRemove);
	}
	public function getTags() {
		return $this->tags;
	}
	public function setTags(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $tags) {
		$this->tags = $tags;
	}

TCA Configuration Date

typo3conf/ext/ncnetz/Configuration/TCA/Date.php

$TCA['tx_ncnetz_domain_model_date'] = array(
	'columns' => array(
		'tags' => array(
			// ...
			'config' => array(
				'type' => 'select',
				'foreign_table' => 'tx_ncnetz_domain_model_tag',
				'MM' => 'tx_ncnetz_date_tag_mm',
				// ...
			),
		),
	)
);

modifiziertes TCA Configuration Tag

folgende relevanten Zeilen müssen modifiziert werden

'MM' => 'tx_ncnetz_date_tag_mm',
'MM_opposite_field'	=>	'tags', 
$TCA['tx_ncnetz_domain_model_tag'] = array(
	'columns' => array(
		'dates' => array(
			// ...
			'config' => array(
				'type' => 'select',
				'foreign_table' => 'tx_ncnetz_domain_model_date',
//				'MM' => 'tx_ncnetz_tag_date_mm',
				'MM' => 'tx_ncnetz_date_tag_mm',
				'MM_opposite_field'	=>	'tags', 
				// ...				
			),
		),
	)
);

Probleme

Could not analyse class:Tx_ _Controller_ Controller maybe not loaded or no autoloader? (More information)

peinlichst genau darauf achten das die Namen (Klassen-, Dateinamen) richtig sind

Quellen