Anzeige
Anzeige
UX & Design
Artikel merken

Praxis-Workshop für Einsteiger: Extension-Entwicklung mit Extbase und Fluid

Die grundlegendsten Neuerungen in TYPO3 4.3 sind sicherlich das MVC-Framework Extbase und die Template-Engine Fluid. Doch diese können nicht einfach im Backend per Checkbox aktiviert werden, sondern sie stellen sehr komplexe Konzepte dar, die zudem auch noch vom zukünftigen TYPO3-Technologie-Träger FLOW3 zurückportiert wurden. Doch keine Angst – ein einfacher Einstieg ist auch hier möglich. Wir zeigen, wie es geht.

10 Min. Lesezeit
Anzeige
Anzeige

Auch wenn Extbase und Fluid gerade in aller Munde sind, ist es wie bei jeder neuen Technologie schwierig, einen einfachen Einstieg in die Thematik zu finden. Das liegt weniger an den beiden Newcomern selbst, sondern eher daran, dass noch wenig Literatur existiert und es Einsteigern oft nicht leicht fällt, sich durch die bereits bestehenden Beispiele zu hangeln. Grund genug für diesen ausführlichen Workshop.

Was sind Extbase und Fluid genau?

Anzeige
Anzeige

In t3n Nr. 16 hat Extbase-Entwickler Jochen Rau ausführlich erklärt, welche Rolle Extbase spielt und warum man es verwenden sollte [1].

Extbase ist zunächst eine ganz normale Systemextension, die als Alternative zur herkömmlichen Extension-Programmierung mittels Erweiterung der tslib_pibase-Klasse verwendet werden kann. Gerne auch parallel, denn Extbase verträgt sich prima mit klassischen Extensions. Extbase führt dabei unter anderem solch schwergewichtige Konzepte wie Domain Driven Design und das MVC-Pattern ein. Damit ist es möglich, sehr elegant auch komplexe Erweiterungen zu schreiben, die sich leicht erweitern lassen. Darüber hinaus – und genau das wird einer der Hauptgründe für die Verwendung sein – werden sich solche Extensions leicht in die zukünftige TYPO3-Version 5.0 migrieren lassen.

Anzeige
Anzeige

Fluid, entwickelt von Core-Developer Sebastian Kurfürst, übernimmt dabei die Aufgabe einer Template-Engine und ist für alle Ein- und Ausgaben zuständig. Auch Fluid ist dabei eine neue Systemextension und kann bei Bedarf gegen eine andere Templating-Engine ausgetauscht werden. Einen ausführlichen Einblick in Fluid liefert ein Artikel in t3n Nr. 16 [2].

Anzeige
Anzeige

Es geht los

Um nun mit Extbase und Fluid loslegen zu können, brauchen Sie eine Installation von TYPO3 4.3 (stable oder beta2). Im Extension-Manager müssen Sie nun noch die beiden Systemextensions Extbase und Fluid installieren, da diese per Default zwar mitgeliefert, aber noch nicht installiert sind. Nun brauchen Sie noch eine Seite im Seitenbaum, bei der Sie sicherstellen müssen, dass Inhalte darauf ausgegeben werden können. Dazu reicht das Aktivieren von „css_styled_content“ und das folgende TypoScript:

Minimales Setup
page = PAGE
page.10 < styles.content.get

Listing 1

Als nächstes installieren Sie die Extension „efempty“ aus dem TER und platzieren diese auf der vorher angelegten Seite. Wenn Sie nun den Cache leeren und die Seite im Frontend laden, sollten Sie „Hello World!“ lesen können. Wenn dies bei Ihnen der Fall ist, sind Extbase und Fluid ordnungsgemäß installiert und grundsätzlich einsatzfähig.

Anzeige
Anzeige

Die Extension „efempty“ (als Abkürzung für „Extbase Fluid Empty“) ist dabei ein leerer Container, der die minimale Konfiguration enthält, die für den Betrieb der Extension im Zusammenspiel mit Extbase und Fluid notwendig ist. Sie können damit beispielsweise mit Fluid experimentieren, ohne auf Extbase achten zu müssen oder die Extension einfach Datei für Datei erkunden, um zu sehen, wie das Zusammenspiel der Dateien funktioniert.

