- typoblog - http://www.typoblog.de -

Teil 5: Implementierung Model Bibliothek – Extension-Entwicklung mit TYPO3 Extbase & Fluid

Teil 5:

Implementierung Model Bibliothek

 

Als für den Moment letztes Model unserer Extension kommt nun das Bibliotheksmodel an die Reihe. Der Aufbau legt fest, dass dieses Model die anderen Models in sich als Relationen vereint und dass von hier aus vor allem die Funktionen ausgelöst werden sollen.

Das Model enthält eine Property für den Namen der Bibliothek und außerdem Relationen zu allen enthaltenen Büchern, Tonträgern und Kunden. Die Bücher und Tonträger folgen einer 1:n-Beziehung zur Bibliothek. Es handelt sich ja um physikalische Gegenstände, die somit auch nur zu einer Bibliothek gehören können. Die Möglichkeiten, sie zwischen verschiedenen Einrichtungen auszutauschen, lassen wir hier mal außen vor. Wir sind mit der Maßgabe gestartet, dass genau eine Bibliothek unsere Extension einsetzt, somit haben wir auch keine Austauschmöglichkeit.

Aus dieser Argumentation ergibt sich dann, dass auch die Kunden einer 1:n-Beziehung zur Bibliothek folgen. Sicherlich können sie auch Kunden bei anderen Bibliotheken sein, aber so lange diese nicht an unser System angeschlossen sind, kann uns das egal sein.

Außerdem könnte man über digitale Ausleihobjekte nachdenken, wie eBooks ….
Ich bemerke gerade wieder, welche Schleifen meine Gedanken beim Entwickeln und Schreiben drehen. Viele dieser Ideen gehen (leider oder zum Glück) wieder verloren, weil ich sie nicht direkt aufschreibe und dann vergesse. Geht Dir das auch so? … zurück zum Thema.

 

Model Bibliothek:

<?php
namespace Typovision\Biblio\Domain\Model;
/** copyright notice **/
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
use TYPO3\CMS\Extbase\Persistence\ObjectStorage;

/**
 * The Main Model representing the building and all its contents and functionality
 */
class Biblio extends AbstractEntity {

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

	/**
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Typovision\Biblio\Domain\Model\Book>
	 */
	protected $books;

	/**
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Typovision\Biblio\Domain\Model\Digital>
	 */
	protected $digitals;

	/**
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Typovision\Biblio\Domain\Model\Client>
	 */
	protected $clients;

	/**
	 * construction
	 */
	public function __construct() {
		$this->initalizeObjectStorages();
	}

	/**
	 * initialize object storages
	 */
	public function initializeObjectStorages() {
		$this->books = new ObjectStorage();
		$this->digitals = new ObjectStorage();
		$this->clients = new ObjectStorage();
	}

  ...
}

 

Alle Beziehungen, die nicht 1:1 sind, werden im Extbase Context über ObjectStorages abgebildet.
Achtung, für diese Definition darf der Klassenname des zu benutzenden Models (also der Teil in <>) nicht in der verkürzten Schreibweise benutzt werden. Das Mapping erfolgt über diese Annotation. Unsere Reflection kann (noch?) nicht mit eventuell vorhandenen use-Statements in der Modelklasse umgehen, darum muss der Name voll qualifiziert aufgeführt sein.

Getter und Setter hinzufügen, TCA und SQL anpassen, Labels in die locallang.xlf schreiben – fertig.

 

TCA (nur die relevanten Teile):

