Successfully reported this slideshow.
Your SlideShare is downloading. ×

Apostrophe

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 29 Ad

Apostrophe

Download to read offline

A content management system your clients and developers will both be happy with. Open source, built on the Symfony MVC framework. Slides from Symfony Live 2011 in San Francisco

A content management system your clients and developers will both be happy with. Open source, built on the Symfony MVC framework. Slides from Symfony Live 2011 in San Francisco

Advertisement
Advertisement

More Related Content

Slideshows for you (19)

Similar to Apostrophe (20)

Advertisement

Recently uploaded (20)

Apostrophe

  1. 1. apostrophenow.com / punkave.com
  2. 2. A Symfony-powered CMS your clients will love Thomas Boutell
  3. 3. What is Apostrophe? Content Management System  Content Management Framework
  4. 4. On the shoulders of giants... PHP Symfony 1.4 Doctrine MySQL  ... and ideas from sfSimpleCMSPlugin
  5. 5. Goals of Apostrophe Easy for clients to update without specialized training Hard for clients to screw up by accident! Extensible by any Symfony developer
  6. 6. Making it easy "When you log in, it just gets awesomer" Do things in context When you can't do things in context, keep it simple Don't require a degree in Drupal-ogy! Check it out: demo.apostrophenow.com
  7. 7. ... OK, but how do you extend it? Relax! It's Still Symfony (RISS) Apostrophe embraces Symfony idioms Slot = Doctrine inheritance + Engine = Symfony module +           Edit view component +                aRoute & aDoctrineRoute +           Normal view component +                Apostrophe page as a "host"           Edit action +           Edit form
  8. 8. Feed Slot: schema.yml aFeedSlot:   inheritance:     extends: aSlot     type: column_aggregation     keyField: type     keyValue: 'aFeed'
  9. 9. Feed Slot: edit view component class BaseaFeedSlotComponents extends aSlotComponents { public function executeEditView() { $this->setup(); // If this is the first validation pass make the form if (!isset($this->form)) { $this->form = new aFeedForm($this->id, $this->slot- >getArrayValue()); } } ... }
  10. 10. Feed Slot: normal view component ... public function executeNormalView() { $this->setup(); $this->values = $this->slot->getArrayValue(); if (!empty($this->values['url'])) { $this->feed = aFeed::fetchCachedFeed( $this->url, ...); ... } }
  11. 11. Feed Slot: edit view partial <?php use_helper('a') ?> <ul class="a-slot-info a-feed-info"> <li><?php echo a_ ('Paste an RSS feed URL, a Twitter @name (with the @), ' . 'or the URL of a page that offers a feed. Most blogs do.' ) ?></li> </ul> <?php echo $form ?>
  12. 12. Feed Slot: normal view partial <?php use_helper('a') ?> <?php if ($editable): ?> <?php // Display the edit button ?> <?php include_partial('a/ simpleEditWithVariants', ... ) ?> <?php endif ?> <ul class="a-feed"> <?php foreach ($feed->getItems() as $feedItem): ?> <?php include_partial('aFeedSlot/'.$options ['itemTemplate'], array('feedItem' => $feedItem, ... )) ?> <?php endforeach ?> </ul>
  13. 13. Feed Slot: edit action class aFeedSlotActions extends aSlotActions { public function executeEdit(sfRequest $request) { $this->editSetup(); $value = $this->getRequestParameter('slot-form-' . $this->id); $this->form = new aFeedForm($this->id, array()); $this->form->bind($value); if ($this->form->isValid()) { // Serialize usually better than extra db columns $this->slot->setArrayValue($this->form->getValues()); return $this->editSave(); } else { // Another validation pass return $this->editRetry(); } ...
  14. 14. Feed Slot: aFeedForm class aFeedForm extends BaseForm { public function __construct($id = 1, $defaults = array()) { $this->id = $id; parent::__construct(); $this->setDefaults($defaults); } public function configure() { $this->setWidget('url', new sfWidgetFormInputText( array('label' => 'RSS Feed URL')))); // Validators for: Twitter handle, lazy URLs, // valid URLs, regular pages with feed URLs in meta tags $this->widgetSchema->setNameFormat('slot-form-' . $this- >id . '[%s]'); $this->widgetSchema->setFormFormatterName('aAdmin'); } }
  15. 15. apostrophe:generate-slot-type FTW! ./symfony apostrophe:generate-slot-type          --plugin=myPlugin          --type=monster Generates: schema.yml Actions and components monsterForm class ... Everything for a basic form-driven slot
  16. 16. Engines: multiple-page experiences A Symfony module... "Grafted" into the page tree Multiple instances allowed Easy to distinguish with categorized content Examples: Bob's blog, Jane's blog, public photo gallery
  17. 17. Media engine: actions class (simplified) class BaseaMediaActions extends aEngineActions { public function executeIndex(sfWebRequest $request) { $this->items = Doctrine::getTable('aMediaItem')- >findAll(); } public function executeShow(sfWebRequest $request) { $this->item = Doctrine::getTable('aMediaItem') ->findOneBySlug($request->getParameter('slug')); } }
  18. 18. Media engine: routing (yml style) a_media_index: url: / class: aRoute param: { module: aMedia, action: index } a_media_show: url: /view/:slug class: aRoute param: { module: aMedia, action: show } requirements: { slug: ^[w-]+$ }
  19. 19. Media engine: routing examples 1. /admin/media ->      Engine page /admin/media     Matches a_media_index route (special case for /) 2. /admin/media/view/iguana ->      Engine page /admin/media      Matches a_media_show route, slug is iguana 3. /iguanapix/view/iguana ->     Engine page /iguanapix     Matches a_media_show route, slug is iguana
  20. 20. Bonus: safe, efficient JS calls + minifier layout.php: <head> <?php a_use_javascripts() ?> <?php a_use_stylesheets() ?> </head> <body> ... At the very END of the body: <?php a_include_js_calls() ?> </body> _list_footer.php: <?php a_js_call('apostrophe.enableUserAdmin(?)', array('choose-one-label' => a_('Choose One...'))); ?>
  21. 21. Apostrophe 2.0
  22. 22. Apostrophe 2.0
  23. 23. Apostrophe 2.0
  24. 24. Apostrophe 2.0
  25. 25. Apostrophe 2.0
  26. 26. Apostrophe 2.0
  27. 27. Apostrophe 2.0
  28. 28. Conclusions 1.5 is awesome now 2.0 will be awesome later You are awesome Let's be awesome together
  29. 29. apostrophenow.com apostrophenow.com

×