Models und Repositories

Tutorial Extensionentwicklung mit TYPO3 Teil 3

Unsere Extension wird "Extbase"

Alles was wir bisher programmiert haben sind zwar wichtige Voraussetzungen für Extbase und Fluid, das Extbaseframework haben wir allerdings noch nicht  benutzt. Hierfür benötigen wir noch die Model und Repository Klassen. Dazu erweitern wir unseren Ordner "Classes" um folgende Unterverzeichnisse:

Classes
 | - Controller
 | - Domain
      | - Model
      | - Repository

Die Models der Produktdatenbank

Innerhalb unseres Classes/Domain/Model Ordners brauchen wir wieder für jede Tabelle eine eigene Datei. Damit auch diese automatisch gefunden werden, entspricht der Dateiname dem letztem Teil unseres Tabellennamens.
Aus tx_tutproduktdatenbank_domain_model_products wird also schlicht Products.php.

Exkurs für Einsteiger in MVC/OOP: Extbase und Fluid basieren auf dem MVC (Model - View - Controller) Konzept und der Objektorientierten Programmierung (OOP). Wärhend in alten pi-Extensions die Daten der Datenbank als Array vorlagen, werden diese Abfragen - vereinfacht gesagt - mithilfe der Models in Objekte überführt. Mit der richtigen Definition innerhalb des Models, sind z.B. so Werte aus verknüpften Dateien direkt erreichbar. Wer tiefer in die EXT Entwicklung einsteigen will, dem empfehle ich ein Buch über MVC Konzepte und OOP zu lesen.

Der Grundaufbau der Models:

namespace \Vendor\Extension\Domain\Model;

class Tablename extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    //Objekt Definitionen, zum Beispiel:

   /**
     * Product Name
     *
     * @var \string
     */
    protected $proName;

    ....

    //Getter, zum Beispiel:

   /**
     * Product Name
    *
     * @return \string $prodName
    */
    public function getProdName() {
        retrun $this->prodName;
    }
}

Die Annotation ist bei der Objekt Deklarierung zwingend erforderlich (inklusive des Typs). Bei den Settern und Gettern ist sie bei einfachen Objekten optional (im Rahmen der guten Programmierung aber durchaus empfehlenswert ;) ). Auf die Setter verzichte ich, da wir zur Datenspeicherung TCA Formulare verwenden und damit keine Datenspeicherung in den Models erfolgt.

Das Model der Products Tabelle

Wie ihr vielleicht schon im Beispiel oben gesehen habt, werden aller underscored Feldnamen nun zu lowerCamelCase. prod_name wird automatisch auf  prodName gemappt.

<?php

namespace T3Developer\TutProduktdatenbank\Domain\Model;

/* * *************************************************************
 *  Copyright notice
 * ************************************************************* */

class Product extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    /**
     * Product Name
     * @var \string
     */
    protected $prodName;

    /**
     * Order
     * @var \int
     */
    protected $prodSort;

    /**
     * Hidden
     * @var \int
     */
    protected $hidden;

    /**
     * Description
     * @var \string
     */
    protected $prodDescription;

    /**
     * Product Images
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
     */
    protected $prodImages;

    /**
     * Category
     * @var \T3Developer\TutProduktdatenbank\Domain\Model\Category
     */
    protected $prodCategory;

    /**
     * Manufacture
     *
     * @var \T3Developer\TutProduktdatenbank\Domain\Model\Manufacture
     */
    protected $prodManufacture;

    /**
     * Description Content
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent>
     */
    protected $prodDescriptioncontent;

    /**
     * Maintext Content
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent>
     */
    protected $prodMaintextcontent;

    /**
     * Benefit Content
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent>
     */
    protected $prodBenefitcontent;

    /**
     * Techdetail content
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent>
     */
    protected $prodTechdetailcontent;

    /**
     * Product Downloads
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
     */
    protected $prodDownloads;

    public function getProdName() {
        return $this->prodName;
    }

    public function getProdSort() {
        return $this->prodSort;
    }

    public function getHidden() {
        return $this->hidden;
    }

    public function getProdDescription() {
        return $this->prodDescription;
    }

    /**
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $prodImages
     */
    public function getProdImages() {
        return $this->prodImages;
    }

    public function getProdCategory() {
        return $this->prodCategory;
    }

    public function getProdManufacture() {
        return $this->prodManufacture;
    }

    /**
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent> $prodDescriptioncontent
     */
    public function getProdDescriptioncontent() {
        return $this->prodDescriptioncontent;
    }

    /**
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent> $prodMaintextcontent
     */
    public function getProdMaintextcontent() {
        return $this->prodMaintextcontent;
    }

    /**
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent> $prodBenefitcontent
     */
    public function getProdBenefitcontent() {
        return $this->prodBenefitcontent;
    }

    /**
     * 
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Developer\TutProduktdatenbank\Domain\Model\Productcontent> $prodTechdetailcontent
     */
    public function getProdTechdetailcontent() {
        return $this->prodTechdetailcontent;
    }

    /**
     * 
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $prodDownloads
     */
    public function getProdDownloads() {
        return $this->prodDownloads;
    }

}


