SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
Überblick über FLOW3 mit dem
  Blog-Package als Referenz
Agenda


     • Domain Model
     • Package Aufbau
     • Model
        • Validation
        • Association Mapping
     • Model und Repository
     • Repository
        • Blog Repsitory
        • Post Repository
     • Controller
     • View
     • Validation
     • Routing




Datum: 10.01.2012     FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                         2
Domain Model




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                       3
Package Aufbau




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                       4
Model


    • Namespace
    namespaceBlogDomainModel;


   • Namespace
    namespace TYPO3BlogDomainModel;


    • Namespace
    namespace TYPO3BlogDomainModel;


   • Namespace
    namespace TYPO3BlogDomainModel;



Datum: 06.12.2011     FLOW3 Einführung / log Package www.cross-content.com   @MarkusGoldbeck
                                                                                         5
TYPO3BlogDomainModel Post


    • Namespace
    namespace TYPO3BlogDomainModel;

   • Annotations
    use DoctrineORMMapping as ORM;
    use TYPO3FLOW3Annotations as FLOW3;

   • Class Post
      • Dieses Model nach den Konzepten von DDD eine Entitiy
      • Instanzen dieser Klasse können gespeichert werden
    /**
     * A blog
     *
     * @FLOW3Entity
     */
    class Post {
Datum: 10.01.2012      FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                          6
TYPO3BlogDomainModel Post


    • Properties
       • Variablen Deklaration als String
       • Validierung auf Datentyp und Länge
       • Validierung des Datentyps innerhalb des Models und Repositories

    /**
     * The post‘s title.
     *
     * @var string
     * @FLOW3Validate(type="Text")
     * @FLOW3Validate(type="StringLength", options={ "minimum"=1,
    "maximum"=80 })
     * @ORMColumn(length=80)
     */
    protected $title = '';




Datum: 10.01.2012     FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                         7
TYPO3BlogDomainModel Post


    • Property $date
       • Deklaration als Date Objekt
       • Identity
    /**
    * @FLOW3Identity
    * @var DateTime
    */
    protected $date;

    • Property $blog
       • Deklaration als Blog Objekt
       • Association Mapping OneToMany
    /**
    * @var TYPO3BlogDomainModelBlog
    * @ORMManyToOne(inversedBy="posts")
    */
    protected $blog;

Datum: 10.01.2012      FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                          8
Association Mapping


    • OneToMany <-> ManyToOne
     /** The posts contained in this blog
     * @var DoctrineCommonCollectionsCollection<TYPO3Blog
    DomainModelPost>
     * @ORMOneToMany(mappedBy="blog")
     * @ORMOrderBy({"date" = "DESC"})
     */
    protected $posts;

      Model Blog                                                            Model Post
       $posts                                                                 $blog
    /**The blog
     * @var TYPO3BlogDomainModelBlog
     * @ORMManyToOne(inversedBy="posts")
     */
    protected $blog;

Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com        @MarkusGoldbeck
                                                                                            9
Association Mapping


    • ManyToMany <-> ManyToMany
    /**
    * @var DoctrineCommonCollectionsCollection<TYPO3Blog
    DomainModelTag>
    * @ORMManyToMany(inversedBy="posts")
    */
    protected $tags;

      Model Post                                                            Model Tag
        $tags                                                                $posts
    /**The posts tagged with this tag
    * @var DoctrineCommonCollectionsCollection<TYPO3Blog
    DomainModelPost>
    * @ORMManyToMany(mappedBy="tags")
    */
    protected $posts;

Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com        @MarkusGoldbeck
                                                                                           10
TYPO3BlogDomainModel Blog




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                      11
TYPO3BlogDomainModel Post




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                      12
TYPO3BlogDomainModel Blog


    • Setter
     /**Sets this blog's title
     * @param string $title The blog's title
     * @return void
     */
     public function setTitle($title) {
        $this->title = $title;
     }


    • Getter
    /**Returns the blog's title
    * @return string The blog's title
    */
    public function getTitle() {
       return $this->title;
    }


Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                      13
Model und Repositories




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                      14
Blog Repository


    • Standard Blog Repository
    <?php
    namespace TYPO3BlogDomainRepository;
    /*
      * This script belongs to the FLOW3 package "TYPO3.Blog".
    */
    /**
      * A repository for Blogs
      *
      * @FLOW3Scope("singleton")
      */
    class BlogRepository extends TYPO3FLOW3PersistenceRepository
    {
             // add customized methods here
    }
    ?>



Datum: 10.01.2012     FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                        15
Blog Repository


    • Standard Methoden des Repositories
       • add
       • remove
       • findAll
       • findBy* (magic methods)
       • findOneBy* (magic methods)

    findBy* und findOneBy* sind sog. Magic Methods die durch das Repository
    zur Verfügung gestellt werden. Diese Methoden erlauben einen Objekte durch
    Properties zu finden.
    Das BlogRepository zum Beispiel erlaubt einem die Magic Methoden
    findByDescription('foo') oder findOneByTitle('bar')auszuführen.




Datum: 10.01.2012     FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                        16
Post Repository


    • Post Repository spezifische Methode findByBlog
    /**
      * Finds posts by the specified blog
      * @param TYPO3BlogDomainModelBlog $blog The blog the post
    must refer to
      * @param integer $limit The number of posts to return at max
      * @return TYPO3FLOW3PersistenceQueryResultProxy The posts
      */
    public function findByBlog(TYPO3BlogDomainModelBlog $blog)
    {
       $query = $this->createQuery();
       return $query->matching($query->equals('blog', $blog))
               ->setOrderings(
                 array('date' => QueryInterface::ORDER_DESCENDING))
               ->execute();
    }



Datum: 10.01.2012    FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                       17
Post Repository


    • Post Repository spezifische Methode findByTagAndBlog
    /**Finds posts by the specified tag and blog
    * @param TYPO3BlogDomainModelTag $tag
    * @param TYPO3BlogDomainModelBlog $blog The blog the post
    must refer to
    * @return TYPO3FLOW3PersistenceQueryResultProxy The posts */
    public function findByTagAndBlog(TYPO3BlogDomainModelTag
    $tag, TYPO3BlogDomainModelBlog $blog) {
         $query = $this->createQuery();
         return $query->matching(
              $query->logicalAnd(
                $query->equals('blog', $blog),
                $query->contains('tags', $tag)
              )
           )
           ->setOrderings(array('date' =>
    QueryInterface::ORDER_DESCENDING))
           ->execute();
      }
Datum: 10.01.2012    FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                       18
Post Repository


    • Post Repository spezifische Methode findRecentByBlog
    /**
    * Finds most recent posts by the specified blog
    *
    * @param TYPO3BlogDomainModelBlog $blog The blog the post
    must refer to
    * @param integer $limit The number of posts to return at max
    * @return TYPO3FLOW3PersistenceQueryResultProxy The posts
    */
    public function findRecentByBlog(TYPO3BlogDomainModelBlog
    $blog, $limit = 5) {
         $query = $this->createQuery();
         return $query->matching($query->equals('blog', $blog))
           ->setOrderings(array('date' =>
    QueryInterface::ORDER_DESCENDING))
           ->setLimit($limit)
           ->execute();
       }

Datum: 10.01.2012    FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                       19
Post Controller


    • Post Controller indexAction()
    /**
    * List action for this controller. Displays latest posts
    * @param TYPO3BlogDomainModelTag $tag The tag to display posts for
    * @param TYPO3BlogDomainModelCategory $category The category to display posts
    for
    * @return void
    */
    public function indexAction(TYPO3BlogDomainModelTag $tag = NULL, TYPO3Blog
    DomainModelCategory $category = NULL) {
        if ($tag === NULL && $category === NULL) {
           $posts = $this->postRepository->findByBlog($this->blog);
        } elseif ($tag !== NULL) {
           $posts = $this->postRepository->findByTagAndBlog($tag, $this->blog);
           $this->view->assign('tag', $tag);
        } else {
           $posts = $this->postRepository->findByCategoryAndBlog($category, $this->blog);
           $this->view->assign('category', $category);
        }
        $this->view->assign('blog', $this->blog);
        $this->view->assign('posts', $posts);
        $this->view->assign('recentPosts', $this->postRepository->findRecentByBlog($this-
    >blog));
    }


Datum: 10.01.2012        FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                            20
Post Controller


    • Post Controller Dependency Injection
    /**
    * @FLOW3Inject
    * @var TYPO3BlogDomainRepositoryCategoryRepository
    */
    protected $categoryRepository;

    /**Displays a form for creating a new post
    * @return void
    */
    public function newAction() {
       $account = $this->findCurrentAccount();
       $newPost = new TYPO3BlogDomainModelPost();
       $newPost->setAuthor($account->getParty()->getName()->getFullName());

       $this->view->assign('blog', $this->blog);
       $this->view->assign('existingPosts', $this->postRepository->findByBlog($this-
    >blog));
       $this->view->assign('categories', $this->categoryRepository->findAll());
       $this->view->assign('newPost', $newPost);
    }




Datum: 10.01.2012       FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                          21
View




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                      22
View


    • Master Template - /Private/Layouts/Master.html
    <body>
       <div id="header">
           <!-- some stuff -->
       </div>
       <div id="maincontainer">
           <div id="mainbox"><f:render section="mainbox" /></div>

    • Post Template - /Private/Template/Post/Edit.html
    <f:layout name="Master" />         /Private/Layouts/Master.html
    <f:section name="mainbox">
       <!-- some formular-->
       <f:render partial="FormErrors" arguments="{for: 'post'}" />
    </f:section>                   /Private/Partials/FormErrors.html
    • Partial Template - /Private/Partials/FormErrors.html
    <f:form.validationResults for="{for}">
       <f:if condition="{validationResults.flattenedErrors}">
          <!-- -->

       </f:if>
    </f:form.validationResults>

Datum: 10.01.2012        FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                           23
View


    • security - /Private/Templates/Post/Index.html
    <f:security.ifHasRole role="Editor">
       <div id="navigation">
           <span class="buttons"><f:link.action action="new" controller="Post"><img
    src="{f:uri.resource(path: 'Icons/FamFamFam/page_add.png')}"
    title="{f:translate(value: 'Create a new post')}"/></f:link.action></span>
           <div class="clear"></div>
       </div>
    </f:security.ifHasRole>




Datum: 10.01.2012        FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                           24
Validation


    • Partial Template - /Private/Partials/FormErrors.html
    <f:form.validationResults for="{for}">      Objekt Post wurde übergeben
       <f:if condition="{validationResults.flattenedErrors}">
           <dl class="errors">
              <f:for each="{validationResults.flattenedErrors}" key="propertyPath"
    as="errors">
                  <dt> {propertyPath}: </dt>
                  <dd> <f:for each="{errors}" as="error">{error}</f:for> </dd>
              </f:for>
           </dl>
       </f:if>
    </f:form.validationResults>


    <f:render
      partial="FormErrors"
      arguments="{for: 'post'}" />




Datum: 10.01.2012       FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                          25
Routing Subroute


    • Route auf das TYPO3.Blog Package /Configuration/Routes.yaml
    ##
    # Blog subroutes

    -
        name: 'Blog'
        uriPattern: '<BlogSubroutes>'
        defaults:
          '@package': 'TYPO3.Blog'
          '@format': 'html'
        subRoutes:
          BlogSubroutes:
            package: 'TYPO3.Blog'

    • Routet auf das TYPO3.Blog Package /Packages/Application/TYPO3.Blog/
      Routes.yaml
    • Erste zutreffende Regel in Routes.yaml wird ausgeführt.
    • nur Leerzeichen verwenden, keine Tabs.

Datum: 10.01.2012    FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                       26
Routing Package


    • /Packages/Application/TYPO3.Blog/Routes.yaml
    -
        name: 'Post index'
        uriPattern:    '(posts)'
        defaults:
          '@package':    'TYPO3.Blog'
          '@controller': 'Post'
          '@action':     'index'
          '@format':     'html'

    • passt für http://mfug.demo/ und http://mfug.demo/posts, da durch die
    Klammern posts optional ist.




Datum: 10.01.2012      FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                         27
Routing Package


    • Action Routing
    •/Packages/Application/TYPO3.Blog/Routes.yaml
    -
        name: 'Post actions 1'
        uriPattern:    'posts/{@action}'
        defaults:
          '@controller': 'Post'

    • passt http://mfug.demo/posts/new




Datum: 10.01.2012     FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                        28
Routing Package


    • Object Routes Part
    •/Packages/Application/TYPO3.Blog/Routes.yaml
    http://dev.tutorial.local/post/edit?post%5B__identity%5D=229e2b23-b6f3-4422-8b7a-
    efb196dbc88b


    -
        name: 'Post actions 2'
        uriPattern:     'posts/{post}/{@action}'
        defaults:
          '@controller': 'Post'
        routeParts:
          post:
            objectType: 'TYPO3BlogDomainModelPost'
            uriPattern: '{date:Y}/{date:m}/{date:d}/{title}'


    http://dev.tutorial.local/post/2010/01/18/post-title/edit
Datum: 10.01.2012          FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                             29
Quellen


    • FLOW3 Dokumentation
      http://flow3.typo3.org/documentation/guide.html

    • FLOW3 Blog Package TYPO3.Blog
      http://forge.typo3.org/projects/show/package-typo3-blog




Datum: 10.01.2012   FLOW3 Einführung / Blog Package www.cross-content.com   @MarkusGoldbeck
                                                                                      30
Kontakt




    Cross Content Media                                      Twitter: @MarkusGoldbeck
    Gesellschaft für Online Business Solutions mbH           E-Mail: mgoldbeck@cross-content.com
    Landshuter Allee 8
                                                             www.cross-content.com
    80637 München




Datum: 10.01.2012              FLOW3 Einführung / Blog Package www.cross-content.com               @MarkusGoldbeck
                                                                                                              31

Weitere ähnliche Inhalte

Ähnlich wie Einführung in FLOW3/ Blog Package

Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)Robert Lemke
 
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013swentel
 
Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Robert Lemke
 
IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3Robert Lemke
 
Angular 1.5 Components
Angular 1.5 ComponentsAngular 1.5 Components
Angular 1.5 ComponentsJosé Barbosa
 
The Beauty and the Beast
The Beauty and the BeastThe Beauty and the Beast
The Beauty and the BeastBastian Feder
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP ApplicationsPavan Kumar N
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Karsten Dambekalns
 
Getting Into FLOW3 (TYPO312CA)
Getting Into FLOW3 (TYPO312CA)Getting Into FLOW3 (TYPO312CA)
Getting Into FLOW3 (TYPO312CA)Robert Lemke
 
Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)Robert Lemke
 
Documentation with sphinx @ PyHug
Documentation with sphinx @ PyHugDocumentation with sphinx @ PyHug
Documentation with sphinx @ PyHugJimmy Lai
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Guillaume Laforge
 
IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3Robert Lemke
 
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...Peter Keane
 
Modeling Tricks My Relational Database Never Taught Me
Modeling Tricks My Relational Database Never Taught MeModeling Tricks My Relational Database Never Taught Me
Modeling Tricks My Relational Database Never Taught MeDavid Boike
 
Creating WordPress Theme Faster, Smarter & Without Swearing
Creating WordPress Theme Faster, Smarter & Without SwearingCreating WordPress Theme Faster, Smarter & Without Swearing
Creating WordPress Theme Faster, Smarter & Without Swearingmartinwolak
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injectionsrmelody
 

