Slide 1

Slide 1 text

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]

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

TYPO3 Flow TYPO3 Neos ? TYPO3 CMS

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Extensions Typoscript Content

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Migrating typoscript just don‘t

Slide 14

Slide 14 text

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'              }          }            

Slide 15

Slide 15 text

Render TS2 Parse TS Apply trans- formations

Slide 16

Slide 16 text

How to convert an Extbase extension to TYPO3 FLOW

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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;   }  

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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.

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

How to convert an pibase extension to TYPO3 FLOW

Slide 25

Slide 25 text

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 ?

Slide 26

Slide 26 text

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);      }   }  

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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);      }   }  

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

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