Using the JTable class/de: Difference between revisions

From Joomla! Documentation

Created page with "== Einführung von JTable =="
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(36 intermediate revisions by one other user not shown)
Line 3: Line 3:


== Einführung von JTable ==
== Einführung von JTable ==
The [https://api.joomla.org/cms-3/classes/JTable.html JTable] class is an implementation of the [http://en.wikipedia.org/wiki/Active_record_pattern Active Record] design pattern. It is used throughout Joomla! for [http://en.wikipedia.org/wiki/Create,_read,_update_and_delete creating, reading, updating, and deleting aka CRUD tasks] for records in the database table.  
Die [https://api.joomla.org/cms-3/classes/JTable.html JTable] Klasse ist eine Implementierung des Design-Patterns [http://en.wikipedia.org/wiki/Active_record_pattern Active Record]. Es wird überall in Joomla! für [http://en.wikipedia.org/wiki/Create,_read,_update_and_delete Erstellen, Lesen, Aktualisieren und Löschen aka CRUD Aufgaben] von Einträgen in Datenbanktabellen benutzt.  


Since <tt>JTable</tt> is an abstract class that forms the basis for all database table classes, some of the methods listed will be overridden by the child class so you should check the child class documentation for further information. Also take note that as of Joomla! 2.5, <tt>JTable</tt> properties are automatically generated based on the schema of the specified table, which means you don't need to declare Member variables in your class (although you can still do it if you want to).
Seitdem <tt>JTable</tt> eine abstrakte Klasse ist, welche die Basis für alle Datenbanktabellen-Klassen darstellt, werden einige der aufgelisteten Methoden von Unterklassen überschrieben, sodass man für weitere Informationen die Dokumentation der jeweiligen Unterklasse anschauen sollte. Abgesehen davon, werden seit Joomla! 2.5 alle Attribute in <tt>JTable</tt> automatisch generiert, basierend auf dem Schema der jeweiligen Tabelle. Das bedeutet, es ist nicht mehr nötig Klassenvariablen zu deklarieren (obwohl man es immer noch tun kann, wenn man will).


Each physical database table created should have a corresponding class derived from JTable to represent it. JTable provides many methods to make common manipulations to the table much simpler. For example, one of the most common operations you will need to perform is to read a table row into memory given a value for the primary key. This can be done easily using the load method. The table row can then be just as easily updated using the save method, which also performs any predefined sanity checks on the table fields.
Jede erstellte physische Datenbanktabelle sollte als Vertretung eine zugehörige Klasse haben, die von von JTable abgeleitet ist. JTable stellt viele Methoden zur Verfügung, die geläufige Veränderungen der Tabelle sehr viel einfacher macht. Eine der meist gebrauchten Funktionen ist zum Beispiel das Lesen einer Tabellenreihe in den Speicher, anhand eines Primärschlüsselwertes. Das kann einfach mit dem Benutzen der load-Methode bewerkstelligt werden. Dank der save-Methode kann die Tabellenreihe dann einfach aktualisiert werden, welche dabei ebenso vorgegebene Überprüfungen auf die Tabellenfelder ausführt.


== Writing an extension of JTable ==
== Schreiben einer JTable-Erweiterung ==
To use <tt>JTable</tt>, you will create an extension of the <tt>JTable</tt> class. In this example, we have a database table "#__recipes" with an autoincrementing primary key "id" containing all of our recipes. The only thing we need to do to start using <tt>JTable</tt> is to create a constructor in our extended JTable class. The class constructor will call the parent constructor to get the table: all it needs is the name of the table, the name of the primary key column, and the database instance.
Um <tt>JTable</tt> zu benutzen, erstellt man eine Erweiterung der <tt>JTable</tt> Klasse. In diesem Beispiel gibt es die Tabelle "#__recipes" mit einem automatisch hochzählenden Primärschlüssel "id", welche alle Rezepte beinhaltet. Das einzige was getan werden muss, um <tt>JTable</tt> zu benutzen, ist einen Konstruktor in der erweiternden JTable-Klasse zu erstellen. Der Klassenkonstruktor wird den Eltern-Konstruktor aufrufen um die Tabelle zu erhalten: Alles was es braucht ist der Name der Tabelle, den Namen der Primärschlüsselspalte und der Datenbankinstanz.


<source lang="php">
<source lang="php">
Line 26: Line 26:
</source>
</source>


If you were using this class as a part of a backend component called 'Recipes', you would place this code in the file <tt>/administrator/components/com_recipes/tables/recipes.php</tt>.
Wird diese Klasse als Teil der Backend-Komponente namens 'Recipes' benutzt, würde man diesen Code in der Datei platzieren: <tt>/administrator/components/com_recipes/tables/recipes.php</tt>.


You can use this functionality in plugins just as in components. As a general rule you should avoid writing to the database from a module, and use plugins/components for this. Remember to use the built-in [[S:MyLanguage/constants|constants]] when linking to a custom path (outside the <tt>adminstrator/{com_nameofyourcomponent}/tables</tt> folder).
Diese Funktionalität kann sowohl in Plugins, als auch in Komponenten benutzt werden. Als generelle Regel sollte man es vermeiden, aus einem Modul heraus, in eine Datenbank zu schreiben und dafür Plugins oder Komponenten zu benutzen. Nicht zu vergessen die eingebauten [[S:MyLanguage/constants|Konstanten]], die man beim Verlinken eines eigenen Pfades benutzen kann (außerhalb des <tt>adminstrator/{com_Komponentenname}/tables</tt> Ordners).


== Using a JTable class extension ==
== Benutzen einer JTable-Klassenerweiterung ==


Once the table class is in place we can use it in our model <tt>getTable()</tt> function.
Sobald die Tabellenklasse fertig ist, kann sie im Model mit der Funktion <tt>getTable()</tt> benutzt werden.


<source lang="php">
<source lang="php">
Line 41: Line 41:
</source>
</source>


You can use your JTable classes in any other Joomla! extension by using <tt>JTable::addIncludePath()</tt> in your extension's source code (use <tt>com_nameofyourcomponent</tt> in place of <tt>com_recipes</tt>):
JTable-Klassen können in irgendwelchen anderen Joomla! Erweiterungen benutzt werden, indem sie <tt>JTable::addIncludePath()</tt> im Quellcode der Erweiterung nutzen (also <tt>com_Komponentenname</tt> anstatt <tt>com_recipes</tt>):


<source lang="php">
<source lang="php">
Line 48: Line 48:
</source>
</source>


Notice that the lowercase version of the suffix of your class name is used as the first parameter, with the prefix 'Table' as the second. Also, the <tt>getInstance()</tt> member function of JTable returns a JTableObject by reference instead of a value;.
Man beachte, dass die kleingeschriebene Version des Suffix des Klassennamens als erster Parameter benutzt wird und der Prefix 'Table' als zweiter. Außerdem gibt die Methode <tt>getInstance()</tt> von JTable ein JTableObject mit Referenz zurückgibt, anstatt eines Wertes.
   
   
=== Reserved Database Field Names ===
=== Reservierte Datenbankfeldnamen ===
Some of the optional features of <tt>JTable</tt> require the existence of specially-named fields in the database table. If you require this additional functionality you should ensure that these named fields are present in the table. These field names should be considered reserved as any attempts to use them for purposes other than those supported by JTable may result in conflict.
Manche der optionalen Features von <tt>JTable</tt> brauchen speziell benannte Felder in der Datenbanktabelle. Wenn man diese zusätzlichen Funktionalitäten braucht, sollte man sicherstellen, dass diese genannten Felder in der Tabelle vorhanden sind. Die Feldnamen sollten als reserviert angesehen werden und bei dem Versuch sie, für etwas anderes als dem von JTable ursprünglich vorgesehenen Zweck zu benutzen, könnten Konflikte entstehen.
{| class="wikitable"
{| class="wikitable"
|-
|-
!Field name
!Feldname
!Methods using the field name
!Methoden die den Feldnamen benutzen
|-
|-
|checked_out
|checked_out
|[[JTable/checkOut|checkOut]], [[JTable/checkIn|checkIn]], [[JTable/isCheckedOut|isCheckedOut]]
|[https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_checkOut checkOut], [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_checkIn checkIn], [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_isCheckedOut isCheckedOut]
|-
|-
|checked_out_time
|checked_out_time
|[[JTable/checkOut|checkOut]], [[JTable/checkIn|checkIn]], [[JTable/isCheckedOut|isCheckedOut]]
|[https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_checkOut checkOut], [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_checkIn checkIn], [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_isCheckedOut isCheckedOut]
|-
|-
|hits
|hits
|[[JTable/hit|hit]]
|[https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_hit hit]
|-
|-
|ordering
|ordering
|[[JTable/getNextOrder|getNextOrder]], [[JTable/reorder|reorder]], [[JTable/move|move]]
|[https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_getNextOrder getNextOrder], [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_reorder reorder], [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_move move]
|-
|-
|published
|published
|[[JTable/publish|publish]]
|[https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_publish publish]
|}
|}


==== Check-in/check-out ====
==== Check-in/Check-out ====
Joomla! tables implement a simple mechanism for preventing a [[wikipedia:race condition|race condition]] while editing rows in a database. This depends on the existence of database fields called "checked_out" and "checked_out_time" and if these fields are present in the view (JForm) <tt>JTable</tt> will automatically support this mechanism so that it can be easily used in your tables too.
Joomla! Tabellen haben einen einfachen Mechanismus implementiert, der eine [[wikipedia:race condition|Race Condition]] verhindert, während Reihen in der Datenbank verändert werden. Das hängt davon ab, ob die Datenbankfelder namens "checked_out" und "checked_out_time" vorhanden sind und ob diese Felder in der view (JForm) drin sind. <tt>JTable</tt> unterstützt dann automatisch diesen Mechanismus, sodass er auch einfach in den eigenen Tabellen genutzt werden kann.


==== Hit counter ====
==== Zugriffszähler ====
Some Joomla tables contain a field called "hits" which records the number of times that a table row has been accessed. JTable provides a simple method to increment this field: [https://api.joomla.org/cms-3/classes/JTable.html#method_hit hit].
Manche Joomla-Tabellen beinhalten ein Feld namens "hits", welches aufnimmt, wie oft die Tabellenreihe aufgerufen wurde. JTable bietet eine einfache Methode, die das Feld hochzählt: [https://api.joomla.org/cms-3/classes/JTable.html#method_hit hit].


==== Example JForm fields for Reserved database names in JTable ====
==== Beispiel JForm-Felder für reservierte Datenbanknamen in JTable ====
<source lang="xml">
<source lang="xml">
<field name="state"
<field name="state"
Line 131: Line 131:
</source>
</source>


===Useful Member Functions===
=== Praktische Klassenfunktionen ===
* [[JTable/load]] Method to load into the JTable object a record by its primary key value (id) or a combination of criteria
* [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_load load] Methode um einen Datensatz, anhand seines Primärschlüsselwertes (id) oder einer Kombination von Kriterien, in ein JTable-Objekt zu laden.
* [[JTable/bind]] Method to bind a JTable object to a generic key / value array, i.e. assign the values from the array to the JTable object matching the array keys with the JTable object properties
* [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_bind bind] Methode um ein JTable-Objekt an ein generisches key/value-Array zu binden. Das heißt, sie weist die Werte eines Arrays einem JTable-Objekt und dessen Attributen zu, bei denen die Array-Schlüssel passen.
* [[JTable/check]] Method to validate data before storing the object
* [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_check check] Methode um Daten zu überprüfen, bevor sie im Objekt abgelegt werden.
* [[JTable/store]] Method to persist the object into database
* [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_store store] Methode um das Objekt in der Datenbank abzulegen.
* [[JTable/save]] Method to provide a shortcut to binding, checking and storing a JTable instance to the database table.
* [https://api.joomla.org/cms-3/classes/Joomla.CMS.Table.Table.html#method_save save] Methode die als Abkürzung zum Verbinden, Prüfen und Speichern einer JTable-Instanz in die Datenbanktabelle dient.


===See Also===
=== Siehe auch ===
* [[S:MyLanguage/J3.x:Developing_an_MVC_Component/Using_the_database#admin.2Ftables.2Fhelloworld.php | Part 7 of J3.x:Developing an MVC Component/Using the database]]
* [[S:MyLanguage/J3.x:Developing_an_MVC_Component/Using_the_database#admin.2Ftables.2Fhelloworld.php | Teil 7 von J3.x:Developing an MVC Component/Using the database]]
*[[S:MyLanguage/J2.5:Developing a MVC Component/Adding configuration#admin.2Ftables.2Fhelloworld.php | Part 14 of J2.5:Developing a MVC Component/Adding configuration]]
*[[S:MyLanguage/J2.5:Developing a MVC Component/Adding configuration#admin.2Ftables.2Fhelloworld.php | Teil 14 von J2.5:Developing a MVC Component/Adding configuration]]


== Summary ==
 
When properly extended, JTable gives you all of the basic functions you need for managing and retrieving records in a database table.
== Zusammenfassung ==
Wenn JTable richtig erweitert wurde, beinhaltet die Klasse alle grundlegenden Funktionen die man braucht, um Einträge in einer Datenbanktabelle zu verwalten und aufzurufen.


<noinclude>
<noinclude>
[[Category:Development]]
[[Category:Development/de]]
[[Category:Component Development]]
[[Category:Component Development/de]]
[[Category:Extension development]]
[[Category:Extension development/de]]
[[Category:JTable]]
[[Category:JTable/de]]
[[Category:Tutorials]]
[[Category:Tutorials/de]]
</noinclude>
</noinclude>

Latest revision as of 13:34, 31 March 2020

Das Tutorial ist für Joomla 3.x

Einführung von JTable

Die JTable Klasse ist eine Implementierung des Design-Patterns Active Record. Es wird überall in Joomla! für Erstellen, Lesen, Aktualisieren und Löschen aka CRUD Aufgaben von Einträgen in Datenbanktabellen benutzt.

Seitdem JTable eine abstrakte Klasse ist, welche die Basis für alle Datenbanktabellen-Klassen darstellt, werden einige der aufgelisteten Methoden von Unterklassen überschrieben, sodass man für weitere Informationen die Dokumentation der jeweiligen Unterklasse anschauen sollte. Abgesehen davon, werden seit Joomla! 2.5 alle Attribute in JTable automatisch generiert, basierend auf dem Schema der jeweiligen Tabelle. Das bedeutet, es ist nicht mehr nötig Klassenvariablen zu deklarieren (obwohl man es immer noch tun kann, wenn man will).

Jede erstellte physische Datenbanktabelle sollte als Vertretung eine zugehörige Klasse haben, die von von JTable abgeleitet ist. JTable stellt viele Methoden zur Verfügung, die geläufige Veränderungen der Tabelle sehr viel einfacher macht. Eine der meist gebrauchten Funktionen ist zum Beispiel das Lesen einer Tabellenreihe in den Speicher, anhand eines Primärschlüsselwertes. Das kann einfach mit dem Benutzen der load-Methode bewerkstelligt werden. Dank der save-Methode kann die Tabellenreihe dann einfach aktualisiert werden, welche dabei ebenso vorgegebene Überprüfungen auf die Tabellenfelder ausführt.

Schreiben einer JTable-Erweiterung

Um JTable zu benutzen, erstellt man eine Erweiterung der JTable Klasse. In diesem Beispiel gibt es die Tabelle "#__recipes" mit einem automatisch hochzählenden Primärschlüssel "id", welche alle Rezepte beinhaltet. Das einzige was getan werden muss, um JTable zu benutzen, ist einen Konstruktor in der erweiternden JTable-Klasse zu erstellen. Der Klassenkonstruktor wird den Eltern-Konstruktor aufrufen um die Tabelle zu erhalten: Alles was es braucht ist der Name der Tabelle, den Namen der Primärschlüsselspalte und der Datenbankinstanz.

<?php

defined('_JEXEC') or die();

class TableRecipes extends JTable
{
	public function __construct($db)
	{
		parent::__construct( '#__recipes', 'id', $db );
	}
}

Wird diese Klasse als Teil der Backend-Komponente namens 'Recipes' benutzt, würde man diesen Code in der Datei platzieren: /administrator/components/com_recipes/tables/recipes.php.

Diese Funktionalität kann sowohl in Plugins, als auch in Komponenten benutzt werden. Als generelle Regel sollte man es vermeiden, aus einem Modul heraus, in eine Datenbank zu schreiben und dafür Plugins oder Komponenten zu benutzen. Nicht zu vergessen die eingebauten Konstanten, die man beim Verlinken eines eigenen Pfades benutzen kann (außerhalb des adminstrator/{com_Komponentenname}/tables Ordners).

Benutzen einer JTable-Klassenerweiterung

Sobald die Tabellenklasse fertig ist, kann sie im Model mit der Funktion getTable() benutzt werden.

public function getTable($type = 'Recipes', $prefix = 'Table', $config = array())
{
	return JTable::getInstance($type, $prefix, $config);
}

JTable-Klassen können in irgendwelchen anderen Joomla! Erweiterungen benutzt werden, indem sie JTable::addIncludePath() im Quellcode der Erweiterung nutzen (also com_Komponentenname anstatt com_recipes):

JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_recipes/tables');
$row = JTable::getInstance('recipes', 'Table', array());

Man beachte, dass die kleingeschriebene Version des Suffix des Klassennamens als erster Parameter benutzt wird und der Prefix 'Table' als zweiter. Außerdem gibt die Methode getInstance() von JTable ein JTableObject mit Referenz zurückgibt, anstatt eines Wertes.

Reservierte Datenbankfeldnamen

Manche der optionalen Features von JTable brauchen speziell benannte Felder in der Datenbanktabelle. Wenn man diese zusätzlichen Funktionalitäten braucht, sollte man sicherstellen, dass diese genannten Felder in der Tabelle vorhanden sind. Die Feldnamen sollten als reserviert angesehen werden und bei dem Versuch sie, für etwas anderes als dem von JTable ursprünglich vorgesehenen Zweck zu benutzen, könnten Konflikte entstehen.

Feldname Methoden die den Feldnamen benutzen
checked_out checkOut, checkIn, isCheckedOut
checked_out_time checkOut, checkIn, isCheckedOut
hits hit
ordering getNextOrder, reorder, move
published publish

Check-in/Check-out

Joomla! Tabellen haben einen einfachen Mechanismus implementiert, der eine Race Condition verhindert, während Reihen in der Datenbank verändert werden. Das hängt davon ab, ob die Datenbankfelder namens "checked_out" und "checked_out_time" vorhanden sind und ob diese Felder in der view (JForm) drin sind. JTable unterstützt dann automatisch diesen Mechanismus, sodass er auch einfach in den eigenen Tabellen genutzt werden kann.

Zugriffszähler

Manche Joomla-Tabellen beinhalten ein Feld namens "hits", welches aufnimmt, wie oft die Tabellenreihe aufgerufen wurde. JTable bietet eine einfache Methode, die das Feld hochzählt: hit.

Beispiel JForm-Felder für reservierte Datenbanknamen in JTable

<field	name="state"
	type="list"
	label="JSTATUS"
	description="JFIELD_PUBLISHED_DESC"
	size="1"
	default="1">
	<option value="1">JPUBLISHED</option>
	<option	value="0">JUNPUBLISHED</option>
	<option	value="2">JARCHIVED</option>
	<option	value="-2">JTRASHED</option>
</field>
<field	name="checked_out"
	type="hidden"
	filter="unset"
	/>
<field	name="checked_out_time"
	type="hidden"
	filter="unset"
	/>
<field	name="created_user_id"
	label="JGLOBAL_FIELD_CREATED_BY_LABEL"
	type="hidden"
	filter="unset"
	/>
<field	name="created_time"
	label="JGLOBAL_FIELD_CREATED_LABEL"
	type="hidden"
	filter="unset"
	/>
<field	name="modified_user_id"
	label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
	type="hidden"
	filter="unset"
	/>
<field	name="modified_time"
	label="JGLOBAL_FIELD_MODIFIED_LABEL"
	type="hidden"
	filter="unset"
	/>
<field	name="hits"
	type="text"
	id="hits"
	class="readonly"
	label="JGLOBAL_HITS"
	size="20"
	readonly="true"
	filter="unset"
	/>

Praktische Klassenfunktionen

  • load Methode um einen Datensatz, anhand seines Primärschlüsselwertes (id) oder einer Kombination von Kriterien, in ein JTable-Objekt zu laden.
  • bind Methode um ein JTable-Objekt an ein generisches key/value-Array zu binden. Das heißt, sie weist die Werte eines Arrays einem JTable-Objekt und dessen Attributen zu, bei denen die Array-Schlüssel passen.
  • check Methode um Daten zu überprüfen, bevor sie im Objekt abgelegt werden.
  • store Methode um das Objekt in der Datenbank abzulegen.
  • save Methode die als Abkürzung zum Verbinden, Prüfen und Speichern einer JTable-Instanz in die Datenbanktabelle dient.

Siehe auch


Zusammenfassung

Wenn JTable richtig erweitert wurde, beinhaltet die Klasse alle grundlegenden Funktionen die man braucht, um Einträge in einer Datenbanktabelle zu verwalten und aufzurufen.