Die Datentypen in der Annotation:

Die Werte \string und \integer brauche ich hoffentlich nicht weiter zu erklären.
Die Produktkategorie hat den Datentyp:

@var \T3Developer\TutProduktdatenbank\Domain\Model\Category

Wir speichern in unserer Datenbank die UID des entsprechenden Datensatztes der Kategorietabelle. TYPO3 "sucht" dann automatisch diesen Datensatz und gibt im Model nicht die UID der Kategorie, sondern den kompletten Kategoriedatensatz aus. Damit haben wir in der Ausgabe zugriff auf alle Felder des Kategoriedatensatzes.

Ähnlich verhält es sich mit dem Eintrag:

@var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $prodImages

Im Unterschied zum Kategoriefeld können mehrere Bilder zugeordnet werden. In Unserer Datenbank wird in der Tabelle Produkte nur ein Zähler geschrieben. Über eine systeminterne Hilfstabelle (sys_filereference) wird eine n:m Beziehung aufgebaut. Auch hier stehen uns in der Ausgabe sämmtliche Felder der  Kindelemente zur Verfügung, nur das diese mit einer Schleife ausgelesen werden müssen.

Die Models der weiteren Tabellen

Die Models der weiteren Tabellen werden hier nur verkürzt dargestellt. Ihr müsst die Getter anlog des Produkt Models noch einfügen.

Maufactures Model

<?php
namespace T3Developer\TutProduktdatenbank\Domain\Model;

/* * *************************************************************
 *  Copyright notice
 * ************************************************************* */

class Manufactures extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    /**
     * Hersteller Name
     * @var \string
     */
    protected $manName;

    /**
     * Hersteller Web
     * @var \string
     */
    protected $manWeb;

 /* Getter müssen eingefügt werden */

}

 

Categories Model

<?php
namespace T3Developer\TutProduktdatenbank\Domain\Model;

/* * *************************************************************
 *  Copyright notice
 * ************************************************************* */

class Categories extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    /**
     * Kategorie Name
     * @var \string
     */
    protected $katName;

 /* Getter müssen eingefügt werden */

}

 

Productcontent Model

<?php
namespace T3Developer\TutProduktdatenbank\Domain\Model;

/* * *************************************************************
 *  Copyright notice
 * ************************************************************* */

class Productcontent extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

   /**
     * Headline
     *
     * @var \string
     */
    protected $headline;

    /**
     * The Text
     * 
     * @var \string
     */
    protected $prodtext;

    /**
     * Images
     * 
     *  @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
     */
    protected $images;
    
    /**
     * Image Position
     * 
     * @var \int
     */
    protected $imageposition;

   

 /* Getter müssen eingefügt werden */

}

Die Repositories

Hier halten wir uns im Augenblick kurz. Für jedes Model mus ein Repository angelegt werden und im Repository Ordner gespeichert werden. Wichtig ist, das der Dateiname auf MyModelRepository endet.Dann klappt es auch mit dem Autoloading und es stehen später im Controller direkt die Standard Queries wie z.B. findAll zur Verfügung.

Insgesamt müssen also 4 Dateien angelegt werden, bitte nicht vergessen die Klassennamen anzupassen!

<?php
namespace T3Developer\TutProduktdatenbank\Domain\Repository;

/* * *************************************************************
 *  Copyright notice
 * ************************************************************* */

class CategoryRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {

}

Damit wollen wir diesen Abschnitt beenden. Im nächsten Teil machen wir erste Backend Eingaben und testen unsere  Extension.

Tutorial Start Nächster Teil

Weitere Artikel zu diesem Thema:

Empfehlenswerte Lektüre:

Git. Verteilte Versionsverwaltung für Code und Dokumente

Das Buch richtet sich an Einsteiger und erfahrene Benutzer die ihre Kenntnisse vervollständigen wollen. Klar strukturiert, mit vielen Beispielen aus der Praxis, hilft das Buch die Funktionsweise von GIT zu verstehen und erklärt alle nötigen Befehele. Für Entwickler unbedingt empfehlenswert.

Kommentare

keine Kommentare vorhanden


Kommentar verfassen

Die Email Adresse wird nicht veröffentlicht.