In diesem Workshop werden Sie allerdings eine neue Extension manuell aufbauen, um alle wichtigen Bereiche kennenzulernen.

Extension: „guestbook“

Ihre eigene Extbase-Extension soll ein sehr einfaches Gästebuch realisieren. Diese soll eine Liste von Gästebucheinträgen anzeigen und jedem die Möglichkeit bieten, eigene Einträge hinzuzufügen. Ein Gästebucheintrag hat dabei einen Titel, einen Text und natürlich ein Datum.

Anzeige
Anzeige

Wenn man den Paradigmen des Domain Driven Design folgt, dann ist der Eintrag (Englisch: Entry) eine Entity mit den Eigenschaften „Title,“ „Text“ und „Date“. Eine Entity ist dabei ein eigenes Objekt mit einer Identität – das heißt die Einträge unterscheiden sich, auch wenn diese den selben Inhalt haben sollten. Dafür werden wir gleich noch eine eigene Klasse benötigen. Vorher aber zum prinzipiellen Ablauf. Im MVC-Paradigma brauchen Sie einen Controller, der die so genannten Aktionen (Actions) verwaltet. Sie benötigen zwei offensichtliche Actions – eine, um das Gästebuch anzuzeigen (diese nennen wir index), dann eine Action, um das Formular anzuzeigen, mit dem man neue Einträge hinzufügen kann (add) und eine Action, die den Eintrag dann tatsächlich in die Datenbank schreibt (create).

Convention over Configuration

Innerhalb der Programmierung mittels Extbase und Fluid gibt es sehr viele Konventionen (Vereinbarungen) in Bezug auf Benennungen, beispielsweise von Dateiklassen oder Verzeichnisnamen. Das mag anfangs verwirren, weil man nicht genau weiß, warum und wie etwas festgelegt wurde – hat man das System aber einmal verinnerlicht, so hilft es einem enorm, wenn es darum geht, sich im Code zurechtzufinden. Die Konventionen helfen aber nicht nur dem Programmierer, sondern auch Extbase selbst, da Extbase automatisch bestimmte Funktionen ausführen kann, selbst wenn diese vorher nicht definiert wurden.

Verzeichnisse und Basis-Dateien

Um nun den Grundstock für die eigene Extension zu legen, erstellen
Sie zunächst das Verzeichnis „guestbook“ im Verzeichnis
„typo3conf/ext/“. Nun legen Sie die Verzeichnisse gemäß der nebenstehenden
Abbildung an – achten Sie dabei auf Groß- und Kleinschreibung.
Im Hauptverzeichnis der Extension benötigen Sie nun drei Dateien, die Ihnen aus der Zeit der klassischen Extensionprogrammierung bekannt sein dürften. Die erste (ext_emconf.php) sorgt dafür, dass der Extensionmanager die Extension überhaupt anzeigen kann:

Anzeige
Anzeige
ext_emconf.php
<?php
$EM_CONF[$_EXTKEY] = array(
	'title' => 'Guestbook',
	'description' => 'Einfaches Gaestebuch',
	'category' => 'plugin',
	'author' => 'Patrick Lobacher',
	'author_company' => 'typofaktum',
	'author_email' => 'patrick.lobacher@typofaktum.de',
	'dependencies' => 'extbase,fluid',
	'clearCacheOnLoad' => 1,
	'version' => '0.0.0',
	'constraints' => array(
		'depends' => array(
			'php' => '5.2.0-0.0.0',
			'typo3' => '4.3.dev-4.3.99',
			'extbase' => '0.0.0-0.0.0',
			'fluid' => '0.0.0-0.0.0',
		),
	)
);
?>

Listing 2

Hier werden beispielsweise der Name und eine Beschreibung sowie der Autor der Extension vermerkt. Zusätzlich finden sich hier aber auch Angaben darüber, welche TYPO3-Version verlangt wird und auch, dass Extbase und Fluid bereits installiert sein müssen, wenn man die Extension installieren will.

