Der Extension Controller
Hier spielt das Leben! Nach dem Model und vor der View ist der Controller der zentrale Bestandteil einer Extension (Umsetzung des MVC Modells). Hier laufen die Actions ab, hier wird das Respository abgefragt und hier werden den Templates Daten rübergeschickt.
List Action im Controller
Hier sind einige Beispiele für List Actions im Controller.
In vielen Fällen ist die List Action der Einstieg in eine Ansicht - diese Action wird meist als Standard verwendet, wenn beim Aufruf der Extension keine Action übergeben wurde.
Diese Action dient dazu, Objekte aus dem Datenmodell der Extension aufzulisten. Dies kann einfach durch die Standardfunktion findAll erfolgen. Der Umfang der Funktionen lässt sich beinahe grenzenlos erweitern!
Daher hier ein paar Beispiele für eine ListAction.
List Action mit findAll
ListAction: Abfrage aller Blog Objekte und Weitergabe an die View.
Diese Funktion bekommt keine Parameter übergeben.
Die Abfrage geschieht über die findAll
Funktion des Repository - dies ist eine der Standardfunktionen des Extbase Frameworks, die man in TYPO3 nutzen kann, ohne dass man dafür im Repository eine Funktion anlegen muss.
public function listAction() { $blogs = $this->blogRepository->findAll(); $this->view->assign('blogs', $blogs); }
List Action mit Limit und Offset
listAction: Hier wird die oben gezeigte Page Action aufgebohrt.
Aus den Settings (siehe: TypoScript Constants und Setup) werden die Zielseiten für Login und Einbindung des Blog geladen.
Die Parameter für die Paginierung der Seite sind in diesem Fall fest vorgegeben und werden nicht über die Settings geladen.
public function listAction() { $pageLoginUID = $this->settings['pageLoginUID']; $pageStartUID = $this->settings['pageStartUID']; $limit = 5; $offset = 0; $blogs = $this->blogRepository->findBlogs($limit, $offset); $this->view->assign('blogs', $blogs); $this->view->assign('pagestartuid', $pageStartUID); $this->view->assign('pageloginuid', $pageLoginUID); }
List Action mit diversen Parametern
Jetzt kommt's dicke: Dies ist die List Action des IBK Blog Version 2018.
Für diese Listenansicht werden nicht nur jeweils 5 Beiträge abgefragt. Für die User Authentifizierung, die vorhandenen Kategorien und Blog werden noch weitere Parameter abgefragt und an die View weitergeleitet.
Auch zu sehen in dieser Action: Aus der übergebenen URL werden Parameter abgefragt.
public function listAction() { ## Settings auslesen $pid = $this->settings['storagePid']; $pageLoginUID = $this->settings['pageLoginUID']; $pageStartUID = $this->settings['pageStartUID']; ## Alle verfügaren Tags auslesen $tagShowArray = $this->blogRepository->tagShow($pid); $tagCloudArray = $this->blogRepository->tagShow($pid); ## Alle verfügaren Kategorien auslesen $kat = $this->blogRepository->getBlogKategorienCount($pid); $username = $this->blogRepository->getBlogUsername(); ## Standardwerte falls nichts übergeben $limit = 5; $offset = 0; $blogPage = 1; $controller = 'blog'; ## Abfrage des Wertes für Offset $vars = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_ibkblog_blog'); $offsetLink = $vars['offset']; ## Abfrage der Werte für Tags if ($vars = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_ibkblog_tag')) { $offsetLink = $vars['offset']; $blogTagLink = $vars['tagid']; $controller = 'tag'; } ## Abfrage der Werte für Kategorien if ($vars = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_ibkblog_kategories')) { $offsetLink = $vars['offset']; $blogKatLink = $vars['katid']; $controller = 'kat'; } ## Wenn keine Werte übergeben: Standards setzen if ($offsetLink > 0) { $offset = ($offsetLink - 1) * $limit; $blogPage = $offsetLink; } ## Blogs abrufen ## Anzahl der gesamten Blogs abfragen if ($controller == 'tag') { $blogs = $this->blogRepository->findByTag($blogTagLink, $limit, $offset); $countBlogAll = intval($this->blogRepository->countTaggedBlogs($blogTagLink)); } elseif ($controller == 'kat') { $blogs = $this->blogRepository->findByKategorie($blogKatLink, $limit, $offset); $countBlogAll = intval($this->blogRepository->getBlogKategorienCounter($blogKatLink)); } else { $blogs = $this->blogRepository->findBlogs($limit, $offset); $countBlogAll = intval($this->blogRepository->countBlogs()); } ## Daten für Paging $countBlogPages = 0; if ($countBlogAll > $limit) { $countBlogPagesMax = ceil($countBlogAll / $limit); $p = 0; while ($p < $countBlogPagesMax) { $p++; $countBlogPagesArray[] = $p; } } ## Übergabe aller Parameter an die View $this->view->assign('kat', $kat); $this->view->assign('controller', $controller); $this->view->assign('tagshowarray', $tagShowArray); $this->view->assign('tagcloudarray', $tagCloudArray); $this->view->assign('blogs', $blogs); $this->view->assign('username', $username); $this->view->assign('blogcounter', $countBlogPagesArray); $this->view->assign('blogoffset', $blogPage); $this->view->assign('blogtaglink', $blogTagLink); $this->view->assign('blogkatlink', $blogKatLink); $this->view->assign('pagestartuid', $pageStartUID); $this->view->assign('pageloginuid', $pageLoginUID); }
Show Action mit Übergabe eines Objekts
Einfaches Beispiel für die Darstellung eines einzelnen Beitrags in einem Blog.
Die Action bekommt eine Instanz eines Blog Objektes übergeben und reicht diesen weiter an das Template.
/** * action show * * @param \Ibk\Ibkblog\Domain\Model\Blog $blog * @return void */ public function showAction(\Ibk\Ibkblog\Domain\Model\Blog $blog) { $this->view->assign('blog', $blog); }
Anlage eines neuen Blog Beitrags
/** * action new * * @param \Ibk\Ibkblog\Domain\Model\Blog $blog */ public function newAction(\Ibk\Ibkblog\Domain\Model\Blog $blog = NULL) { $pid = $this->settings['storagePid']; $kat = $this->blogRepository->getBlogKategorien($pid); $kategorieArray = $this->blogRepository->getBlogKategorien($pid); $tag = $this->blogRepository->getBlogTags($pid); $this->view->assign('blog', $blog); $this->view->assign('kat', $kat); $this->view->assign('kategorieArray', $kategorieArray[0]); $this->view->assign('tag', $tag); }
Prüfen und Speichern eines neuen Beitrags
/** * action create * * @param \Ibk\Ibkblog\Domain\Model\Blog $blog * @ignorevalidation $blog */ public function createAction(\Ibk\Ibkblog\Domain\Model\Blog $blog) { ## Required fields überprüfen $blogError = 0; if (strlen(trim($blog->getTitel())) == 0) { $blogError++; } if (strlen(trim($blog->getKurzfassung())) == 0) { $blogError++; } if (strlen(trim($blog->getInhalt())) == 0) { $blogError++; } ## Daten zum Speichern bereitstellen $datetime = date('Y-m-d H:i:s'); $blogName = $this->blogRepository->getBlogUsername(); $blogEmail = $this->blogRepository->getBlogEmail(); $blog->setName($blogName); $blog->setEmail($blogEmail); $blog->setDatum($datetime); ## Wenn alle Felder ausgefüllt sind Speichern if ($blogError == 0) { $this->blogRepository->add($blog); $this->view->assign('blog', $blog); } else { $this->forward('new', 'Blog', NULL, array('blog' => $blog)); } }
Zugriff auf ein anderes Repository
Ein anderes Repository per inject
in einen Controller einfügen
/** * blogRepository * * @var \Ibk\Ibkblog\Domain\Repository\BlogRepository * @inject */ protected $blogRepository = NULL;