1 / 58

Building Bridges, Connecting Communities

Using Backbone.js with Drupal 7 and 8. VADIM MIRGOROD Front-end, 05/22/2013. Building Bridges, Connecting Communities. Vadim Mirgorod. Lead developer in Trellon Writing Backbone.js CookBook for PACKT Email: dealancer@gmail.com Web: http://vmirgorod.name Twitter: @dealancer. # 2.

demont
Download Presentation

Building Bridges, Connecting Communities

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Using Backbone.js with Drupal 7 and 8 VADIM MIRGOROD Front-end, 05/22/2013 Building Bridges, Connecting Communities

  2. Vadim Mirgorod Lead developer in Trellon Writing Backbone.js CookBook for PACKT Email: dealancer@gmail.com Web: http://vmirgorod.name Twitter: @dealancer #2

  3. Remember the web development in 90s? #3

  4. 1995: JavaScript #4

  5. 2000: XMLHttpRequest #5

  6. 2006: jQuery #6

  7. 2013: ? #7

  8. What's new in JS? HTML5: Local Storage pushState JS templating engines: Mustache.js Twig.js Representative State Transfer (REST) #8

  9. JavaScript client evolution #9

  10. Complexity #10

  11. Thin to thick transition #11

  12. Performance #12

  13. Problems!

  14. Right now typical AJAX code looks like this $(document).ready(function() { $("#getData").click( function() { $.getJSON("artistsRemote.cfc?method=getArtists&returnformat=json", function(data) { $("#artistsContent").empty(); $("#artistsTemplate").tmpl( data ).appendTo("#artistsContent"); varnowIs=new Date().toLocaleString(); $('#lastLoad').html( nowIs ); }); }); }); #14

  15. AJAX in Drupal Have you seen any JS? #15

  16. #16

  17. Let's do things properly! #17

  18. Meet... #18

  19. #19

  20. Backbone.js URL: http://backbonejs.org/ Created by Jeremy Ashkenas in 2010, an author of CoffeeScript Based on Underscore.js: http://backbonejs.org/ Requires jQuery or Zepto #20

  21. Backbone.js features Minimalistic Modular Perfect OOP design Over 100 available extensions: https://github.com/documentcloud/backbone/wiki/Extensions,-Plugins,-Resources Community #21

  22. Backbone vs... Knockout AngularJS CanJS Spine Ember.js many others #22

  23. Backbone vs... #23

  24. Who uses Backbone.js? Groupon Now! Foursquare LinkedIn Mobile Airbnb #24

  25. Let's learn how to backbone! #25

  26. Main concepts Model Collection View Template Router History Events #26

  27. MVC: Backbone: #27 http://www.jboss.org/jdf/examples/ticket-monster/tutorial/UserFrontEnd/

  28. DEMO! TODO APP #28

  29. Easy example

  30. Define the model and the collection // Define new model. varInvoiceItemModel=Backbone.Model.extend({ calculateAmount:function() { returnthis.get('price') *this.get('quantity'); } }); // Define new collection object. varInvoiceItemCollection=Backbone.Collection.extend({ model:InvoiceItemModel }); #30

  31. Define the view to render the model varInvoiceItemView=Backbone.View.extend({ // Define element tag name. tagName:'tr', // Define template. template:_.template($('#item-row-template').html()), // Render the view. render:function() { vardata=this.model.toJSON(); data.amount=this.model.calculateAmount(); $(this.el).html(this.template(data)); returnthis; }, }); #31

  32. Define the view to render the collection varInvoiceItemListView=Backbone.View.extend({ tagName:'table', template:_.template($('#item-table-template').html()), // Render the view. render:function() { $(this.el).html(this.template()); _.each(this.collection.models, function(model, key) { this.append(model); }, this); returnthis; }, // Add an invoice item row to the table. append:function(model) { $(this.el).append(newInvoiceItemView({ model:model }).render().el); } }); #32

  33. Add templates into index.html <script type="text/html"class="template"id="item-table-template"> <tr> <th>Quantity</th> <th>Description</th> <th>Price</th> <th>Amount</th> </tr> </script> <script type="text/html"class="template"id="item-row-template"> <td><%=quantity%></td> <td><%=description%></td> <td><%=price%></td> <td><%=amount%></td> </script> #33

  34. Create collection and show the view varinvoiceItemCollection=newInvoiceItemCollection([ { description:'Wooden Toy House', price:22, quantity:3 }, { description:'Farm Animal Set', price:17, quantity:1 }, ]); $('body').html(newInvoiceItemListView({ collection:invoiceItemCollection }).render().el ); #34

  35. Some cool things Two way binding Forms Model to view binding Layouts Templates Router

  36. Model to view binding varInvoiceItemView=Backbone.View.extend({ // ... initialize:function() { this.listenTo(this.model, 'destroy', this.destroy, this); this.listenTo(this.model, 'change', this.render, this); }, destroy:function() { this.remove(); } }); varInvoiceItemListView=Backbone.View.extend({ // ... initialize:function() { this.listenTo(this.collection, 'add', this.append, this); } }); #36

  37. Forms // Backbone-forms extension. varUserModel=Backbone.Model.extend({ schema: { title: { type:'Select', options: ['Mr', 'Mrs', 'Ms'] }, name:'Text', email: { validators: ['required', 'email'] }, password:'Password', birthday:'Date', } }); userModel=newBuyerModel(); $('body').append(newBackbone.Form({ model:this.user }).form.render().el); #37

  38. Two-way binding // Backbone.stickit extension. varInvoiceItemFormView=Backbone.View.extend({ className:'invoice-item-form-view', bindings: { '#description':'description', '#price':'price', '#quantity':'quantity' }, render:function() { varhtml='<label>Description:</label><input type="text" id="description"></input><br>'+ '<label>Price:</label><input type="text" id="price"></input><br>'+ '<label>Quantity:</label><input type="text" id="quantity"></input><br>'; $(this.el).html(html); // Here binding occurs. this.stickit(); returnthis; } #38

  39. Forms // Backbone-forms extension. varUserModel=Backbone.Model.extend({ schema: { title: { type:'Select', options: ['Mr', 'Mrs', 'Ms'] }, name:'Text', email: { validators: ['required', 'email'] }, password:'Password', birthday:'Date', } }); userModel=newBuyerModel(); $('body').append(newBackbone.Form({ model:this.user }).form.render().el); #39

  40. Router varWorkspace=Backbone.Router.extend({ routes: { // Default path. '':'invoiceList', // Usage of static path. 'invoice':'invoiceList', // Usage of fragment parameter. 'invoice/:id':'invoicePage', // Usage of fragment parameters. 'help/:topic/page:page':'helpPage', // Usage of splat parameter. 'download/*path':'downloadPage' }, }); #40

  41. Other cool things... in Backbone.js Cookbook

  42. Bootstrapping: Technique we saw above Do it yourself Representational State Transfer: Services module RESTful webservices module Backbone.js module Backbone and Drupal 7 #43

  43. REST #44

  44. REST in Backbone varPostModel=Backbone.Model.extend({ // Override id attribute. idAttribute:'_id', // Define URL root to access model resource. Otherwise use // url() method to provide full path to the model resource. urlRoot:function() { return'http://example.com/posts/'; } }); varPostCollection=Backbone.Collection.extend({ model:PostModel, // Define path to the collection resource. url:function() { return'http://example.com/posts/'; } }); #45

  45. REST in Backbone.js // Fetches data into a model. model.fetch(); // Saves a model. model.save(); // Destroys a model. model.destroy(); // Fetches data into a collection. collection.fetch(); // Adds models to a collection. collection.add(models); // Removes specific models from collection. collection.remove(models); #46

  46. Backbone module URL: http://drupal.org/project/backbone Provides models and collections for Drupal entities via REST: Node: Node model All node: NodeIndex collection Arbitrary view: NodeView collection Works with both Services and RESTful Web Services modules. #47

  47. Backbone module // Create new NodeView collection. varviewCollection=newDrupal.Backbone.Collections.NodeView(); // Set Drupal View name. viewCollection.viewName='backbone_example'; // Fetch data from the collection. viewCollection.fetch({success:function() { console.log(viewCollection.toJSON()); }); #48

  48. Backbone mdl roadmap Support for bootstrapping Better views support In-place content editing Drag and Drop D8 version? #49

  49. http://www.flickr.com/photos/gabblebee/3977912731/

More Related