TYPO3 Tipps und Tricks: Seite programmatisch erstellen / Create Page Programmatically

Wie man eine neue Seite (TYPO3 Page) programmatisch erstellt, zeigen wir in diesem Blogbeitrag. Dies ist zum Beispiel für einen Import oder bei Schnittstellen aus anderen Systemen oder Seiten in eine TYPO3 Website nützlich.

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

<?phpnamespace 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:

<?phpnamespace 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.

<?phpdeclare(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();
Digital Agentur und Webentwicklung

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:

Passend zu diesem Thema:

TYPO3 Tipps und Tricks: Cache für einzelne Extbase-Objekte leeren

TYPO3 Tipps und Tricks: Cache für einzelne Extbase-Objekte leeren

Kürzlich bin ich bei einem Projekt vor folgendem Problem gestanden: Per Plugin werden Extbase-Objekte auf einer Seite ausgegeben und diese auch gecach…

TYPO3 Tipps und Tricks: Manueller/Programmatischer Login in Controller-Action (TYPO3 9)

TYPO3 Tipps und Tricks: Manueller/Programmatischer Login in Controller-Action (T…

Manchmal gibt es bei Web-Projekten die Notwendigkeit einen Login programmatisch (manuell, im PHP-Code) durchzuführen. Ein Kunde hat vor kurzem folgend…

TYPO3 Tipps und Tricks: Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container

TYPO3 Tipps und Tricks: Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-C…

In diesem Blogbeitrag zeigen wir, wie man eine Microsoft SQL-Server (MSSQL) Datenbank in einem Docker-Container mit ddev laufen lässt. Zusätzlich werd…