Get into the FLOW with Extbase and TYPO3 4.3

15,161 views

Published on

Slides of the presentation on Extbase on T3DD09.
Extbase is a new Extension framework for TYPO3 backporting great features from FLOW3 - Domain Driven Design and Model View Controller.
The video of this presentation can be found at http://t3dd09.typo3.org/recordings.html

Published in: Technology
9 Comments
4 Likes
Statistics
Notes
  • This is real take it serious, who will believe that a herb can cure herpes, i navel believe that this will work i have spend a lot when getting drugs from the hospital to keep me healthy, what i was waiting for is death because i was broke, one day i hard about this great man who is well know of HIV and cancer cure, i decided to email him, unknowingly to me that this will be the end of the herpes in my body, he prepare the herb for me, and give me instruction on how to take it, at the end of the one month, he told me to go to the hospital for a check up, and i went, surprisingly after the test the doctor confirm me negative, i thought it was a joke, i went to other hospital was also negative, then i took my friend who was also herpes positive to the Dr Agumagu, after the treatment she was also confirm negative . He also have the herb to cure cancer. please i want every one with this virus to be free, that is why am dropping his email address, agumaguspelltemple@outlook.com or agumaguspelltemple@gmail.com do email him he is a great man. the government is also interested in this DR, thank you for saving my life, and I promise I will always testify for your good work call his number +233200116937..
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • nice share,..thanks percetakan
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • http://www.bekamsteriljakarta.com
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • cara membuat blog.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • SeoTekno | blog beragam informasi bermanfaat | Google Honeymoon
    Waletbet Promo Bonus 100% Sportsbook dan Casino Online | Google Honeymoon
    Jasa membuat blog murah di blogmasrudy | Google Honeymoon
    RBN - Tempat Diskusi Blogger Nusantara | Google Honeymoon
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
15,161
On SlideShare
0
From Embeds
0
Number of Embeds
7,193
Actions
Shares
0
Downloads
140
Comments
9
Likes
4
Embeds 0
No embeds

No notes for slide

