Typo3 Extensions entwickeln: Unterschied zwischen den Versionen
F (Diskussion | Beiträge) |
F (Diskussion | Beiträge) |
||
(21 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
* [[Typo3 Extensions entwickeln @deprecated]] mit der alten '''pibase'''-Klasse | * [[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 = | = 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. | 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 | * 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 = | = extension_builder = | ||
Zeile 13: | Zeile 17: | ||
* 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 | * 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'' | ** 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 = | ||
Zeile 91: | Zeile 118: | ||
* Schlüssel und Wert führt zur folgenden Namensgebung | * Schlüssel und Wert führt zur folgenden Namensgebung | ||
** Templatedatei muss folgenden Namen besitzen: ''Resources/Private/Templates/'''HelloWorldClass'''/'''HelloWorldFnc'''.html'' | ** 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 == | == Classes/Controller/HelloWorldClassController.php == | ||
Zeile 159: | Zeile 187: | ||
?> | ?> | ||
+ | </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> | </source> | ||
Zeile 169: | Zeile 297: | ||
* [http://www.typo3lexikon.de/typo3-tutorials/extensions/fluid.html deutsches Fluid Tutorial] | * [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://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 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/
Inhaltsverzeichnis
- 1 Allgemein
- 2 extension_builder
- 2.1 Probleme
- 2.1.1 #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)
- 2.1.2 #1316104317: The default controller can not be determined. Please check for Tx_Extbase_Utility_Extension::configurePlugin() in your ext_localconf.php. (More information)
- 2.1 Probleme
- 3 Hello world Extensions mit extbase und fluid
- 4 mm - Relationen zwischen Models
- 5 Probleme
- 6 Quellen
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
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
- deutsches Fluid Tutorial
- ausführliche Extbase_Fluid_Dokumentation.pdf von mittwald
- Extension Beispiel von 2010
- Backend Suche in den eigen entwickelten Extensions
- Relationen MM_opposite_field