Als nächstes benötigen Sie die Datei „ext_localconf.php“, die zur Konfiguration des Plugins im Frontend dient:

ext_localconf.php
<?php
if (!defined ('TYPO3_MODE'))  die ('Access denied.');
Tx_Extbase_Utility_Extension::configurePlugin($_EXTKEY,'Pi1',array('Entry' => 'index,add,create'),array('Entry' => 'index,add,create'));
?>

Listing 3

Hier werden sowohl der Name des Plugins (Pi1) wie auch die möglichen Controller/Action-Kombinationen in den notierten Arrays definiert. Das zweite Array dient dazu, all jene Kombinationen aufzulisten, die nicht gecached werden sollen – in diesem Fall alle, damit immer sofort alle Ergebnisse angezeigt werden.

Anzeige
Anzeige

Damit Sie das Plugin auch im Backend auf einer Seite als Inhaltselement verwenden können, benötigen Sie noch eine weitere Datei namens „ext_tables.php“:

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

Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY,'Pi1','Guestbook');

$TCA['tx_guestbook_domain_model_entry'] = array (
	'ctrl' => array (
		'title' => 'Guestbook-Entry',
		'label' => 'title',
	),
	'columns' => array(	
		'title' => array(
			'label'   => 'Entry-Titel',
			'config'  => array(
				'type' => 'input',
				'eval' => 'trim,required',
			)
		),
		'description' => array(
			'label'   => 'Entry-Beschreibung',
			'config'  => array(
				'type' => 'textarea',
				'eval' => 'trim,required',
			)
		),
		'date' => array(
			'label'   => 'Entry-Datum',
			'config'  => array(
				'type'    => 'input',
				'eval' => 'datetime, required',
				'default' => time()
			)
		)
	)
);
?>

Listing 4

Hier wird einerseits das Plugin registriert, andererseits wird die TCA-Definition für die Tabelle und die drei Tabellenfelder notiert. Diese verwendet Extbase für alle Datenbank-relevanten Operationen. Hier können Sie natürlich auch sämtliche Ihnen bekannte Optionen, beispielsweise für die Verarbeitung in Backendformularen, verwenden.

Schließlich ist noch die Datenbankdefinition innerhalb der Datei „ext_tables.sql“ von Nöten, damit TYPO3 die entsprechende Tabelle anlegen kann:

Anzeige
Anzeige
ext_tables.sql
#
# Table structure for table 'tx_guestbook_domain_model_entry'
#
CREATE TABLE tx_guestbook_domain_model_entry (
	uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
	pid int(11) DEFAULT '0' NOT NULL,
	title varchar(255) DEFAULT '' NOT NULL,
	description text NOT NULL,
	date int(11) DEFAULT '0' NOT NULL,
	PRIMARY KEY (uid),
	KEY parent (pid),
);

Listing 5

Model und Controller

Jetzt, da die Basisdateien platziert sind, können Sie sich Gedanken zum Model machen – dies repräsentiert das Objekt, das Sie verwalten wollen. Sie haben lediglich ein Objekt – nämlich den Entry (Eintrag). Für diesen legen Sie eine eigene Klasse im Ordner „Classes/Domain/Model/“ an und nennen diese „Entry.php“.

Classes/Domain/Model/Entry.php
<?php
/**
 * @scope prototype
 * @entity
 */
class Tx_Guestbook_Domain_Model_Entry extends Tx_Extbase_DomainObject_AbstractEntity {
	
	/**
	 * @var string
	 * @validate StringLength(minimum = 3, maximum = 50)
	 */
	protected $title;

	/**
	 * @var DateTime
	 */
	protected $date;

	/**
	 * @var string
	 */
	protected $description;

	public function __construct() {
			$this->date = new DateTime();
	}
	
	/**
	 * @param string $title
	 * @return void
	 */
	public function setTitle($title) {
		$this->title = $title;
	}

	/**
	 * @return string
	 */
	public function getTitle() {
		return $this->title;
	}

