Sie befinden sich hier: start » extension_controller

Der Extension Controller

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;