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.

2b68bc93708466a655a4c60458dc7955?s=128

Martin Helmich

October 09, 2014
Tweet

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 m.helmich@mittwald.de
  2. None
  3. None
  4. CC BY-SA Niteshift http://commons.wikimedia.org/wiki/File:Balow_Kuhweide_2008-04-28_121.jpg

  5. TYPO3 Flow TYPO3 Neos ? TYPO3 CMS

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

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

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

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

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

  11. Extensions Typoscript Content

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

  13. Migrating typoscript just don‘t

  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'              }          }            
  15. Render TS2 Parse TS Apply trans- formations

  16. How to convert an Extbase extension to TYPO3 FLOW

  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
  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;   }  
  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
  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
  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.
  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
  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
  24. How to convert an pibase extension to TYPO3 FLOW

  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 ?
  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);      }   }  
  27. Doctrine 2 DBAL Doctrine 2 ORM Flow Resource Mgmt. Flow

    MVC Stack Pain abstraction layer The world of pain (old code)
  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);      }   }  
  29. None
  30. demo time CC BY Kenny Louie https://www.flickr.com/photos/kwl/4743024076

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

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

    4.0 International License.