	/**
	 * @param DateTime $date
	 * @return void
	 */
	public function setDate(DateTime $date) {
		$this->date = $date;
	}

	/**
	 * @return DateTime
	 */
	public function getDate() {
		return $this->date;
	}

	/**
	 * @param string $content
	 * @return void
	 */
	public function setDescription($content) {
		$this->description = $content;
	}

	/**
	 * @return string
	 */
	public function getDescription() {
		return $this->description;
	}
}
?>

Listing 6

Hier wird nun eine eigene Klasse definiert, die sämtliche Objekteigenschaften und zudem auch Getter- und Setter-Methoden für diese enthält. Da der Zugriff auf die Eigenschaften „protected“ ist, kann auch nur über diese zugegriffen werden. Wie Sie später sehen werden, ist dies sogar sehr praktisch, da dies Extbase zumeist automatisch übernimmt.

Nun da das Model in Position ist, brauchen Sie eine weitere Komponente – nämlich den Controller. Dieser ist die Schaltzentrale zwischen Model und View und legt damit fest, welche Action wann und wie aufgerufen wird. Der Controller hat ein eigenes Verzeichnis unter „Classes/Controller/“ und wird mit „EntryController.php“ bezeichnet.

Anzeige
Anzeige
Classes/Controller/EntryController.php
<?php
class Tx_Guestbook_Controller_EntryController extends Tx_Extbase_MVC_Controller_ActionController {
	/**
	 * @var Tx_Guestbook_Domain_Model_EntryRepository
	 */
	protected $entryRepository;

	/**
	 * @return void
	 */
	public function initializeAction() {
		$this->entryRepository = t3lib_div::makeInstance('Tx_Guestbook_Domain_Repository_EntryRepository');
	}

	/**
	 * @return string The rendered view
	 */
	public function indexAction() {
		$this->view->assign('entries', $this->entryRepository->findAll());
	}

	/**
	 * @param Tx_Guestbook_Domain_Model_Entry $newEntry 
	 * @return string
	 * @dontvalidate $newEntry
	 */
	public function addAction(Tx_Guestbook_Domain_Model_Entry $newEntry = NULL) {
		$this->view->assign('newEntry', $newEntry);
	}

	/**
	 * @param Tx_Guestbook_Domain_Model_Entry $newEntry
	 * @return void
	 */
	public function createAction(Tx_Guestbook_Domain_Model_Entry $newEntry) {
		$this->entryRepository->add($newEntry);
		$this->redirect('index');
	}
}
?>

Listing 7

Der Controller enthält nun die drei möglichen Actions. Sobald man bei der Methode im Namen ein „Action“ hinten anstellt, erkennt Extbase dies automatisch als zugehörige Action und wertet den ersten Teil des Namens aus. Hier finden sich im Listing die drei Actionnamen „index“, „add“ und „create“. Somit weiß Extbase immer, welche Action aufzurufen ist.

Prinzipiell wird die erste in der Datei „ext_localconf.php“ notierte Controller/Action-Kombination aufgerufen, wenn keine Parameter beim Aufruf mitgegeben werden (wie beim ersten Aufruf). Dies ist der Controller „Entry“ und die Action „index“. Somit ruft Extbase die Methode „indexAction()“ per Default auf. Davor allerdings wird (wie übrigens bei jeder Action) die Methode „initializeAction“ aufgerufen, die in unserem Fall ein Repository (dies ist unser Zugang zur Datenbank) instantiiert. Da wir lediglich Standard-Operationen auf dem Repository anwenden wollen, müssen Sie hier keinerlei Code hinterlegen – lediglich die Datei und die leere Klasse müssen dort vorhanden sein.

In der Create-Action wird auf das Repository die add()-Methode angewandt, was dazu führt, dass das Objekt zum Repository und damit zur Datenbank hinzugefügt wird – und das ohne eine Zeile SQL.

Classes/Domain/Repository/EntryRepository.php
<?php
class Tx_Guestbook_Domain_Repository_EntryRepository extends Tx_Extbase_Persistence_Repository {
}
?>

Listing 8

Die Ausgabe – View

