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.

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.

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);
}

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);
}

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);
}

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);
  }  
/**
 * 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);
}
/**
 * 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));
  }
}  

Ein anderes Repository per inject in einen Controller einfügen

/**
 * blogRepository
 * 
 * @var \Ibk\Ibkblog\Domain\Repository\BlogRepository
 * @inject
 */
protected $blogRepository = NULL;
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
  • extension_controller.txt
  • Zuletzt geändert: 21/09/2018 22:07
  • von Thomas Berscheid