Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


extension_controller [2023.12.12 16:02] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== Der Extension Controller ======
  
 +Hier spielt das Leben! Nach dem **M**odel und vor der **V**iew ist der **C**ontroller 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 [[typoscript_constants|Constants]] und [[typoscript_page_setup|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;