Und schon sind wir bei unserer letzten Komponente, dem View. Dieser besteht aus zwei Fluid-Templates – je einem pro ausgegebener Action. Das erste Template listet die Gästebuch-Einträge auf (index), während das zweite das Formular zur Verfügung stellt, mit dem man neue Einträge anlegen kann (create). Die Views befinden sich im Verzeichnis „Resources/Private/Templates/Entry/“ und sind genauso wie die Actions benannt – mit „.html“ als Suffix.

Resources/Private/Templates/Entry/index.html
Das Gästebuch enthält folgende Einträge:
<ul>
<f:for each="{entries}" as="entry">
   <li><strong>{entry.title}</strong> (<f:format.date>{entry.date}</f:format.date>)<br/>{entry.description}</li>
</f:for>
</ul>
<p><f:link.action action="add">Einen neuen Eintrag anlegen</f:link.action></p>

Listing 9

Dies reicht bereits, um die im Repository vorhandenen Einträge anzuzeigen – im Controller wurde ja in der Index-Action das Objekt „Entries“ an den View übergeben und kann nun über den For-ViewHelper angezeigt werden – inklusive des Datums (das als DateTime geliefert wird und über den ViewHelper „format“ umformatiert wird) und der Beschreibung. Dabei wird die so genannte Punktsyntax verwendet, um auf die Eigenschaften des Objekts zuzugreifen. So gibt beispielsweise „{entry.description}“ die Beschreibung des Eintrags zurück. Es wird allerdings nicht direkt auf die Eigenschaft zugegriffen, sondern immer der Getter der jeweiligen Eigenschaft aufgerufen. Zusätzlich reicht ein einziger ViewHelper (link), um einen Link auf das Formular zu setzen, mit dem man neue Einträge anlegen kann.

Nun brauchen Sie also nur noch das Template, um einen neuen Eintrag anzulegen und schon ist das Gästebuch fertig:

Resources/Private/Templates/Entry/add.html
Neuen Eintrag anlegen:
<f:form method="post" controller="Entry" action="create" name="newEntry" object="{newEntry}">
   Title:<br/><f:form.textbox property="title" /><br />
   Description:<br/>
   <f:form.textarea property="description" rows="8" cols="46" /><br />
   <f:form.submit class="submit" value="Submit"/>
</f:form>

Listing 10

Hier wird ein Formular aufgebaut und nach dem Abschicken auf die Create-Action verwiesen, die dann den Eintrag ablegt. Dabei werden lediglich zwei Eingabefelder benötigt: eine Textbox für den Titel und eine Textarea für die Beschreibung – das Datum wird immer aktuell im Model gesetzt.

Ergebnis

Wenn Sie nun das Plugin über den Extensionmanager installieren, werden Sie darauf aufmerksam gemacht, dass eine neue Tabelle angelegt werden muss. Bestätigen Sie dies und platzieren Sie das Plugin auf einer Seite. Wenn Sie diese Seite im Frontend aufrufen, können Sie direkt über den Link „Einen neuen Eintrag anlegen“ einen Gästebucheintrag hinzufügen. Sobald Sie das Formular ausgefüllt und abgeschickt haben, landen Sie wieder in der Index-Action und es werden Ihnen alle bisherigen Einträge angezeigt.

Wie geht es weiter?

Nun, da Sie Gästebucheinträge haben, könnten Sie beispielsweise eine Delete-Action hinzufügen, die es ermöglicht, Einträge wieder zu löschen. Hier sollten Sie allerdings aufpassen, dass dies nicht jeder machen darf, sondern etwa nur der Administrator.

Momentan werden die Datensätze auf der Seite mit der ID=0 abgespeichert, was nicht sehr zweckmäßig ist, wenn man mehr als ein Gästebuch verwalten will. Dies lässt sich beispielsweise per TypoScript ändern. Man könnte zudem die E-Mail-Adresse zum Eintrageformular hinzufügen und einen Gravatar anzeigen, sofern ein solcher für die E-Mail-Adresse definiert ist.