Get into the FLOW with Extbase and TYPO3 4.3

  1. 1. T3DD09 Inspiring people to Get into FLOW with Extbase share
  2. 2. Get into the FLOW with Extbase 15.05.2009 Jochen Rau <jochen.rau@typoplanet.de> Sebastian Kurfürst <sebastian@typo3.org> with contributions by Oliver Hader
  3. 3. Topictext Who is that? Dipl.-Ing. Mechanical Engineering (Stuttgart University) infected with TYPO3 in 2001 (after that: 5 years of immunity) today living and working in Tübingen 60% self-employed TYPO3-developer (since 2007) 60% father of a family (since 2003 ;-) ) before that 5 years: researcher at the Fraunhofer-Gesellschaft and the German Aerospace Center Inspiring people to Get into FLOW with Extbase share
  4. 4. - WARNING - TYPO3 addict Inspiring people to Get into FLOW with Extbase share
  5. 5. The current state of the art http://commons.wikimedia.org/wiki/File:Z%C3%BCrich_-_Seefeld_-_Heureka_IMG_1757.JPG
  6. 6. The current state of the art The current state of the art dispatches calls templates FE Plugin fetches data JavaScript/CSS Resources renders output images extends tslib_pibase TypoScript Database tables Frontend Extension Inspiring people to Get into FLOW with Extbase share
  7. 7. The current state of the art File structure Inspiring people to Get into FLOW with Extbase share
  8. 8. The current state of the art A new extension: Blogging with TYPO3 define features of the new blogging application implement the business logic define the look and feel take a look at security issues Inspiring people to Get into FLOW with Extbase share
  9. 9. The current state of the art Blog features administrate blogs, blog posts and blog comments list all available blogs list all blog posts of a blog list all comments of a blog post allow users to post new comments Inspiring people to Get into FLOW with Extbase share
  10. 10. The current state of the art Blog Post Comment Tag Inspiring people to Get into FLOW with Extbase share
  11. 11. The current state of the art Blog business logic public function main($content, $conf) { $this->conf = $conf; $this->pi_setPiVarDefaults(); $this->pi_loadLL(); if ($this->piVars['postUid']) { if ($this->piVars['newComment']) { $this->storeNewComment(); } $content = $this->renderPost(); } elseif ($this->piVars['blogUid']) { $content = $this->renderBlog(); } else { $content = $this->renderListOfBlogs(); } return $this->pi_wrapInBaseClass($content); } Inspiring people to Get into FLOW with Extbase share
  12. 12. The current state of the art Task 1: Output a listing of blogs fetch available blogs from database implement a new method „renderListOfBlogs()“ protected function renderListOfBlogs() { $blogs = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows( '*', 'tx_blogexample_blog', 'deleted=0 AND hidden=0 AND sys_language_uid=' . $GLOBALS['TSFE']->sys_language_uid . $this->cObj->enableFields('tx_blogexample_blog'), '', 'name' ); ... Inspiring people to Get into FLOW with Extbase share
  13. 13. The current state of the art Task 1: Output a listing of blogs iterate through all blogs and render them ... $template = $this->cObj->fileResource($this->conf['template']); $blogElementSubpart = $this->cObj->getSubpart($template, '###SUBPART_BLOGELEMENT###'); $blogs = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(...); foreach ($blogs as $blog) { $linkParameters = array('blogUid' => $blog['uid']); $markers = array( '###BLOG_NAME###' => $blog['name'], '###BLOG_LOGO###' => $this->cImage('uploads/tx_blog/' . $blog['logo']), '###BLOG_DESCRIPTION###' => $this->pi_RTEcssText($blog['description']), '###BLOG_MORELINK###' => $this->pi_linkTP('show blog', $linkParameters, true), ); $blogElements.= $this->cObj->substituteMarkerArray($blogElementSubpart, $markers); } return $content; } Inspiring people to Get into FLOW with Extbase share
  14. 14. The current state of the art Task 1: Output a listing of blogs create the template with markers and subparts <!-- ###SUBPART_BLOGELEMENT### begin --> <div class=quot;blog elementquot;> ###BLOG_NAME### ###BLOG_LOGO### ###BLOG_DESCRIPTION### ###BLOG_MORELINK### </div> <!-- ###SUBPART_BLOGELEMENT### end --> Inspiring people to Get into FLOW with Extbase share
  15. 15. The current state of the art Task 2: Display a single post with its comments implement a new method „renderPost()“ protected function renderPost() { $post = $this->pi_getRecord('tx_blogexample_post', $this->piVars['postUid']); $comments = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows( '*', 'tx_blogexample_comment', 'deleted=0 AND hidden=0 AND sys_language_uid=' . $GLOBALS['TSFE']->sys_language_uid . ' AND post_uid=' . $this->piVars['postUid'] . ' AND post_table=quot;tx_blogexample_postquot;' . $this->cObj->enableFields('tx_blogexample_comment'), '', 'date DESC' ); // fill marker arrays and substitute in template // return content } Inspiring people to Get into FLOW with Extbase share
  16. 16. The current state of the art Task 3: Add a new comment to a blog post the whole plugin is cached („USER“) dynamic user input won‘t be handled by the rendering when cached define uncached behavior in TypoScript [globalVar = _POST:tx_blogexample_pi1|newComment = 1] plugin.tx_blogexample_pi1 = USER_INT [global] Inspiring people to Get into FLOW with Extbase share
  17. 17. The current state of the art Task 3: Add a new comment to a blog post store new comment in database protected function storeNewComment() { $fields = array( 'post_uid' => $this->piVars['postUid'], 'post_table' => 'tx_blogexample_post', 'date' => time(), 'author' => $this->piVars['author'], 'email' => $this->piVars['email'], 'content' => $this->piVars['content'], ); $GLOBALS['TYPO3_DB']->exec_INSERTquery( 'tx_blogexample_comment', $fields ); } Inspiring people to Get into FLOW with Extbase share
  18. 18. The current state of the art Take a look at security issues possibility of SQL injections unvalidated information submitted by a user is there really a mail address where it was expected? are integers really integers? malicious information submitted by a user (XSS) is there a possibility to inject JavaScript code? Inspiring people to Get into FLOW with Extbase share
  19. 19. The current state of the art Security: SQL injections unescaped or unchecked values that are transferred to the database directly $comments = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows( '*', 'tx_blog_comment', 'deleted=0 AND hidden=0 AND sys_language_uid=' . $GLOBALS['TSFE']->sys_language_uid . ' AND post_uid=' . $this->piVars['postUid'] . ' AND post_table=quot;tx_blog_postquot;' . $this->cObj->enableFields('tx_blog_comment') ); with &postUid=1; INSERT INTO be_users SET ...; SELECT * FROM tx_blog_comment WHERE 1=1 SELECT * FROM tx_blog_comment WHERE post_uid=1; INSERT INTO be_users SET ...; SELECT * FROM tx_blog_comment WHERE 1=1 AND post_table=“tx_blog_post“ ... Inspiring people to Get into FLOW with Extbase share
  20. 20. The current state of the art Security: SQL injections - solution always escape or cast variables from outside ' AND post_uid=' . intval($this->piVars['postUid']) . ' AND post_table=quot;tx_blog_postquot;' . Inspiring people to Get into FLOW with Extbase share
  21. 21. Hmmm. Much better. Lasagna code ti code Spaghet
  22. 22. Extension Framework
  23. 23. Extension Framework
  24. 24. http://www.sxc.hu/photo/516864/ Extension building How to build a typo3 v4 based app with Extbase
  25. 25. Blog Post Comment Tag Inspiring people to Get into FLOW with Extbase share
  26. 26. http://www.flickr.com/photos/bunchofpants/106465356/sizes/o/ The model is a representation of reality.
  27. 27. Model
  28. 28. class Tx_BlogExample_Domain_Model_Blog extends Tx_Extbase_DomainObject_AbstractEntity { // Comments are missing protected $name = ''; protected $description = ''; protected $logo; protected $posts = array(); public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } Inspiring people to Get into FLOW with Extbase share
  29. 29. class Tx_BlogExample_Domain_Model_Comment extends Tx_Extbase_DomainObject_AbstractEntity { protected $date; protected $author; protected $email; protected $content; public function __construct() { $this->date = new DateTime(); } public function setDate(DateTime $date) { $this->date = $date; } public function getDate() { return $this->date; } public function setAuthor($author) { Inspiring people to Get into FLOW with Extbase $this->author = $author; share }
  30. 30. Model classes are POPOs (almost) POPO = Plain Old PHP Object
  31. 31. domain object encapsulates data + behavior
  32. 32. http://www.sxc.hu/photo/444174/ and... action
  33. 33. Extension building with Extbase Task 1: Output a listing of blog postings You want to output the postings of a predefined blog. public function showAction() { $blogUid = 1; // get blog by UID // render blog } Inspiring people to Get into FLOW with Extbase share
  34. 34. How could you get a blog?
  35. 35. How could you get a book?
  36. 36. Extension building with Extbase - Blog Example Model BlogRepository Blog Post Comment Tag Inspiring people to Get into FLOW with Extbase share
  37. 37. Extension building with Extbase - Blog Example Repositories Encapsulate all data access SQL is allowed only in the Repository Magic methods: findBy*, findOneBy* Inspiring people to Get into FLOW with Extbase share
  38. 38. Extension building with Extbase - Blog Example Repositories class Tx_BlogExample_Domain_Model_BlogRepository extends Tx_Extbase_Persistence_Repository { }
  39. 39. Extension building with Extbase - Blog Example Task 1: Output a listing of blog postings You want to output the postings of a predefined blog. public function showAction() { $blogUid = 1; $blog = $this->blogRepository->findOneByUid($blogUid); // render blog } Inspiring people to Get into FLOW with Extbase share
  40. 40. Extension building with Extbase - Blog Example Task 1: Output a listing of blog postings You want to output the postings of a predefined blog. public function showAction() { $blogUid = 1; $blog = $this->blogRepository->findOneByUid($blogUid); $this->view->assign('blog', $blog); return $this->view->render(); // can be omitted } Inspiring people to Get into FLOW with Extbase share
  41. 41. Extension building with Extbase - Blog Example Task 1: Output a listing of blog postings Inside the template: <h1>Welcome to {blog.name}</h1> <f:for each=quot;{blog.posts}quot; as=quot;singlePostquot;> <h1>{singlePost.title}</h1> <f:link controller=quot;Postquot; action=quot;showquot; arguments=quot;{post : singlePost}quot;>read more </f:link> </f:for> Inspiring people to Get into FLOW with Extbase share
  42. 42. Extension building with Extbase - Blog Example Task 2: Display a single blog post Display a post with comments public function showAction() { // Get the post // Pass post to view so it can be rendered } Inspiring people to Get into FLOW with Extbase share
  43. 43. Extension building with Extbase - Blog Example Task 2: Display a single blog post /** * Display a post * * @param Tx_Blog_Domain_Model_Post $post The post to show */ public function showAction(Tx_Blog_Domain_Model_Post $post) { // Pass post to view so it can be rendered } Inspiring people to Get into FLOW with Extbase share
  44. 44. Extension building with Extbase - Blog Example Arguments All arguments must be registered. Registration of expected arguments happens through defining them as method parameters. PHPDoc is mandatory as it is used for data type validation Inspiring people to Get into FLOW with Extbase share
  45. 45. Extension building with Extbase - Blog Example Arguments - more advanced /** * Action that displays one single post Do * * @param string $title Title of the post additional validation * @param string $content Content of the post * @validate $title Length(maximum=100) * @return string The rendered view */ public function createAction($title, $content) { } Inspiring people to Get into FLOW with Extbase share
  46. 46. Extension building with Extbase - Blog Example Task 2: Display a single blog post /** * Display a post * * @param Tx_Blog_Domain_Model_Post $post The post to show */ public function showAction(Tx_Blog_Domain_Model_Post $post) { $this->view->assign('post', $post); } Inspiring people to Get into FLOW with Extbase share
  47. 47. Extension building with Extbase - Blog Example Task 2: Display a single blog post - template Inspiring people to Get into FLOW with Extbase share
  48. 48. Extension building with Extbase - Blog Example Task 3: Add a new comment a new comment needs to be stored for a given post 1. Create the template 2. Add the comment in the controller Inspiring people to Get into FLOW with Extbase share
  49. 49. <f:form name=quot;commentquot; method=quot;postquot; controllerName=quot;Commentquot; actionName=quot;createquot; object=quot;{comment}quot; arguments=quot;{post : post}quot;> <h4>Add your own</h4> <label for=quot;authorquot;>name <span class=quot;requiredquot;>(required)</span></label><br /> <f:form.textbox id=quot;authorquot; property=quot;authorquot; /> <br /> <label for=quot;emailquot;>email <span class=quot;requiredquot;>(required)</span></label><br /> <f:form.textbox id=quot;emailquot; property=quot;emailquot; /> <br /> <label for=quot;textquot;>message <span class=quot;requiredquot;>(required)</span></label><br /> <f:form.textarea id=quot;textquot; property=quot;contentquot; rows=quot;8quot; cols=quot;46quot;/> <br /> <f:form.submit>Say it</f:form.submit> </f:form> Inspiring people to Get into FLOW with Extbase share
  50. 50. <f:form name=quot;commentquot; method=quot;postquot; controllerName=quot;Commentquot; actionName=quot;createquot; object=quot;{comment}quot; arguments=quot;{post : post}quot;> /** * Action that adds a comment to a blog post and redirects to single view * * @param Tx_BlogExample_Domain_Model_Post $post The post the comment is related to * @param Tx_BlogExample_Domain_Model_Comment $comment The comment to create * @return void */ public function createAction(Tx_BlogExample_Domain_Model_Post $post, Tx_BlogExample_Domain_Model_Comment $comment) { $post->addComment($comment); $this->redirect('show', 'Post', NULL, array('post' => $post)); } Inspiring people to Get into FLOW with Extbase share
  51. 51. 1 2 userFunc Request BlogExample Extbase TYPO3 Dispatcher HTML Response Controller 6 3 assign(Blog) findByName('MyBlog') render() 5 Blog Response 4 View Repository Domain Model Blog Post Comment Tag
  52. 52. Extension building with Extbase Controller Controllers contain actions: *Action all controllers inherit from Tx_Extbase_MVC_Controller_ActionController Default action: indexAction Inspiring people to Get into FLOW with Extbase share
  53. 53. Controlle r Model View Oth er Stu ff
  54. 54. Persistence Inspiring people to Get into FLOW with Extbase share
  55. 55. Aggregate getLatestComment() Root Blog Post Comment Tag
  56. 56. Persistence adding a blog the blog is an aggregate root Persistent objects BlogRepository $blogRepository->add(Blog $blog); Blog Now, the Blog is a managed object - changes are now automatically persisted! Inspiring people to Get into FLOW with Extbase share
  57. 57. Persistence adding a comment Comment is no aggregate root Persistent objects Thus, Comment is automatically persisted PostRepository Post Comment Inspiring people to Get into FLOW with Extbase share
  58. 58. Persistence Transparent object persistence All objects (and their child-objects) managed by a repository are automatically persisted changes to these objects are automatically persisted Inspiring people to Get into FLOW with Extbase share
  59. 59. Inspiring people to Get into FLOW with Extbase share
  60. 60. Domain Driven Design
  61. 61. Domain describes activity or business of user.
  62. 62. Ubiquitous LAnguage
  63. 63. Blog Entity Post Value Object Comment Tag
  64. 64. Core concepts - Domain Driven Design Principles of Domain Driven Design focus on the domain = activity or business of user we start with the business logic (PHP classes) we don't care about the database backend / persistence layer bbjects represent things in the real world, with their attributes and behavior ubiquitous language building blocks Entity Value Objects Repositories Inspiring people to Get into FLOW with Extbase share
  65. 65. Why should you use DDD? Inspiring people to Get into FLOW with Extbase share
  66. 66. Read lots of TypoScript and core API docs Mix PHP and HTML template to build a template-based layout Build frontend forms with error handling Implement application logic Care about security adapt to the coding style, Build complex structure and thinking of SQL queries different developers
  67. 67. http://www.sxc.hu/photo/929504
  68. 68. Implement application logic
  69. 69. Flow [flō] is the mental state of operation in which the person is fully immersed in what he or she is doing by a feeling of energized focus, full involvement, and success in the process of the activity. http://www.sxc.hu/photo/768249
  70. 70. Outlook Inspiring people to Get into FLOW with Extbase share
  71. 71. Outlook Availability and documentation Extbase will be included in TYPO3 4.3 full-blown replacement for pibase new preferred way to write extensions futureproof, with concepts of FLOW3 Currently no documentation, but will be available with the final release Inspiring people to Get into FLOW with Extbase share
  72. 72. Outlook New kickstarter currently ongoing project by the core development team will be released shortly after 4.3 Domain Driven Design - Don't think in databases, think in Objects! Inspiring people to Get into FLOW with Extbase share
  73. 73. Resources and links Project web site: http://forge.typo3.org/projects/show/typo3v4-mvc SVN: https://svn.typo3.org/TYPO3v4/CoreProjects/MVC/ we will provide documentation until the release of TYPO3 4.3 First release with TYPO3 4.3 alpha3: http://typo3.org/download/packages/ Inspiring people to Get into FLOW with Extbase share
  74. 74. Conclusion Inspiring people to Get into FLOW with Extbase share
  75. 75. + Greatly reusable components
  76. 76. + Easy and consistent API
  77. 77. + Easily testable
  78. 78. - Needs initial learning time
  79. 79. - Extensions need proper planning
  80. 80. - You will get addicted
  81. 81. Feel the flow in TYPO3 v4
  82. 82. Bastian Waidelich Niels Pardon u Tha nk Yo and the TYPO3 V5 Team for all the inspiration and the beautiful code Christopher Hlubek Ingmar Schlecht Benjamin Mack
  83. 83. ?????? ??? ??? ?
  84. 84. inspiring people to share.

×