T3CON14EU: Migrating from TYPO3 CMS to TYPO3 Flow

Post on 27-Jun-2015

354 views 2 download

Tags:

description

Slides of my presentation held at the 10th International TYPO3 Conference in Berlin on October 9th, 2014.

Transcript of T3CON14EU: Migrating from TYPO3 CMS to TYPO3 Flow

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

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

TYPO3 Flow

TYPO3 Neos

?

TYPO3 CMS

why!?

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

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

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

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

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

Extensions

Typoscript

Content

Migrating content

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

Migrating typoscript

just

don‘t

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

Render TS2

Parse TS

Apply trans-

formations

How to convert an

Extbase extension to TYPO3 FLOW

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

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

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

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

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.

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

some other

stuff to think about

usage of TYPO3 APIs (aka. the infamous t3lib_div)

Conv

ert l

ocal

lang

to

XLI

FF create doctrine

migrations from ext_tables.sql do

mai

n m

odel

s ex

tend

ing

TYPO

3 cl

asse

s different value object

handling

How to convert an

pibase extension to TYPO3 FLOW

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

?

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

Doctrine 2 DBAL

Doctrine 2 ORM Flow

Resource Mgmt.

Flow MVC Stack

Pain abstraction layer

The world of pain (old code)

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

demo time

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

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

http://creativecommons.org/licenses/by-sa/4.0/

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.