Ähnlich wie Einführung in FLOW3/ Blog Package (20)

Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)Getting Into FLOW3 (DPC12)
Getting Into FLOW3 (DPC12)
 
Inside DocBlox
Inside DocBloxInside DocBlox
Inside DocBlox
 
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013Drupal 8 configuration system for coders and site builders - Drupalaton 2013
Drupal 8 configuration system for coders and site builders - Drupalaton 2013
 
Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0
 
IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3IPCSE12: Getting into FLOW3
IPCSE12: Getting into FLOW3
 
Angular 1.5 Components
Angular 1.5 ComponentsAngular 1.5 Components
Angular 1.5 Components
 
MVC for TYPO3 4.3 with extbase
MVC for TYPO3 4.3 with extbaseMVC for TYPO3 4.3 with extbase
MVC for TYPO3 4.3 with extbase
 
The Beauty and the Beast
The Beauty and the BeastThe Beauty and the Beast
The Beauty and the Beast
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP Applications
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
 
Getting Into FLOW3 (TYPO312CA)
Getting Into FLOW3 (TYPO312CA)Getting Into FLOW3 (TYPO312CA)
Getting Into FLOW3 (TYPO312CA)
 
Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)
 
Documentation with sphinx @ PyHug
Documentation with sphinx @ PyHugDocumentation with sphinx @ PyHug
Documentation with sphinx @ PyHug
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
 
IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3
 
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
 
Mongo-Drupal
Mongo-DrupalMongo-Drupal
Mongo-Drupal
 
Modeling Tricks My Relational Database Never Taught Me
Modeling Tricks My Relational Database Never Taught MeModeling Tricks My Relational Database Never Taught Me
Modeling Tricks My Relational Database Never Taught Me
 
Creating WordPress Theme Faster, Smarter & Without Swearing
Creating WordPress Theme Faster, Smarter & Without SwearingCreating WordPress Theme Faster, Smarter & Without Swearing
Creating WordPress Theme Faster, Smarter & Without Swearing
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injection
 

Kürzlich hochgeladen

The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfJayanti Pande
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)eniolaolutunde
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfciinovamais
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfsanyamsingh5019
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxNirmalaLoungPoorunde1
 
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...EduSkills OECD
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactdawncurless
 
CARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxCARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxGaneshChakor2
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphThiyagu K
 
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...Marc Dusseiller Dusjagr
 
Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingTechSoup
 
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...RKavithamani
 

Kürzlich hochgeladen (20)

The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdf
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdf
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptx
 
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptxINDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impact
 
CARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxCARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptx
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot Graph
 
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
 
Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy Consulting
 
Staff of Color (SOC) Retention Efforts DDSD
Staff of Color (SOC) Retention Efforts DDSDStaff of Color (SOC) Retention Efforts DDSD
Staff of Color (SOC) Retention Efforts DDSD
 
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
 
Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1
 
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdfTataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
 

Einführung in FLOW3/ Blog Package

  • 1. Überblick über FLOW3 mit dem Blog-Package als Referenz
  • 2. Agenda • Domain Model • Package Aufbau • Model • Validation • Association Mapping • Model und Repository • Repository • Blog Repsitory • Post Repository • Controller • View • Validation • Routing Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 2
  • 3. Domain Model Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 3
  • 4. Package Aufbau Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 4
  • 5. Model • Namespace namespaceBlogDomainModel; • Namespace namespace TYPO3BlogDomainModel; • Namespace namespace TYPO3BlogDomainModel; • Namespace namespace TYPO3BlogDomainModel; Datum: 06.12.2011 FLOW3 Einführung / log Package www.cross-content.com @MarkusGoldbeck 5
  • 6. TYPO3BlogDomainModel Post • Namespace namespace TYPO3BlogDomainModel; • Annotations use DoctrineORMMapping as ORM; use TYPO3FLOW3Annotations as FLOW3; • Class Post • Dieses Model nach den Konzepten von DDD eine Entitiy • Instanzen dieser Klasse können gespeichert werden /** * A blog * * @FLOW3Entity */ class Post { Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 6
  • 7. TYPO3BlogDomainModel Post • Properties • Variablen Deklaration als String • Validierung auf Datentyp und Länge • Validierung des Datentyps innerhalb des Models und Repositories /** * The post‘s title. * * @var string * @FLOW3Validate(type="Text") * @FLOW3Validate(type="StringLength", options={ "minimum"=1, "maximum"=80 }) * @ORMColumn(length=80) */ protected $title = ''; Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 7
  • 8. TYPO3BlogDomainModel Post • Property $date • Deklaration als Date Objekt • Identity /** * @FLOW3Identity * @var DateTime */ protected $date; • Property $blog • Deklaration als Blog Objekt • Association Mapping OneToMany /** * @var TYPO3BlogDomainModelBlog * @ORMManyToOne(inversedBy="posts") */ protected $blog; Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 8
  • 9. Association Mapping • OneToMany <-> ManyToOne /** The posts contained in this blog * @var DoctrineCommonCollectionsCollection<TYPO3Blog DomainModelPost> * @ORMOneToMany(mappedBy="blog") * @ORMOrderBy({"date" = "DESC"}) */ protected $posts; Model Blog Model Post $posts $blog /**The blog * @var TYPO3BlogDomainModelBlog * @ORMManyToOne(inversedBy="posts") */ protected $blog; Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 9
  • 10. Association Mapping • ManyToMany <-> ManyToMany /** * @var DoctrineCommonCollectionsCollection<TYPO3Blog DomainModelTag> * @ORMManyToMany(inversedBy="posts") */ protected $tags; Model Post Model Tag $tags $posts /**The posts tagged with this tag * @var DoctrineCommonCollectionsCollection<TYPO3Blog DomainModelPost> * @ORMManyToMany(mappedBy="tags") */ protected $posts; Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 10
  • 11. TYPO3BlogDomainModel Blog Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 11
  • 12. TYPO3BlogDomainModel Post Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 12
  • 13. TYPO3BlogDomainModel Blog • Setter /**Sets this blog's title * @param string $title The blog's title * @return void */ public function setTitle($title) { $this->title = $title; } • Getter /**Returns the blog's title * @return string The blog's title */ public function getTitle() { return $this->title; } Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 13
  • 14. Model und Repositories Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 14
  • 15. Blog Repository • Standard Blog Repository <?php namespace TYPO3BlogDomainRepository; /* * This script belongs to the FLOW3 package "TYPO3.Blog". */ /** * A repository for Blogs * * @FLOW3Scope("singleton") */ class BlogRepository extends TYPO3FLOW3PersistenceRepository { // add customized methods here } ?> Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 15
  • 16. Blog Repository • Standard Methoden des Repositories • add • remove • findAll • findBy* (magic methods) • findOneBy* (magic methods) findBy* und findOneBy* sind sog. Magic Methods die durch das Repository zur Verfügung gestellt werden. Diese Methoden erlauben einen Objekte durch Properties zu finden. Das BlogRepository zum Beispiel erlaubt einem die Magic Methoden findByDescription('foo') oder findOneByTitle('bar')auszuführen. Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 16
  • 17. Post Repository • Post Repository spezifische Methode findByBlog /** * Finds posts by the specified blog * @param TYPO3BlogDomainModelBlog $blog The blog the post must refer to * @param integer $limit The number of posts to return at max * @return TYPO3FLOW3PersistenceQueryResultProxy The posts */ public function findByBlog(TYPO3BlogDomainModelBlog $blog) { $query = $this->createQuery(); return $query->matching($query->equals('blog', $blog)) ->setOrderings( array('date' => QueryInterface::ORDER_DESCENDING)) ->execute(); } Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 17
  • 18. Post Repository • Post Repository spezifische Methode findByTagAndBlog /**Finds posts by the specified tag and blog * @param TYPO3BlogDomainModelTag $tag * @param TYPO3BlogDomainModelBlog $blog The blog the post must refer to * @return TYPO3FLOW3PersistenceQueryResultProxy The posts */ public function findByTagAndBlog(TYPO3BlogDomainModelTag $tag, TYPO3BlogDomainModelBlog $blog) { $query = $this->createQuery(); return $query->matching( $query->logicalAnd( $query->equals('blog', $blog), $query->contains('tags', $tag) ) ) ->setOrderings(array('date' => QueryInterface::ORDER_DESCENDING)) ->execute(); } Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 18
  • 19. Post Repository • Post Repository spezifische Methode findRecentByBlog /** * Finds most recent posts by the specified blog * * @param TYPO3BlogDomainModelBlog $blog The blog the post must refer to * @param integer $limit The number of posts to return at max * @return TYPO3FLOW3PersistenceQueryResultProxy The posts */ public function findRecentByBlog(TYPO3BlogDomainModelBlog $blog, $limit = 5) { $query = $this->createQuery(); return $query->matching($query->equals('blog', $blog)) ->setOrderings(array('date' => QueryInterface::ORDER_DESCENDING)) ->setLimit($limit) ->execute(); } Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 19
  • 20. Post Controller • Post Controller indexAction() /** * List action for this controller. Displays latest posts * @param TYPO3BlogDomainModelTag $tag The tag to display posts for * @param TYPO3BlogDomainModelCategory $category The category to display posts for * @return void */ public function indexAction(TYPO3BlogDomainModelTag $tag = NULL, TYPO3Blog DomainModelCategory $category = NULL) { if ($tag === NULL && $category === NULL) { $posts = $this->postRepository->findByBlog($this->blog); } elseif ($tag !== NULL) { $posts = $this->postRepository->findByTagAndBlog($tag, $this->blog); $this->view->assign('tag', $tag); } else { $posts = $this->postRepository->findByCategoryAndBlog($category, $this->blog); $this->view->assign('category', $category); } $this->view->assign('blog', $this->blog); $this->view->assign('posts', $posts); $this->view->assign('recentPosts', $this->postRepository->findRecentByBlog($this- >blog)); } Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 20
  • 21. Post Controller • Post Controller Dependency Injection /** * @FLOW3Inject * @var TYPO3BlogDomainRepositoryCategoryRepository */ protected $categoryRepository; /**Displays a form for creating a new post * @return void */ public function newAction() { $account = $this->findCurrentAccount(); $newPost = new TYPO3BlogDomainModelPost(); $newPost->setAuthor($account->getParty()->getName()->getFullName()); $this->view->assign('blog', $this->blog); $this->view->assign('existingPosts', $this->postRepository->findByBlog($this- >blog)); $this->view->assign('categories', $this->categoryRepository->findAll()); $this->view->assign('newPost', $newPost); } Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 21
  • 22. View Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 22
  • 23. View • Master Template - /Private/Layouts/Master.html <body> <div id="header"> <!-- some stuff --> </div> <div id="maincontainer"> <div id="mainbox"><f:render section="mainbox" /></div> • Post Template - /Private/Template/Post/Edit.html <f:layout name="Master" /> /Private/Layouts/Master.html <f:section name="mainbox"> <!-- some formular--> <f:render partial="FormErrors" arguments="{for: 'post'}" /> </f:section> /Private/Partials/FormErrors.html • Partial Template - /Private/Partials/FormErrors.html <f:form.validationResults for="{for}"> <f:if condition="{validationResults.flattenedErrors}"> <!-- --> </f:if> </f:form.validationResults> Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 23
  • 24. View • security - /Private/Templates/Post/Index.html <f:security.ifHasRole role="Editor"> <div id="navigation"> <span class="buttons"><f:link.action action="new" controller="Post"><img src="{f:uri.resource(path: 'Icons/FamFamFam/page_add.png')}" title="{f:translate(value: 'Create a new post')}"/></f:link.action></span> <div class="clear"></div> </div> </f:security.ifHasRole> Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 24
  • 25. Validation • Partial Template - /Private/Partials/FormErrors.html <f:form.validationResults for="{for}"> Objekt Post wurde übergeben <f:if condition="{validationResults.flattenedErrors}"> <dl class="errors"> <f:for each="{validationResults.flattenedErrors}" key="propertyPath" as="errors"> <dt> {propertyPath}: </dt> <dd> <f:for each="{errors}" as="error">{error}</f:for> </dd> </f:for> </dl> </f:if> </f:form.validationResults> <f:render partial="FormErrors" arguments="{for: 'post'}" /> Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 25
  • 26. Routing Subroute • Route auf das TYPO3.Blog Package /Configuration/Routes.yaml ## # Blog subroutes - name: 'Blog' uriPattern: '<BlogSubroutes>' defaults: '@package': 'TYPO3.Blog' '@format': 'html' subRoutes: BlogSubroutes: package: 'TYPO3.Blog' • Routet auf das TYPO3.Blog Package /Packages/Application/TYPO3.Blog/ Routes.yaml • Erste zutreffende Regel in Routes.yaml wird ausgeführt. • nur Leerzeichen verwenden, keine Tabs. Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 26
  • 27. Routing Package • /Packages/Application/TYPO3.Blog/Routes.yaml - name: 'Post index' uriPattern: '(posts)' defaults: '@package': 'TYPO3.Blog' '@controller': 'Post' '@action': 'index' '@format': 'html' • passt für http://mfug.demo/ und http://mfug.demo/posts, da durch die Klammern posts optional ist. Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 27
  • 28. Routing Package • Action Routing •/Packages/Application/TYPO3.Blog/Routes.yaml - name: 'Post actions 1' uriPattern: 'posts/{@action}' defaults: '@controller': 'Post' • passt http://mfug.demo/posts/new Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 28
  • 29. Routing Package • Object Routes Part •/Packages/Application/TYPO3.Blog/Routes.yaml http://dev.tutorial.local/post/edit?post%5B__identity%5D=229e2b23-b6f3-4422-8b7a- efb196dbc88b - name: 'Post actions 2' uriPattern: 'posts/{post}/{@action}' defaults: '@controller': 'Post' routeParts: post: objectType: 'TYPO3BlogDomainModelPost' uriPattern: '{date:Y}/{date:m}/{date:d}/{title}' http://dev.tutorial.local/post/2010/01/18/post-title/edit Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 29
  • 30. Quellen • FLOW3 Dokumentation http://flow3.typo3.org/documentation/guide.html • FLOW3 Blog Package TYPO3.Blog http://forge.typo3.org/projects/show/package-typo3-blog Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 30
  • 31. Kontakt Cross Content Media Twitter: @MarkusGoldbeck Gesellschaft für Online Business Solutions mbH E-Mail: mgoldbeck@cross-content.com Landshuter Allee 8 www.cross-content.com 80637 München Datum: 10.01.2012 FLOW3 Einführung / Blog Package www.cross-content.com @MarkusGoldbeck 31