<?php
return array(
	'ctrl' => array(
		'title' => 'LLL:EXT:biblio/Resources/Private/Language/locallang_db.xlf:tx_biblio_domain_model_biblio',
		'label' => 'name',
		'tstamp' => 'tstamp',
		'crdate' => 'crdate',
		'cruser_id' => 'cruser_id',
		'dividers2tabs' => TRUE,
		'sortby' => 'sorting',
		'versioningWS' => 2,
		'versioning_followPages' => TRUE,
		'origUid' => 't3_origuid',
		'languageField' => 'sys_language_uid',
		'transOrigPointerField' => 'l10n_parent',
		'transOrigDiffSourceField' => 'l10n_diffsource',
		'delete' => 'deleted',
		'enablecolumns' => array(
			'disabled' => 'hidden',
			'starttime' => 'starttime',
			'endtime' => 'endtime',
		),
		'iconfile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath('biblio') . 'Resources/Public/Icons/tx_biblio_domain_model_biblio.gif',
		'searchFields' => 'name'
	),
	'interface' => array(
		'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, name, books, digitals, clients',
	),
	'columns' => array(
<< insert system field definition here >>
		'name' => array(
			'exclude' => 0,
			'label' => 'LLL:EXT:biblio/Resources/Private/Language/locallang_db.xlf:tx_biblio_domain_model_biblio.name',
			'config' => array(
				'type' => 'input',
				'size' => 30,
				'max' => 255,
				'eval' => 'trim'
			),
		),
		'books' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:biblio/Resources/Private/Language/locallang_db.xlf:tx_biblio_domain_model_biblio.books',
			'config' => array(
				'type' => 'select',
				'size' => '5',
				'maxitems' => '999999',
				'foreign_table' => 'tx_biblio_domain_model_book',
			),
		),
		'digitals' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:biblio/Resources/Private/Language/locallang_db.xlf:tx_biblio_domain_model_biblio.digitals',
			'config' => array(
				'type' => 'select',
				'size' => '5',
				'maxitems' => '999999',
				'foreign_table' => 'tx_biblio_domain_model_digital',
			),
		),
		'clients' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:biblio/Resources/Private/Language/locallang_db.xlf:tx_biblio_domain_model_biblio.clients',
			'config' => array(
				'type' => 'select',
				'size' => '5',
				'maxitems' => '999999',
				'foreign_table' => 'tx_biblio_domain_model_client',
			),
		),
	),
	'types' => array(
		'1' => array(
			'showitem' => 'hidden, name, books, digitals, clients',
		),
	),
);

 

SQL Definition:

#
# Table structure for table 'tx_biblio_domain_model_biblio'
#
CREATE TABLE tx_biblio_domain_model_biblio (

  uid int(11) NOT NULL auto_increment,
  pid int(11) DEFAULT '0' NOT NULL,

  name varchar(255) DEFAULT '' NOT NULL,
  books int(11) DEFAULT '0' NOT NULL,
  digitals int(11) DEFAULT '0' NOT NULL,
  clients int(11) DEFAULT '0' NOT NULL,

  << system felder und index keys wie oben >>
);

 

Wir werden uns hier nicht mit n:m-Beziehung beschäftigen. Im Handling sind die nicht anders als 1:n, nur TCA und Datenbank unterscheiden sich und man braucht eine zusätzliche mm-Tabelle. Vielleicht kommt dazu auch noch was, aber im Moment ist das Thema schon komplex genug, ich muss mir grade keine künstliche Anforderung ausdenken, die wir dann so verbiegen, bis wir sie mit einer m:n-Beziehung belegen können, nur um sie zu haben.

Damit wäre die erste Phase abgeschlossen und wir können den Versuch starten, die Extension zu installieren und die Datenbank zu aktualisieren. Was anschließend funktionieren sollte, ist das Anlegen und Bearbeiten unserer Models als Datarecords im Backend über die eingebaute Funktion von TCEforms.

Also in die Instanz wechseln, den ExtensionManager aktivieren, die Extension in der Liste suchen und aktivieren. Dann einen Systemordner in den Seitenbaum anlegen und da drin einmal versuchen, von jedem Model eine Instanz anzulegen. Wenn das jetzt auch noch problemlos funktioniert, ist es an der Zeit, den kleinen Erfolg zu feiern.

Vorschau auf den nächsten Beitrag: Weiter geht es mit dem Bibliothekcontroller.

 

Beitrag verpasst?
Extension-Entwicklung mit TYPO3 Extbase & Fluid

Teil 1: Entstehung der Blogreihe, Idee & Datenmodellierung
Teil 2: Das Grundgerüst
Teil 3: Implementierung
Teil 4: Implementierung Kunden Model [1]