Sie sehen: Es gibt zahlreiche Ideen und es lohnt sich, sie zu verfolgen – spielen Sie einfach damit. Weitere Impulse und Hilfe finden Sie unter [3], [4] und [5]. Viel Spaß in der Extbase/Fluid-Welt.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
11 Kommentare
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Waldo

Prima tut. Aber fehlt da nicht noch ein TS für das Einbinden des Plugins ?

Antworten
hauke

Also bei mir tut’s das nicht, wenn ich einen Eintrag speichern will kommt die Fehlermeldung:

#1251730702: The value must be of type „Tx_Guestbook_Domain_Model_Entry“, but was of type „array“.

Antworten
Sebastian Böttger

Hi Hauke,

bitte schaue nochmal komplett über den Code und achte besonders darauf, dass Du ALLE Kommentare mit angegeben hast. Das ist die klassische Fehlermeldung, wenn Extbase den Typ nicht erkennen kann und diesen zieht sich Extbase aus den Annotations.

Patrick

Antworten
Sebastian Böttger

Hi Waldo,

einfach das Plugin als Content-Element auf einer Seite einbinden – das reicht.

Patrick

Antworten
hauke

Hab das Problem gelöst. Ich benutzte das Typo3Winstaller 4.3.1-Packet und da ist der PHP-Cache eAccelerator eingeschaltet und ich denke der schneidet die PHP-Komentare ab. Wenn man das Caching des eAccelerator abschaltet, funktioniert alles wie es soll…

hauke

Antworten
sieby

Hallo,

bei mir taucht das Problem auf, dass die Controller-Datei doppelt aufgerufen wird, was zur folge hat das die Klasse doppelt erzeugt wird.

Habe die Listings von der Website kopiert und von daher kann sich da kein Fehler eingeschlichen haben.

Kann mir vllt. Jemand sagen wodurch dieses Problem entsteht?

Antworten
Eddy

Leider bekomme ich die Geschichte nicht zum Laufen. Nach der Installation des Plugins wird beim Seitenaufruf folgender Fehler ausgeworfen:

#1247602160: Table ‚extbase.tx_guestbook_domain_model_entry‘ doesn’t exist

Der Code in der ext_tables.sql ist korrekt. Merkwürdig ist jedoch, das im Extension Manager, bei Klick auf Guestbook, eine Aktualisierung der entsprechenden Tabelle gefordert wird. Nach Durchführung der Aktualisierung erscheint jedoch wieder die o.a. Fehlermeldung und der Extension Manager möchte wiederum eine Aktualisierung der Tabelle.

Habe ich etwas übersehen?

Antworten
Eddy

Nach anfänglicher Tipparbeit habe ich mich nun entschlossen, den Code per Copy&Pace zu verwenden. Uns siehe da, es tut. (So kann man natürlich auch Zeit tot machen :-) )
Wahrscheinlich irgendwo ein Synthaxfehler.

Antworten
Christian

Woran kann es liegen das die Action „Add“ nicht mehr aufgerufen wird? Zwischenzeitlich hatte es funktioniert, dann hab ich’s anscheinend verbogen. Hab die Extension per Copy&Paste noch einmal aufgebaut, aber die Action, bzw. das Formular wird nicht angezeigt.

Antworten
Sebastian Böttger

Das kann natürlich viele Gründe habe – wenn immer nur die Liste der Einträge kommt, fehlt wahrscheinlich der Eintrag in der ext_localconf.php oder der Link wurde falsch generiert. Zudem ist das Caching bei Extbase sehr intensiv – daher am Besten einmal alle Cache-Tabellen händisch leeren (inbesondere den Extbase Reflection Cache). Eventuell arbeitet das Beispiel auch nicht mehr mit der aktuellen Version 1.3 von Extbase/Fluid zusammen – das habe ich noch nicht ausporbiert…

Antworten
Christian

Habe jetzt alle möglichen Cache-Tabellen geleert. Letztendlich hat aber geholfen, die Seite mit dem Plugin zu löschen und eine neue Seite mit neu eingebundenen Plugin anzulegen.

Antworten

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige