SilverStripe From a Developer's Perspective


Published on

The presentation I gave at the Sydney PHP Users groups on 23/11/10 about SilverStripe and Sapphire from a developer's perspective.

Published in: Technology
  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

SilverStripe From a Developer's Perspective

  1. 1. SILVERSTRIPE & SAPPHIRE From a Developer’s Perspective
  2. 2. About • SilverStripe CMS is built on top of the Sapphire framework • Sapphire is a modular PHP 5, OOP, MVC framework with lots of cool features • Supports Apache and IIS equally well • Can run on MySQL, SQLite, Postgres, MSSQL…
  3. 3. Structure • Everything is a module • Sapphire is the core module, with all (except for direct file retrieval) requests routed through it • The CMS is an module just like any other • All code and theme assets (templates, css etc) are listed in an automatically generated manifest - easy for the system to find
  4. 4. Modules • Module is simply a folder with a _config.php file • Installation as simple as putting a folder in the root directory and building the DB • Defined points to hook into the base CMS functionality using extensions • Everything is a module, including your project code
  5. 5. MVC Let’s look at each of those letters
  6. 6. MVC Definition • Model – contains the behaviour and data of your application. DataObjects and ORM. • View – HTML, and other presentational elements. .ss templates. • Controller – responds to requests and binds the model to the view. *_Controller classes.
  7. 7. Data • You define your models as subclasses of DataObject • Define your fields, relationships, and metadata on the class, automatically built • Uses multiple table inheritance
  8. 8. Defining Your Schema • You define your database fields in a $db array • Automatically pulls casting information from this • Define relationships in their own array • Visit or run /dev/build to rebuild the database • Done!
  9. 9. Easy Relationship Management • Several relationship types – has_one, belongs_to, has_many, many_many, belongs_many_many • Easy accessing: • $this->Relationship($filter); • $this->Relationship()->addMany($items) • $this->Relationship()->map()
  10. 10. Page Types • Complex DataObject, forms the core of most websites • Managed via the main admin panel in the CMS • Easy to customise, can contain any type of data • Make SilverStripe ideal for your data, not the other way around • Each page type is coupled to its own controller
  11. 11. Retrieving Data • Simple accessors – DataObject::get() and DataObject::get_one() • Can use SQLQuery and DB::query() to peek behind the ORM • Automatically caches certain things, performs default sorts and allows hooking into the process
  12. 12. Changing Data • $object->Field = $value • $object->write() • $object->publish(‘Stage’, ‘Live’) • $object->delete()
  13. 13. Extensions (AKA Decorators) • Add functionality to classes at runtime, without subclassing • Can add new methods, database fields, change and enhance behaviour • Many core processes have hooks that extensions can hook in to • Object::add_extension($subject, $extension)
  14. 14. Extensions Continued • Add new database fields and form fields in the CMS • Lock a user out if a third-party criteria is not met • Change the permissions model to either force permissions allowed or denied • Add image editor support to the CMS image insertion form • Restrict content to a specific subsite • Add extra fields to the member profile • Add static caching to the publishing process
  15. 15. Core Extensions • Versioned – adds support for staging/publishing, as well as rolling back to specific versions • Hierarchy – Allows for a tree of objects to be stored in the DB, with related utiltity methods • Translatable – Adds support for saving multiple languages in one table, switch between languages, edit in CMS
  16. 16. Much more than just data • Extensions can hook into all parts of SilverStripe • Basically anywhere a developer calls • $this->extend(‘methodName’) you can hook extra behaviour in
  17. 17. Easy Forms • Out of the box scaffolding • Rich form library, with both simple and complex widgets • Form fields easily integrate with your models, save relationships • $form->saveInto($record); $record->write();
  18. 18. Form Library • Simple Fields – TextField, DropdownField, DateField • Structure Fields – HeaderField, LiteralField • Relationship Fields – ComplexTableField, CheckboxSetField • Much much much more! • Many fields in modules, and its easy to create your own!
  19. 19. Forms in the CMS • Simple to add fields in the CMS • Just overload getCMSFields on your DataObject, and call: $fields->addFieldToTab(‘Root.Tab’, $field) • Can also hook in using extensions to modify the fields on existing objects without subclassing
  20. 20. ModelAdmin • Fully scaffolded CRUD interface, with easy searching. • Easily customisable, anything can be changed. • Can be extended to very complex use cases.
  21. 21. Templating • Simple templating language, cached as raw PHP • Not XML based, used for emails, HTML, all kinds of things • Doesn’t limit the markup you can create • Theming system for bundling templates • Layout and include support across modules
  22. 22. Requirements • System to include, and block CSS and JS assets from templates and PHP code • Supports minifying and combining • Requirements::css(‘mysite/css/my.css’) Requirements::themedCSS(‘mycss’) <% require javascript (mysite/css/my.css) %>
  23. 23. Controllers • Simple URL routing: Director::addRules($priority, $rules) • RequestHandler is a simple barebones controller, just takes a response and returns a response • Controller has more utility methods, support for actions etc.
  24. 24. Controllers Continued • Once the initial URL routing is done, the request is still not always done. • A controller can return a controller as its result, which then moves down the URL and uses that controller to parse the request • This means you can easily create complex controllers from several controllers • For example, the CMS controller returns a Form object, which then leads to a form field, which then renders a pop up • Cascading permissions!
  25. 25. Page Controllers • Each page type also has a corresponding controller, which handles the actual request • Can easily define custom actions, methods as you would expect • Can also define controllers without a matching page to simulate a page without actually having one
  26. 26. THAT’S A QUICK OVERVIEW OF SOME OF THE CORE Now for some cool random features!
  27. 27. Caching Support • Supports full page caching, with optional header management • Can rsync to remote hosts • Automatically updates cache on publish • Partial caching, with automatic invalidation • Integration with Zend_Cache
  28. 28. 2008 DNC
  29. 29. 2008 DNC • One private CMS server, rsynced static content out to several other servers • 100M+ page view • 350 000 hours of HD video, some live • Bi-lingual • Could still make changes to site during heavy load times
  30. 30. Easy API’s • Simple SOAP and RESTful API’s out of the box • Easily convert data to and from XML, JSON, form encoding • Utility classes for consuming APIs • Easily expose updates via RSS
  31. 31. Translation and Internationalisation • Support for simple string translation with PHP language files (in templates as well) • Javascript translation support • DataObjects can have an extension applied to add translatable support • Full translation support in the CMS
  32. 32. Reports • Two types of reports – simple lists of pages in the CMS and more complex reports in their own tab • You can easily define your own reports by extending SS_Report • Just implement a few methods and you’re done!
  33. 33. SearchContext • Allows you to define an “advanced search” interface for your DataObjects • Scaffolded by default, and used in ModelAdmin • Works in both ModelAdmin and the frontend easily • Define advanced search forms with simple code by using “search filters”
  34. 34. And much more • Configurable error handling, emailing and logging. • Easily create scheduled and build tasks • Insert dynamic content into html text fields using shortcodes • Define widgets with a simple drag and drop interface • Sake for running silverstripe commands from the CLI • Easy environment-specific configuration • Page comments
  35. 35. Cool Modules! • User Forms • Queued Jobs • Forum • Blog • Workflow • Sphinx, Solr, Zend_Lucene • Spam protection – recaptcha, mollom.. • And many more!
  36. 36. User Forms Module
  37. 37. DB Plumber
  38. 38. Pixlr Image Editor
  39. 39. What’s Next? • SilverStripe 3 is currently being talked about • New ORM? • New template parser? • Revamped media and download handling? • Better module and configuration management? • More cowbell?
  40. 40. Any Questions?