SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
Ü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

Contenu connexe

Similaire à Einführung in FLOW3/ Blog Package

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
 
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
martinwolak
 
Spring dependency injection
Spring dependency injectionSpring dependency injection
Spring dependency injection
srmelody
 

Similaire à 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
 

Dernier

Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
ciinovamais
 
Salient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functionsSalient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functions
KarakKing
 
Vishram Singh - Textbook of Anatomy Upper Limb and Thorax.. Volume 1 (1).pdf
Vishram Singh - Textbook of Anatomy  Upper Limb and Thorax.. Volume 1 (1).pdfVishram Singh - Textbook of Anatomy  Upper Limb and Thorax.. Volume 1 (1).pdf
Vishram Singh - Textbook of Anatomy Upper Limb and Thorax.. Volume 1 (1).pdf
ssuserdda66b
 

Dernier (20)

ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
Python Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxPython Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docx
 
How to Manage Global Discount in Odoo 17 POS
How to Manage Global Discount in Odoo 17 POSHow to Manage Global Discount in Odoo 17 POS
How to Manage Global Discount in Odoo 17 POS
 
Towards a code of practice for AI in AT.pptx
Towards a code of practice for AI in AT.pptxTowards a code of practice for AI in AT.pptx
Towards a code of practice for AI in AT.pptx
 
How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17
 
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptxSKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
 
SOC 101 Demonstration of Learning Presentation
SOC 101 Demonstration of Learning PresentationSOC 101 Demonstration of Learning Presentation
SOC 101 Demonstration of Learning Presentation
 
Single or Multiple melodic lines structure
Single or Multiple melodic lines structureSingle or Multiple melodic lines structure
Single or Multiple melodic lines structure
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
Fostering Friendships - Enhancing Social Bonds in the Classroom
Fostering Friendships - Enhancing Social Bonds  in the ClassroomFostering Friendships - Enhancing Social Bonds  in the Classroom
Fostering Friendships - Enhancing Social Bonds in the Classroom
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
 
Basic Civil Engineering first year Notes- Chapter 4 Building.pptx
Basic Civil Engineering first year Notes- Chapter 4 Building.pptxBasic Civil Engineering first year Notes- Chapter 4 Building.pptx
Basic Civil Engineering first year Notes- Chapter 4 Building.pptx
 
Salient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functionsSalient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functions
 
Understanding Accommodations and Modifications
Understanding  Accommodations and ModificationsUnderstanding  Accommodations and Modifications
Understanding Accommodations and Modifications
 
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdfUGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
 
Vishram Singh - Textbook of Anatomy Upper Limb and Thorax.. Volume 1 (1).pdf
Vishram Singh - Textbook of Anatomy  Upper Limb and Thorax.. Volume 1 (1).pdfVishram Singh - Textbook of Anatomy  Upper Limb and Thorax.. Volume 1 (1).pdf
Vishram Singh - Textbook of Anatomy Upper Limb and Thorax.. Volume 1 (1).pdf
 
On National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan FellowsOn National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan Fellows
 
Introduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsIntroduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The Basics
 
Dyslexia AI Workshop for Slideshare.pptx
Dyslexia AI Workshop for Slideshare.pptxDyslexia AI Workshop for Slideshare.pptx
Dyslexia AI Workshop for Slideshare.pptx
 

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