Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Persistente Objekte und Ihre eigenen Tabellen

Die eigene Tabelle Ihrer Erweiterung über eZPersistentObject - definition(), anlegen, speichern, abrufen, Listen mit Bedingungen und Limits, zählen, entfernen, Template-Attribute, Transaktionen.

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/extension-development/part-3-extension-developer/persistent-objects-and-tables.md

On this page

This page is a translation. Read the English original

Persistente Objekte und Ihre eigenen Tabellen

Teil 3, Kapitel 26. Inhalte gehören in Inhaltsklassen. Daten, die keine Inhalte sind (Protokolleinträge, Einstellungen pro Benutzer, eine Warteschlange, Zähler), gehören in eine Tabelle Ihrer Erweiterung, auf die Sie über eZPersistentObject (kernel/classes/ezpersistentobject.php) zugreifen, die Klasse, die jede Tabellenklasse des Kernels erweitert. Sie schreibt sicheres SQL für jede unterstützte Datenbank, sodass Sie selten selbst SQL schreiben.

Die Klasse

extension/mysite_hello/classes/mysitehellogreeting.php:

<?php
/**
 * One greeting, stored in the table mysite_hello_greeting.
 */
class mysiteHelloGreeting extends eZPersistentObject
{
    public static function definition()
    {
        return array(
            'fields' => array(
                'id'      => array( 'name' => 'ID', 'datatype' => 'integer', 'default' => 0, 'required' => true ),
                'name'    => array( 'name' => 'Name', 'datatype' => 'string', 'default' => '', 'required' => true ),
                'user_id' => array( 'name' => 'UserID', 'datatype' => 'integer', 'default' => 0, 'required' => true ),
                'created' => array( 'name' => 'Created', 'datatype' => 'integer', 'default' => 0, 'required' => true )
            ),
            'keys' => array( 'id' ),
            'increment_key' => 'id',
            'function_attributes' => array( 'user' => 'user' ),
            'class_name' => 'mysiteHelloGreeting',
            'sort' => array( 'created' => 'desc' ),
            'name' => 'mysite_hello_greeting'
        );
    }

    /** Creates an unsaved greeting for the current user. */
    public static function create( $name )
    {
        return new self( array( 'name' => (string)$name,
                                'user_id' => eZUser::currentUserID(),
                                'created' => time() ) );
    }

    public static function fetch( $id )
    {
        return eZPersistentObject::fetchObject( self::definition(), null, array( 'id' => (int)$id ) );
    }

    /** The newest greetings, newest first. */
    public static function fetchNewest( $limit = 10, $offset = 0 )
    {
        return eZPersistentObject::fetchObjectList( self::definition(), null, null,
                                                    array( 'created' => 'desc' ),
                                                    array( 'offset' => (int)$offset, 'length' => (int)$limit ) );
    }

    public static function countByUser( $userID )
    {
        return eZPersistentObject::count( self::definition(), array( 'user_id' => (int)$userID ) );
    }

    /** function attribute "user": the user who greeted */
    public function user()
    {
        return eZUser::fetch( $this->attribute( 'user_id' ) );
    }
}

Die Klasse hat php -l bestanden; mit geladenem Kernel lieferte create( 'Ada' ) ein Objekt mit dem Namen und dem aktuellen Benutzer, und dieselben Aufrufe von fetchObjectList() und count(), nur lesend gegen die Tabellenklasse eZSection des Kernels ausgeführt, gaben wie erwartet Objekte und Anzahlen zurück.

Die Definition

SchlüsselBedeutung
fieldsSpaltenname => name (der Attributname in PHP, CamelCase), datatype (integer, string, float), default, required
keysdie Spalten des Primärschlüssels
increment_keydie Auto-Increment-Spalte, nach dem ersten store() gefüllt
function_attributesAttribute, die eine Methode berechnet: 'user' => 'user' lässt $greeting.user in Templates funktionieren
class_namedie Klasse, die für abgerufene Zeilen erzeugt wird
sortdie Standardsortierung
nameder Tabellenname: Stellen Sie ihm den Namen Ihrer Erweiterung voran

Verwendung

<?php
$db = eZDB::instance();
$db->begin();
$greeting = mysiteHelloGreeting::create( 'Ada' );
$greeting->store();                         // INSERT; $greeting->attribute( 'id' ) is now set
$greeting->setAttribute( 'name', 'Ada L.' );
$greeting->store();                         // UPDATE
$db->commit();

$latest = mysiteHelloGreeting::fetchNewest( 5 );
$mine = mysiteHelloGreeting::countByUser( eZUser::currentUserID() );
$greeting->remove();                        // DELETE
MethodeSignatur (aus dem Kernel)
fetchObject()( $def, $field_filters, $conds, $asObject = true, $grouping = null, $custom_fields = null )
fetchObjectList()( $def, $field_filters = null, $conds = [], $sorts = null, $limit = null, $asObject = true, $grouping = false, $custom_fields = null, $custom_tables = null, $custom_conds = null )
count()( $def, $conds = null, $field = null )
store()( $fieldFilters = null )
remove()( $conditions = null, $extraConditions = null )
removeObject()( $def, $conditions = null, $extraConditions = null ), statisch

Bedingungen sind array( 'column' => value ); die Werte werden für Sie maskiert. Weitere Operatoren: array( 'created' => array( '>', $since ) ), array( 'id' => array( array( 1, 2, 3 ) ) ) für eine IN-Liste. $limit ist array( 'offset' => ..., 'length' => ... ).

In Templates

Geben Sie Templates über eine Fetch-Funktion Zugriff (Fetch-Funktionen), die diese Objekte zurückgibt; dann funktionieren {$greeting.name|wash} und {$greeting.user.login} über attribute().

Transaktionen

Umschließen Sie mehrere Schreibvorgänge mit $db->begin() und $db->commit(); bei einem Fehler $db->rollback(). Transaktionen lassen sich verschachteln: Der Kernel zählt sie mit und schreibt auf der äußersten Ebene fest.

Die Tabelle selbst

Die Tabelle muss existieren, bevor irgendetwas davon funktioniert; wie Sie sie ausliefern und aktualisieren, zeigt das nächste Kapitel, Datenbankschema, .dba-Dateien und Upgrades.

Wann nicht

  • Daten, die Redakteure pflegen, versionieren und übersetzen, sind Inhalte: Verwenden Sie eine Klasse und Attribute.
  • Daten pro Inhaltsattribut (viele Tags pro Feld) können in Ihrer eigenen Tabelle liegen, aber der Datentyp muss ihre Zeilen mit den Versionen kopieren und löschen (Speicherung, Validierung und Templates von Datentypen).

RAD

Modul-Assistent (/setup/modulewizard) schreibt ein Modul auf Grundlage vorhandener Tabellen, einschließlich der Klassen für die persistenten Objekte.

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x