Die Seiten (im Seitenbaum - im Folgenden als Page bezeichnet) haben in TYPO3 10 noch nicht die vollständige Extbase-Funktionalität. So gibt es zum Beispiel kein Page-Model und auch kein herkömmliches PageRepository. Damit man nun programmatisch (also zum Beispiel in einem Controller, Task oder sonstwo) eine Page erstellen kann, sind einige Schritte notwendig:
- Page-Model erstellen
- Page-Repository erstellen
- Table-Mapping (pages-Tabelle auf Page-Model)
Anschließend kann man für die TYPO3-Website eine Seite erstellen wie dies von anderen Extbase-Models bekannt ist. Dazu wird zuerst ein Page-Model erstellt (wir haben hierzu ein eigenes BasicPage Model erstellt, welches die "Basic"-Attribute enthält).
TYPO3-Website Page Model erstellen
<?php
namespace Various\VaSite\Domain\Model;
class Basicpage extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
/**
* doktype
*
* @var int
*/
protected $doktype = 0;
/**
* hidden
*
* @var boolean
*/
protected $hidden = false;
/**
* deleted
*
* @var boolean
*/
protected $deleted = false;
/**
* crdate
*
* @var int
*/
protected $crdate = 0;
/**
* title
*
* @var string
*/
protected $title = '';
/**
* subtitle
*
* @var string
*/
protected $subtitle = '';
/**
* Field Media
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
*/
protected $media;
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @return string
*/
public function getSubtitle()
{
return $this->subtitle;
}
/**
* @param string $subtitle
*/
public function setSubtitle($subtitle)
{
$this->subtitle = $subtitle;
}
/**
* @return bool
*/
public function isHidden(): bool
{
return $this->hidden;
}
/**
* @param bool $hidden
*/
public function setHidden(bool $hidden)
{
$this->hidden = $hidden;
}
/**
* @return bool
*/
public function isDeleted(): bool
{
return $this->deleted;
}
/**
* @param bool $deleted
*/
public function setDeleted(bool $deleted)
{
$this->deleted = $deleted;
}
/**
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage
*/
public function getMedia()
{
return $this->media;
}
/**
* @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $media
*/
public function setMedia(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $media)
{
$this->media = $media;
}
public function addMedia(\TYPO3\CMS\Extbase\Domain\Model\FileReference $media)
{
$this->media->attach($media);
}
public function removeMedia(\TYPO3\CMS\Extbase\Domain\Model\FileReference $media)
{
$this->media->detach($media);
}
/**
* @return int
*/
public function getCrdate(): int
{
return $this->crdate;
}
/**
* @param int $crdate
*/
public function setCrdate(int $crdate)
{
$this->crdate = $crdate;
}
/**
* @return int
*/
public function getDoktype(): int
{
return $this->doktype;
}
/**
* @param int $doktype
*/
public function setDoktype(int $doktype)
{
$this->doktype = $doktype;
}
}
Anschließend erstellen wir das PageRepository:
<?php
namespace Various\VaSite\Domain\Repository;
class BasicpageRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
public function initializeObject()
{
/** @var $defaultQuerySettings \TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings */
$defaultQuerySettings =
$this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
$this->setDefaultOrderings(array('crdate' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING));
}
public function findAllFeatured()
{
$query = $this->createQuery();
$query->matching($query->equals('featured', 1));
return $query->execute();
}
}
Das war es im Prinzip auch schon wieder - wie in dem Blogbeitrag "TYPO3 Tipps und Tricks: Extbase Objekte Erweitern / Table mapping in TYPO3 10" beschrieben, wird noch das Table mapping für die TYPO3-Website eingerichtet (in diesem Beispiel beschränken wir das Mapping auf den Doktype 142).
Zur Information: Der Doktype für Standard-Seiten lautet 1.
<?php
declare(strict_types = 1);
return [
\Various\VaSite\Domain\Model\BasicPage::class => [
'tableName' => 'pages',
'recordType' => 142
]
];
Nun kann man ganz einfach eine neue TYPO3-Page erstellen (wie man es von extbase kennt):
$page = new Basicpage();
$page->setPid($examplePid);
$page->setTitle($row['title']);
$page->setCrdate($row['crdate']);
$page->setDescription($row['bodytext']);
$page->setShortdescription($row['bodytext']);
$page->setBackendLayout('pagets__example');
//category
$categoryObjectStorage = new ObjectStorage();
$categoryObjectStorage->attach($sampleCategory);
$page->setCategories($categoryObjectStorage);
//images
$images = new ObjectStorage();
foreach ($row['image'] as $newImage) {
$downloadedImagePath = FileUtility::copyImage($baseUrl . $imageFolder . $newImage, $row['uid'],'fileadmin/' . $imagePath);
$imageFileReferenace = FileUtility::getFileReference('/' . $imagePath . $downloadedImagePath, $examplePid);
$images->attach($imageFileReferenace);
}
$page->setMedia($images);
$basicpageRepository->add($page);
$persistenceManager->persistAll();
Aus der Reihe TYPO3 Tipps und Tricks
-
Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container
-
Manueller/Programmatischer Login in Controller-Action (TYPO3 9)
Weitere interessante Beiträge zum Thema TYPO3 findest du hier.
Wir entwickeln digitale Lösungen mit Leidenschaft
Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.
Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da: