Upgrade to Pro — share decks privately, control downloads, hide ads and more …

T3CON14EU: Migrating from TYPO3 CMS to TYPO3 Flow

T3CON14EU: Migrating from TYPO3 CMS to TYPO3 Flow

License: CC BY-SA

With the release of TYPO3 Flow in 2011 and TYPO3 Neos in 2012, a both flexible and powerful platform was introduced as a possible successor for TYPO3 CMS. However, migration from TYPO3 CMS to TYPO3 Flow and Neos is still presents a challenge due to large conceptual differences between the two systems.

This talk aims at presenting an approach how a (semi) automated migration of TYPO3 CMS to TYPO3 Flow and Neos could be achieved.

Martin Helmich

October 09, 2014
Tweet

More Decks by Martin Helmich

Other Decks in Programming

Transcript

  1. Migrating from TYPO3 CMS
    to TYPO3 Flow
    10th International TYPO3 Conference, October 9th, Berlin
    CC BY Serge Melki
    https://www.flickr.com/photos/sergemelki/8156340258
    Martin Helmich
    [email protected]

    View Slide

  2. View Slide

  3. View Slide

  4. CC BY-SA Niteshift
    http://commons.wikimedia.org/wiki/File:Balow_Kuhweide_2008-04-28_121.jpg

    View Slide

  5. TYPO3
    Flow
    TYPO3
    Neos
    ?
    TYPO3
    CMS

    View Slide

  6. why!?
    CC BY Morgan
    https://www.flickr.com/photos/meddygarnet/3528509573

    View Slide

  7. CC BY Crisada
    https://www.flickr.com/photos/chrisada/2415541623

    View Slide

  8. CC BY Pascal
    https://www.flickr.com/photos/pasukaru76/6310053615

    View Slide

  9. CC BY-SA Malene Thyssen
    http://commons.wikimedia.org/wiki/File:Brown_bear_(Ursus_arctos_arctos)_running.jpg

    View Slide

  10. CC BY Emma Bishop
    https://www.flickr.com/photos/emmabishop/6360703145

    View Slide

  11. Extensions
    Typoscript
    Content

    View Slide

  12. Migrating content
    Read
    https://speakerdeck.com/kdambekalns/migrating-from-typo3-cms-to-typo3-neos

    View Slide

  13. Migrating typoscript
    just
    don‘t

    View Slide

  14. although...
    page  =  PAGE  
    page  {  
     
       10  =  TEMPLATE  
       10  {  
           template  =  FILE  
           template.file  =  fileadmin/site.html  
     
           marks  {  
               CONTENT  <  styles.content.get  
               CONTENT_RIGHT  <  styles.content.getRight  
           }  
       }  
     
    }  
    page  =  TYPO3.Neos:Page  {  
       body  {  
           templatePath  =  
    'resource://My.Site/.../Site.html'  
     
           content  {  
               main  =  PrimaryContent  {  
                   nodePath  =  'main'  
               }  
               right  =  ContentCollection  {  
                   nodePath  =  'right'  
               }  
           }  
             

    View Slide

  15. Render
    TS2
    Parse
    TS
    Apply
    trans-
    formations

    View Slide

  16. How to convert an
    Extbase
    extension to
    TYPO3 FLOW

    View Slide

  17. TYPO3 CMS
    (Extbase)
    TYPO3 Flow
    ?
    Classes/
    Controller/
    Domain/

    Configuration/
    TypoScript/
    TCA/
    Resources/
    Public/
    Private/
    ext_emconf.php
    ext_tables.php
    ext_tables.sql
    Classes/
    Controller/
    Domain/

    Configuration/
    Migrations/
    Mysql/
    Resources/
    Public/
    Private/
    composer.json

    View Slide

  18. TYPO3 CMS
    (Extbase)
    TYPO3 Flow
    class  Tx_MyExt_Domain_Model_Car  extends    
       Tx_Extbase_DomainObject_AbstractEntity  {  
     
       /**  
         *  @var  string  
         *  @validate  notempty  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Tx_MyExt_Domain_Model_Manufacturer  
         */  
       protected  $manufacturer;  
    }  
    namespace  My\Ext\Domain\Model;  
    use  TYPO3\Flow\Annotations  as  Flow;  
    use  Doctrine\ORM\Mapping  as  ORM;  
     
    /**  
     *  @Flow\Entity  
     */  
    class  Car  {  
     
       /**  
         *  @var  string  
         *  @Flow\Validate('NotEmpty')  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Manufacturer  
         *  @ORM\ManyToOne  
         */  
       protected  $manufacturer;  
    }  

    View Slide

  19. TYPO3 CMS
    (Extbase)
    TYPO3 Flow
    class  Tx_MyExt_Domain_Model_Car  extends    
       Tx_Extbase_DomainObject_AbstractEntity  {  
     
       /**  
         *  @var  string  
         *  @validate  notempty  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Tx_MyExt_Domain_Model_Manufacturer  
         */  
       protected  $manufacturer;  
    }  
    namespace  My\Ext\Domain\Model;  
    use  TYPO3\Flow\Annotations  as  Flow;  
    use  Doctrine\ORM\Mapping  as  ORM;  
     
    /**  
     *  @Flow\Entity  
     */  
    class  Car  {  
     
       /**  
         *  @var  string  
         *  @Flow\Validate('NotEmpty')  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Manufacturer  
         *  @ORM\ManyToOne  
         */  
       protected  $manufacturer;  
    }  
    Namespacify classes
    when necessary

    View Slide

  20. TYPO3 CMS
    (Extbase)
    TYPO3 Flow
    class  Tx_MyExt_Domain_Model_Car  extends    
       Tx_Extbase_DomainObject_AbstractEntity  {  
     
       /**  
         *  @var  string  
         *  @validate  notempty  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Tx_MyExt_Domain_Model_Manufacturer  
         */  
       protected  $manufacturer;  
    }  
    namespace  My\Ext\Domain\Model;  
    use  TYPO3\Flow\Annotations  as  Flow;  
    use  Doctrine\ORM\Mapping  as  ORM;  
     
    /**  
     *  @Flow\Entity  
     */  
    class  Car  {  
     
       /**  
         *  @var  string  
         *  @Flow\Validate('NotEmpty')  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Manufacturer  
         *  @ORM\ManyToOne  
         */  
       protected  $manufacturer;  
    }  
    Determine domain object type
    by class inheritance and add
    annotation

    View Slide

  21. TYPO3 CMS
    (Extbase)
    TYPO3 Flow
    class  Tx_MyExt_Domain_Model_Car  extends    
       Tx_Extbase_DomainObject_AbstractEntity  {  
     
       /**  
         *  @var  string  
         *  @validate  notempty  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Tx_MyExt_Domain_Model_Manufacturer  
         */  
       protected  $manufacturer;  
    }  
    namespace  My\Ext\Domain\Model;  
    use  TYPO3\Flow\Annotations  as  Flow;  
    use  Doctrine\ORM\Mapping  as  ORM;  
     
    /**  
     *  @Flow\Entity  
     */  
    class  Car  {  
     
       /**  
         *  @var  string  
         *  @Flow\Validate('NotEmpty')  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Manufacturer  
         *  @ORM\ManyToOne  
         */  
       protected  $manufacturer;  
    }  
    Convert annotations.

    View Slide

  22. TYPO3 CMS
    (Extbase)
    TYPO3 Flow
    class  Tx_MyExt_Domain_Model_Car  extends    
       Tx_Extbase_DomainObject_AbstractEntity  {  
     
       /**  
         *  @var  string  
         *  @validate  notempty  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Tx_MyExt_Domain_Model_Manufacturer  
         */  
       protected  $manufacturer;  
    }  
    namespace  My\Ext\Domain\Model;  
    use  TYPO3\Flow\Annotations  as  Flow;  
    use  Doctrine\ORM\Mapping  as  ORM;  
     
    /**  
     *  @Flow\Entity  
     */  
    class  Car  {  
     
       /**  
         *  @var  string  
         *  @Flow\Validate('NotEmpty')  
         */  
       protected  $licenseNumber;  
     
       /**  
         *  @var  Manufacturer  
         *  @ORM\ManyToOne  
         */  
       protected  $manufacturer;  
    }  
    Determine association
    cardinality from TCA

    View Slide

  23. some other
    stuff
    to think about
    usage of TYPO3 APIs
    (aka. the infamous t3lib_div)
    Convert locallang
    to XLIFF
    create doctrine
    migrations
    from ext_tables.sql
    domain models
    extending TYPO3 classes
    different value object
    handling

    View Slide

  24. How to convert an
    pibase
    extension to
    TYPO3 FLOW

    View Slide

  25. TYPO3 CMS
    (pibase)
    TYPO3 Flow
    lib/
    pi1/
    class.tx_myext_pi1.php
    static/
    res/
    ext_emconf.php
    ext_tables.php
    ext_tables.sql
    Classes/
    Controller/
    Domain/
    Plugin/

    Configuration/
    Migrations/
    Mysql/
    Resources/
    Public/
    Private/
    composer.json
    ?

    View Slide

  26. class  tx_myext_pi1  extends  tslib_pibase  {  
       public  function  main($conf,  $content)  {  
           $mainTemplate  =  $this-­‐>cObj-­‐>fileResource(...);  
           $rowTemplate    =  $this-­‐>cObj-­‐>fileResource(...);  
           $userRes  =  $GLOBALS['TYPO3_DB']-­‐>exec_SELECTquery(  
               '*',  'tx_myext_users',  'deleted=0  AND  active=1'  
           );  
           while($user  =  $GLOBALS['TYPO3_DB']-­‐>sql_fetch_assoc($userRes))  {  
               $markers  =  [  
                   "###NAME###"    =>  $user['name'],  
                   "###EMAIL###"  =>  $user['email']  
               ];  
               $content  .=  $this-­‐>cObj-­‐>substituteMarkerArray(  
                   $rowTemplate,  $markers  
               );  
           }  
     
           $markers  =  ['###USERS###'  =>  $content];  
           return  $this-­‐>cObj-­‐>substituteMarkerArray($mainTemplate,  $markers);  
       }  
    }  

    View Slide

  27. Doctrine 2 DBAL
    Doctrine 2 ORM
    Flow
    Resource
    Mgmt.
    Flow
    MVC
    Stack
    Pain abstraction layer
    The world of pain
    (old code)

    View Slide

  28. namespace  My\Ext\Plugin;  
    class  UserListPlugin  extends  \Mw\T3Compat\Plugin\BasePlugin  {  
       public  function  main($conf,  $content)  {  
           $mainTemplate  =  $this-­‐>cObj-­‐>fileResource(...);  
           $rowTemplate    =  $this-­‐>cObj-­‐>fileResource(...);  
           $userRes  =  $this-­‐>database-­‐>exec_SELECTquery(  
               '*',  'tx_myext_users',  'deleted=0  AND  active=1'  
           );  
           while($user  =  $this-­‐>database-­‐>sql_fetch_assoc($userRes))  {  
               $markers  =  [  
                   "###NAME###"    =>  $user['name'],  
                   "###EMAIL###"  =>  $user['email']  
               ];  
               $content  .=  $this-­‐>cObj-­‐>substituteMarkerArray(  
                   $rowTemplate,  $markers  
               );  
           }  
     
           $markers  =  ['###USERS###'  =>  $content];  
           return  $this-­‐>cObj-­‐>substituteMarkerArray($mainTemplate,  $markers);  
       }  
    }  

    View Slide

  29. View Slide

  30. demo time
    CC BY Kenny Louie
    https://www.flickr.com/photos/kwl/4743024076

    View Slide

  31. try it
    https://github.com/mittwald/flow-metamorph

    View Slide

  32. View Slide

  33. http://creativecommons.org/licenses/by-sa/4.0/
    This work is licensed under a Creative
    Commons Attribution-ShareAlike 4.0
    International License.

    View Slide