Sympal - a CMS based on Symfony




                           Sympal
              Content Management System Based on Symfony




Jonathan H. Wage: Sympal a CMS Based on Symfony            1
Sympal - a CMS based on Symfony




        Sympal is a Content Management System built
        on top of Symfony and Doctrine.

        It is an evolution of many smaller CMS systems
        used in projects over the years.




Jonathan H. Wage: Sympal a CMS Based on Symfony          2
Sympal - a CMS based on Symfony


• Collection of Symfony plugins
   – sfSympalPlugin
       •   sfFeed2Plugin
       •   sfFormExtraPlugin
       •   sfSuperCachePlugin
       •   sfSympalMenuPlugin
       •   sfSympalPagesPlugin
       •   sfSympalPluginManagerPlugin
       •   sfSympalUserPlugin
       •   sfTaskExtraPlugin
       •   sfWebBrowserPlugin

Jonathan H. Wage: Sympal a CMS Based on Symfony   3
Sympal - a CMS based on Symfony




                      The Idea


Jonathan H. Wage: Sympal a CMS Based on Symfony   4
Sympal - a CMS based on Symfony



• The idea spawned from a need
• Custom functionality in Symfony is
  easy
• Standard CMS functionality is not
  so easy



Jonathan H. Wage: Sympal a CMS Based on Symfony   5
Sympal - a CMS based on Symfony


• A project with 75% custom functionality
  and 25% CMS functionality.
• The 75% custom is no problem
• But what about that 25%?
• It sometimes ends up taking more time
  than the 75% custom!
• We repeat ourselves a lot when it
  comes to CMS functionality

Jonathan H. Wage: Sympal a CMS Based on Symfony   6
Sympal - a CMS based on Symfony




 So the idea is to provide what something
like Drupal gives you with a powerful MVC
   framework and ORM under the hood.




Jonathan H. Wage: Sympal a CMS Based on Symfony   7
Sympal - a CMS based on Symfony




The name Sympal was coined by my friend
  and ex co-worker Josh Reynolds a few
years ago while brainstorming. Sympal was
 born that day and I began recording notes
   and collecting code from old projects.

           Symfony + Drupal = Sympal

 Jonathan H. Wage: Sympal a CMS Based on Symfony   8
Sympal - a CMS based on Symfony




  The code has existed in my own private
repositories for a long time but not until the
last few months have I started to formalize
   it in to a working product and made it
             available to the public



Jonathan H. Wage: Sympal a CMS Based on Symfony   9
Sympal - a CMS based on Symfony




                       Highlights



Jonathan H. Wage: Sympal a CMS Based on Symfony   10
Sympal - a CMS based on Symfony



• CLI or web installation
• Menus
• Breadcrumbs
• Content types
• Inline or backend content editing
• Content slots
• Plugin manager - Download/Install/Uninstall Sympal
  plugins from the CLI or web browser.
• Configuration controlled via YAML or a web form
• Security - users, groups and permissions
Jonathan H. Wage: Sympal a CMS Based on Symfony        11
Sympal - a CMS based on Symfony



•   Events
•   Sending E-Mail
•   Multiple Sites
•   Multiple Themes/Layouts
•   Internationalized URLs
•   Map menus to content
•   Change url of content without breaking old urls
•   SEO
•   Logged in user Dashboard
•   Uses YUI for JS framework
Jonathan H. Wage: Sympal a CMS Based on Symfony       12
Sympal - a CMS based on Symfony




                      Installation



Jonathan H. Wage: Sympal a CMS Based on Symfony   13
Sympal - a CMS based on Symfony



• Install from your browser
• Or from the command line
• Use in new or existing projects




Jonathan H. Wage: Sympal a CMS Based on Symfony   14
Sympal - a CMS based on Symfony


  Install from your browser




Jonathan H. Wage: Sympal a CMS Based on Symfony   15
Sympal - a CMS based on Symfony


• Install from the command line
$ php symfony sympal:install --interactive

• Interactive option prompts you for
  the same information as the
  browser installation
• Omit --interactive and default
  values will be used
Jonathan H. Wage: Sympal a CMS Based on Symfony   16
Sympal - a CMS based on Symfony



  Once installed you will see the
  default Sympal website.




Jonathan H. Wage: Sympal a CMS Based on Symfony   17
Sympal - a CMS based on Symfony




                            Menus



Jonathan H. Wage: Sympal a CMS Based on Symfony   18
Sympal - a CMS based on Symfony


• Only requires one query
• Multiple menus
• Sub-menus
• No matter how large or how
  complex they only ever require one
  query.
• Menus can optionally be cached for
  0 queries.
Jonathan H. Wage: Sympal a CMS Based on Symfony   19
Sympal - a CMS based on Symfony


  YUI tree view for managing menus




Jonathan H. Wage: Sympal a CMS Based on Symfony   20
Sympal - a CMS based on Symfony


  Drag and drop ordering




Jonathan H. Wage: Sympal a CMS Based on Symfony   21
Sympal - a CMS based on Symfony



  Right click a menu leaf to manage




Jonathan H. Wage: Sympal a CMS Based on Symfony   22
Sympal - a CMS based on Symfony



  Rendering menus is done with a
  Symfony helper

// returns instance of sfSympalMenuSite which extends sfSympalMenu
$menu = get_sympal_menu('footer');

// sfSympalMenu implements __toString() which invokes rendering
echo $menu;




Jonathan H. Wage: Sympal a CMS Based on Symfony                   23
Sympal - a CMS based on Symfony



  Use custom menu class

 class myMenuClass extends sfSympalMenuSite
 {

 }

 echo get_sympal_menu('footer', true, 'myMenuClass');




Jonathan H. Wage: Sympal a CMS Based on Symfony    24
Sympal - a CMS based on Symfony



• Specify global custom menu class
  in configuration

              all:
                sympal_config:
                   menu_class: myMenuClass



• Now all your menus use that class
Jonathan H. Wage: Sympal a CMS Based on Symfony   25
Sympal - a CMS based on Symfony



• Core of menu system is database
  agnostic
• sfSympalMenu implements the basic
  menu functionality
• sfSympalMenuSite extends
  sfSympalMenu and implements the
  binding to the Doctrine MenuItem
  model
Jonathan H. Wage: Sympal a CMS Based on Symfony   26
Sympal - a CMS based on Symfony



    Using sfSympalMenu standalone
$menu = new sfSympalMenu('My Test Menu');

$menu->addChild('Google', 'http://www.google.com');

$sensio = $menu->addChild('Sensio', 'http://www.sensio.com');
$sensio->addChild('Sensio Labs', 'http://www.sensiolabs.com');
$sensio->addChild('The Symfony MVC Framework', 'http://www.symfony-project.com');
$sensio->addChild('The Symfony Components', 'http://components.symfony-
project.org');
$sensio->addChild('The Doctrine ORM', 'http://www.doctrine-project.org');

$menu->addChild('Yahoo', 'http://www.yahoo.com');

echo $menu;



  Jonathan H. Wage: Sympal a CMS Based on Symfony                          27
Sympal - a CMS based on Symfony



• Serves multiple purposes
   – Breadcrumbs
   – Admin bar menu
   – Floating editor panel
• Building hierarchical structure
  through OO interface
• Rendering HTML for the hierarchy

Jonathan H. Wage: Sympal a CMS Based on Symfony   28
Sympal - a CMS based on Symfony


• Connect to events to alter these
  objects before they are rendered
• Sympal plugins can add items to
  the admin bar, menus, floating
  editor panel, etc.
• Install a Sympal plugin and the
  functionality appears in your site
  and is instantly available.
Jonathan H. Wage: Sympal a CMS Based on Symfony   29
Sympal - a CMS based on Symfony



• The rendering of menus are done through these functions
  which can be overridden and customized.
   – render()
   – renderChild()
   – renderChildBody()
   – renderLink()
   – renderLabel()
• Rendering is split in to multiple methods to allow you to
  override only the pieces you need to change.


Jonathan H. Wage: Sympal a CMS Based on Symfony               30
Sympal - a CMS based on Symfony



• Admin bar rendering is customized
  with sfSympalMenuAdminBar class

• Overrides renderChild() method so
  that the proper HTML is generated
  for YUI to work


Jonathan H. Wage: Sympal a CMS Based on Symfony   31
Sympal - a CMS based on Symfony




                   Breadcrumbs



Jonathan H. Wage: Sympal a CMS Based on Symfony   32
Sympal - a CMS based on Symfony



• Breadcrumbs don’t require any
  additional queries
• Generated from the same
  information used for menus
• Also generated with special child
  class of sfSympalMenuSite named
  sfSympalMenuBreadcrumbs
Jonathan H. Wage: Sympal a CMS Based on Symfony   33
Sympal - a CMS based on Symfony



  Rendering breadcrumbs are done with a Symfony helper,
  similar to the menus

    // Get the current menu item to render breadcrumbs for
    // Or render breadcrumbs for any Doctrine MenuItem instance
    $menuItem = sfSympalToolkit::getCurrentMenuItem();

    // Returns instance of sfSympalMenuBreadcrumbs
    $breadcrumbs = get_sympal_breadcrumbs($menuItem);

    echo $breadcrumbs;




Jonathan H. Wage: Sympal a CMS Based on Symfony                   34
Sympal - a CMS based on Symfony




                  Content Types



Jonathan H. Wage: Sympal a CMS Based on Symfony   35
Sympal - a CMS based on Symfony



• Sympal comes bundled with two
  content types
   – Page - Simple title and body
   – ContentList - Content type which allows you to specify
     information to render a list of another type of content.
       •   Specify the query
       •   Sorting
       •   Limit
       •   Conditions of list, etc.
       •   What template to render the list with
Jonathan H. Wage: Sympal a CMS Based on Symfony             36
Sympal - a CMS based on Symfony



• Easily add new content types
  through Sympal plugins
• Generate a new Sympal plugin that
  contains the skeleton for a new
  content type which can be installed



Jonathan H. Wage: Sympal a CMS Based on Symfony   37
Sympal - a CMS based on Symfony


  Generate the new Sympal plugin
$ php symfony sympal:plugin-generate Article --content-type=Article
          sfSympalArticlePlugin/
          
   config/
          
   
    doctrine/
          
   
    
   schema.yml
          
   
    routing.yml
          
   
    sfSympalArticlePluginConfiguration.class.php
          
   data/
          
   
    fixtures/
          
   
    
   install.yml
          
   lib/
          
   LICENSE
          
   package.xml.tmpl
          
   README

Jonathan H. Wage: Sympal a CMS Based on Symfony                  38
Sympal - a CMS based on Symfony


• Inspect the generated plugin
• Have a look at the default
  schema.yml created
             ---
             Article:
               actAs: [sfSympalContentType]
               columns:
                 title: string(255)
                 body: clob


Jonathan H. Wage: Sympal a CMS Based on Symfony   39
Sympal - a CMS based on Symfony

• Now we can install the generated plugin
$ php symfony sympal:plugin-install Article

• Installation does the following
   – Generates models, forms, etc. for schema
   – Creates tables in the database
   – Adds a sample content list for content type
   – Adds a sample content record for content type
   – Adds a menu item to the primary menu which is
     mapped to the content list for the new content
     type

Jonathan H. Wage: Sympal a CMS Based on Symfony   40
Sympal - a CMS based on Symfony


  When we go to add new content we
  can now add Articles




Jonathan H. Wage: Sympal a CMS Based on Symfony   41
Sympal - a CMS based on Symfony


  We can click the menu item added
  to the primary menu to view the list
  of articles.




Jonathan H. Wage: Sympal a CMS Based on Symfony   42
Sympal - a CMS based on Symfony



  Click the sample article to view it




Jonathan H. Wage: Sympal a CMS Based on Symfony   43
Sympal - a CMS based on Symfony


• Rendering of content types utilizes
  Content Templates
• Use different templates to render
  different content types
• Use different templates to render
  individual content records
• By default it just uses some basic
  templates
Jonathan H. Wage: Sympal a CMS Based on Symfony   44
Sympal - a CMS based on Symfony




                   Inline Editing



Jonathan H. Wage: Sympal a CMS Based on Symfony   45
Sympal - a CMS based on Symfony



  Sympal allows you to edit your
  content inline when logged in as an
  authorized content editor.




Jonathan H. Wage: Sympal a CMS Based on Symfony   46
Sympal - a CMS based on Symfony


  When you double click some
  content to edit the inline editor will
  come up




Jonathan H. Wage: Sympal a CMS Based on Symfony   47
Sympal - a CMS based on Symfony



  Edit model columns inline in
  addition to content slots




Jonathan H. Wage: Sympal a CMS Based on Symfony   48
Sympal - a CMS based on Symfony




                Plugin Manager



Jonathan H. Wage: Sympal a CMS Based on Symfony   49
Sympal - a CMS based on Symfony



• Download, install and uninstall plugins
• Works from the CLI or web browser
• Sympal plugin manager tries to get a
  plugin through the symfony
  plugin:install task first then tries to find
  the plugin in SVN and check it out


Jonathan H. Wage: Sympal a CMS Based on Symfony   50
Sympal - a CMS based on Symfony



  From the command line




Jonathan H. Wage: Sympal a CMS Based on Symfony   51
Sympal - a CMS based on Symfony



  From the web browser




Jonathan H. Wage: Sympal a CMS Based on Symfony   52
Sympal - a CMS based on Symfony




Jonathan H. Wage: Sympal a CMS Based on Symfony   53
Sympal - a CMS based on Symfony




                   Configuration



Jonathan H. Wage: Sympal a CMS Based on Symfony   54
Sympal - a CMS based on Symfony



  Controlled via YAML

      all:
        sympal_config:
           menu_class: sfSympalMenuSite
           yui_path: http://yui.yahooapis.com/2.7.0/build
           super_admin_signin_url: @sympal_dashboard
           enable_all_modules: true
           admin_module_web_dir: /sfSympalPlugin
           load_default_css: true




Jonathan H. Wage: Sympal a CMS Based on Symfony             55
Sympal - a CMS based on Symfony



• Or YAML can be controlled via a
  web form
• When configuration form is saved
  the YAML file is written




Jonathan H. Wage: Sympal a CMS Based on Symfony   56
Sympal - a CMS based on Symfony



• Since the configuration uses the
  symfony app.yml it can be controlled at
  different levels of symfony
   – Project
   – Application
   – Module




Jonathan H. Wage: Sympal a CMS Based on Symfony   57
Sympal - a CMS based on Symfony



• Other items related to content records can be
  configured at different levels. For example the
  layout can be controlled
   – Globally
   – Per site
   – Per content type
   – Per content record
• This means you can customize the layout an
  individual content record uses.

Jonathan H. Wage: Sympal a CMS Based on Symfony   58
Sympal - a CMS based on Symfony




                          Security



Jonathan H. Wage: Sympal a CMS Based on Symfony   59
Sympal - a CMS based on Symfony



• sfSympalUserPlugin is forked version of
  sfDoctrineGuardPlugin
   – Users
   – Groups
   – Permissions
   – Forgot Password
   – Registration

• Menus, content records, etc. can all be locked down with
  permissions.


Jonathan H. Wage: Sympal a CMS Based on Symfony          60
Sympal - a CMS based on Symfony



  List users




Jonathan H. Wage: Sympal a CMS Based on Symfony   61
Sympal - a CMS based on Symfony



  Edit users




Jonathan H. Wage: Sympal a CMS Based on Symfony   62
Sympal - a CMS based on Symfony



  List groups




Jonathan H. Wage: Sympal a CMS Based on Symfony   63
Sympal - a CMS based on Symfony



  Edit group




Jonathan H. Wage: Sympal a CMS Based on Symfony   64
Sympal - a CMS based on Symfony



  List permissions




Jonathan H. Wage: Sympal a CMS Based on Symfony   65
Sympal - a CMS based on Symfony



  Edit permission




Jonathan H. Wage: Sympal a CMS Based on Symfony   66
Sympal - a CMS based on Symfony




    Sympal Admin Generator
            Theme



Jonathan H. Wage: Sympal a CMS Based on Symfony   67
Sympal - a CMS based on Symfony



• Sympal comes with custom admin
  generator them
• Tabbed forms for fieldsets and
  embedded forms




Jonathan H. Wage: Sympal a CMS Based on Symfony   68
Sympal - a CMS based on Symfony



  Easily click Filters to popup the
  filters form




Jonathan H. Wage: Sympal a CMS Based on Symfony   69
Sympal - a CMS based on Symfony




         Floating Editor Panel



Jonathan H. Wage: Sympal a CMS Based on Symfony   70
Sympal - a CMS based on Symfony



  When logged in as editor and viewing a content
  record a floating editor panel is displayed




Jonathan H. Wage: Sympal a CMS Based on Symfony   71
Sympal - a CMS based on Symfony




            Content Slot Types



Jonathan H. Wage: Sympal a CMS Based on Symfony   72
Sympal - a CMS based on Symfony



• A content slot in Sympal is an
  arbitrary piece of content and has a
  type.

• Sympal comes bundled with a few
  content slot types


Jonathan H. Wage: Sympal a CMS Based on Symfony   73
Sympal - a CMS based on Symfony



• The default slot types offered by
  Sympal are
   – Markdown
   – MultiLineText
   – RichText
   – Text
• Add your own custom slot types for
  your projects
Jonathan H. Wage: Sympal a CMS Based on Symfony   74
Sympal - a CMS based on Symfony




           YUI Rich Text Editor



Jonathan H. Wage: Sympal a CMS Based on Symfony   75
Sympal - a CMS based on Symfony



  The RichText slot type uses the YUI
  rich text editor




Jonathan H. Wage: Sympal a CMS Based on Symfony   76
Sympal - a CMS based on Symfony



  The YUI rich text editor also
  implements the ability to upload
  and embed images inline




Jonathan H. Wage: Sympal a CMS Based on Symfony   77
Sympal - a CMS based on Symfony




               Sending E-Mails



Jonathan H. Wage: Sympal a CMS Based on Symfony   78
Sympal - a CMS based on Symfony



• A reoccurring need
• Re-implementing the functionality
  over and over wasting time
• We need a standard way to send
  and manage our e-mail templates
• Sympal offers a solution

Jonathan H. Wage: Sympal a CMS Based on Symfony   79
Sympal - a CMS based on Symfony



  In your actions you can easily
  create new e-mails and send them
       class my_moduleActions extends sfActions
       {
         public function executeSome_action(sfWebRequest $request)
         {
           $variables = array(
              'name' => 'Jonathan H. Wage'
           );
           $email = $this->newEmail('email_module/test', $variables);
           $email->send('jonwage@gmail.com');
         }
       }



Jonathan H. Wage: Sympal a CMS Based on Symfony                         80
Sympal - a CMS based on Symfony



 • The templates used for a Sympal e-
   mail are just a partial or component
 • In the previous example we use a
   partial named _test.php
Hello <?php echo $name ?>,
This is a test e-mail that we are sending to <?php echo $name ?>




 Jonathan H. Wage: Sympal a CMS Based on Symfony           81
Sympal - a CMS based on Symfony



• The first line of the template is the
  subject
• The second line and after is the
  body of the e-mail
• This way the contents of the e-
  mail(subject and body) are
  managed in one place
Jonathan H. Wage: Sympal a CMS Based on Symfony   82
Sympal - a CMS based on Symfony



• The newEmail() method returns an
  instance of sfSympalMail

• sfSympalMail is a wrapper around
  your mail sending program which
  defaults to Swift in Sympal


Jonathan H. Wage: Sympal a CMS Based on Symfony   83
Sympal - a CMS based on Symfony




                   Multiple Sites



Jonathan H. Wage: Sympal a CMS Based on Symfony   84
Sympal - a CMS based on Symfony


• Sympal can handle multiple sites

• A sympal site is directly bound to a
  symfony application

• This is how Sympal knows which
  site you are in and can limit the
  data to only that site
Jonathan H. Wage: Sympal a CMS Based on Symfony   85
Sympal - a CMS based on Symfony




Jonathan H. Wage: Sympal a CMS Based on Symfony   86
Sympal - a CMS based on Symfony




Search Engine Optimization



Jonathan H. Wage: Sympal a CMS Based on Symfony   87
Sympal - a CMS based on Symfony



• SEO capabilities are built in
• You can specify global title,
  keywords and description for your
  project.
• They can also be overridden by
  each site or even by individual
  content records
Jonathan H. Wage: Sympal a CMS Based on Symfony   88
Sympal - a CMS based on Symfony


• sfSympalAutoSEOPlugin
   – Who is going to write it? :)
   – Automatically generate SEO for content
     records from the final rendered HTML
       • Parse the first <h1> tag value for the meta title
       • Build a list of top words used in the content
         record for the meta keywords
       • Parse the first <p> tag value for the meta
         description
   – Write good content and you’ll have SEO

Jonathan H. Wage: Sympal a CMS Based on Symfony          89
Sympal - a CMS based on Symfony




                      Dashboard



Jonathan H. Wage: Sympal a CMS Based on Symfony   90
Sympal - a CMS based on Symfony



  When a user logs in and has some credentials he’ll be
  forwarded to his dashboard. A super administrator would
  see everything. Something like the below...




Jonathan H. Wage: Sympal a CMS Based on Symfony             91
Sympal - a CMS based on Symfony



• Dashboard is generated using the
  sfSympalMenu classes

• The menu instance used to
  generate the dashboard is passed
  through an event so you can easily
  add to it by connecting to an event
Jonathan H. Wage: Sympal a CMS Based on Symfony   92
Sympal - a CMS based on Symfony



  Connect to dashboard event and
  add to the menu object
           class sfSympalTestPluginConfiguration extends sfPluginConfiguration
           {
             public function initialize()
             {
               $this->dispatcher->connect('sympal.load_dashboard_boxes',
                  array($this, 'loadDashboardBoxes')
               );
             }

               public function loadDashboardBoxes(sfEvent $event)
               {
                 $menu = $event['menu'];
                 $menu->addChild('My New Box', '@route_name');
               }
           }




Jonathan H. Wage: Sympal a CMS Based on Symfony                                  93
Sympal - a CMS based on Symfony




               Multiple Themes



Jonathan H. Wage: Sympal a CMS Based on Symfony   94
Sympal - a CMS based on Symfony



• Sympal offers the ability to have
  themes and you can configure in
  multiple places what them to use
   – Globally
   – Per site
   – Per content type
   – Or per content record


Jonathan H. Wage: Sympal a CMS Based on Symfony   95
Sympal - a CMS based on Symfony



• We can now easily have Sympal theme plugins
  that you can download and instantly have a
  new theme to change to
• We already have three themes available that
  you can download and use
   – sfSympalPlugin - The default theme included with
     Sympal
   – sfSympalJwageThemePlugin - The theme used on my
     personal website, jwage.com
   – sfSympalDoctrineThemePlugin - The theme which
     powers the Doctrine website
Jonathan H. Wage: Sympal a CMS Based on Symfony     96
Sympal - a CMS based on Symfony

        Doctrine Theme




        Sympal Theme




Jonathan H. Wage: Sympal a CMS Based on Symfony   97
Sympal - a CMS based on Symfony




             Sympal CLI Tasks



Jonathan H. Wage: Sympal a CMS Based on Symfony   98
Sympal - a CMS based on Symfony



  Sympal comes with some other
  pretty useful tasks for improving
  your productivity when working in
  Symfony




Jonathan H. Wage: Sympal a CMS Based on Symfony   99
Sympal - a CMS based on Symfony


• Most notable CLI tasks
  – sympal:delete-model - Delete a model from your
    project. Finds and deletes model, form and filter files all
    in one command
  – sympal:report-statistics - This task will report back to the
    Symfony Plugins API what all plugins you’re using in
    your project and will add them to your stack.
  – sympal:event-list - Report a list of events that are
    available for a URL in your application
      • See who has connected to an event

 Jonathan H. Wage: Sympal a CMS Based on Symfony          100
Sympal - a CMS based on Symfony



  Show a list of all available events
  for a URL




Jonathan H. Wage: Sympal a CMS Based on Symfony   101
Sympal - a CMS based on Symfony



  Show only the events which have
  been connected to




Jonathan H. Wage: Sympal a CMS Based on Symfony   102
Sympal - a CMS based on Symfony



  Inspect an individual event to see
  who has connected to it and more
  importantly where!




Jonathan H. Wage: Sympal a CMS Based on Symfony   103
Sympal - a CMS based on Symfony




      More on Sympal Events



Jonathan H. Wage: Sympal a CMS Based on Symfony   104
Sympal - a CMS based on Symfony



• Some might say I have overused
  the Symfony events system in
  Sympal

• But, I really like it and I find it very
  useful in the CMS context. It allows
  for things to be very flexible and
  “changeable” by use of events.
Jonathan H. Wage: Sympal a CMS Based on Symfony   105
Sympal - a CMS based on Symfony



• A re-occurring question
   – How can I add to a model of another plugin,
     or a model in my project from a plugin.

   – Before Sympal this was not possible but now
     if you models simply actAs sfSympalRecord
     or sfSympalContentType you can connect to
     an event which is notified during the setup of
     a Doctrine model

Jonathan H. Wage: Sympal a CMS Based on Symfony   106
Sympal - a CMS based on Symfony



• Add a new column to the Sympal User
  model
• The schema for the model looks like
  this User:
              tableName: users
              actAs: [Timestampable, sfSympalRecord]
              columns:
                first_name: string(255)
                last_name: string(255)
            # ...


Jonathan H. Wage: Sympal a CMS Based on Symfony        107
Sympal - a CMS based on Symfony



• The actAs: [sfSympalRecord]
  allows us to connect to two events
   – sympal.user.set_table_definition
   – sympal.user.set_up
• The set table definition allows us to
  add new columns, indexes, etc.
• The set up allows us to add
  relationships, add behaviors, etc.
Jonathan H. Wage: Sympal a CMS Based on Symfony   108
Sympal - a CMS based on Symfony


  Now lets connect to the set table
  definition event and add a new column
  class sfSympalTestPluginConfiguration extends sfPluginConfiguration
  {
    public function initialize()
    {
      $this->dispatcher->connect('sympal.user.set_table_definition',
         array($this, 'setUserTableDefinition')
      );
    }

      public function setUserTableDefinition(sfEvent $event)
      {
        $model = $event->getSubject();
        $model->hasColumn('my_new_column', 'string', 255);
      }
  }

Jonathan H. Wage: Sympal a CMS Based on Symfony                         109
Sympal - a CMS based on Symfony



• We have a lot more events and I can’t talk about them all
• But I will try and list some of the other notable events
   –   sympal.user.pre_signin
   –   sympal.user.post_signin
   –   sympal.load_breadcrumbs
   –   sympal.<model_name>.method_not_found
   –   sympal.post_render_page_content
   –   sympal.load_tools




Jonathan H. Wage: Sympal a CMS Based on Symfony          110
Sympal - a CMS based on Symfony



  With the Symfony events and the PHP __call()
  magic function we can fake “extending” a class
  by invoking a method_not_found event and
  letting users connect to it
     class sfSympalTestPluginConfiguration extends sfPluginConfiguration
     {
       public function initialize()
       {
         $this->dispatcher->connect('sympal.user.method_not_found',
            array(new myUserExtension(), 'extend')
         );
       }
     }



Jonathan H. Wage: Sympal a CMS Based on Symfony                            111
Sympal - a CMS based on Symfony



  Now lets define the
  myUserExtension class and add
  some new functionality
  class myUserExtension extends sfSympalExtendClass
  {
    public function getFullName()
    {
      return trim($this->getFirstName().' '.$this->getLastName());
    }
  }



Jonathan H. Wage: Sympal a CMS Based on Symfony                 112
Sympal - a CMS based on Symfony



  Now when I work with a User model
  instance I will be able to access my
  getFullName() method

          $user = new User();
          $user->first_name = 'Jonathan';
          $user->last_name = 'Wage';

          echo $user->getFullName(); // Jonathan Wage



Jonathan H. Wage: Sympal a CMS Based on Symfony         113
Sympal - a CMS based on Symfony




                   What is next?



Jonathan H. Wage: Sympal a CMS Based on Symfony   114
Sympal - a CMS based on Symfony



• Continued development of Sympal

• Work towards a 1.0 release

• Spread the word and try and get as
  much feedback as possible

Jonathan H. Wage: Sympal a CMS Based on Symfony   115
Sympal - a CMS based on Symfony




             What do we need?



Jonathan H. Wage: Sympal a CMS Based on Symfony   116
Sympal - a CMS based on Symfony



• Users, testers, feedback, etc.

• Development help, documentation
  help

• For development, we need the
  most help with the frontend
Jonathan H. Wage: Sympal a CMS Based on Symfony   117
Sympal - a CMS based on Symfony



• Frontend development
   – YUI/JS/CSS guru
   – Usability guru
• Backend development
   – Familiarity with Symfony and Doctrine
     obviously
   – Familiarity with other popular CMS in any
     other languages to help with functionality and
     implementation
Jonathan H. Wage: Sympal a CMS Based on Symfony   118
Sympal - a CMS based on Symfony


                         Questions?
       Jonathan H. Wage
       jonathan.wage@sensio.com
       +1 415 992 5468

       sensiolabs.com | doctrine-project.org | sympalphp.org | jwage.com



You can contact Jonathan about Doctrine and Open-Source or
 for training, consulting, application development, or business
        related questions at jonathan.wage@sensio.com


Jonathan H. Wage: Sympal a CMS Based on Symfony                            119

Sympal A Cmf Based On Symfony

  • 1.
    Sympal - aCMS based on Symfony Sympal Content Management System Based on Symfony Jonathan H. Wage: Sympal a CMS Based on Symfony 1
  • 2.
    Sympal - aCMS based on Symfony Sympal is a Content Management System built on top of Symfony and Doctrine. It is an evolution of many smaller CMS systems used in projects over the years. Jonathan H. Wage: Sympal a CMS Based on Symfony 2
  • 3.
    Sympal - aCMS based on Symfony • Collection of Symfony plugins – sfSympalPlugin • sfFeed2Plugin • sfFormExtraPlugin • sfSuperCachePlugin • sfSympalMenuPlugin • sfSympalPagesPlugin • sfSympalPluginManagerPlugin • sfSympalUserPlugin • sfTaskExtraPlugin • sfWebBrowserPlugin Jonathan H. Wage: Sympal a CMS Based on Symfony 3
  • 4.
    Sympal - aCMS based on Symfony The Idea Jonathan H. Wage: Sympal a CMS Based on Symfony 4
  • 5.
    Sympal - aCMS based on Symfony • The idea spawned from a need • Custom functionality in Symfony is easy • Standard CMS functionality is not so easy Jonathan H. Wage: Sympal a CMS Based on Symfony 5
  • 6.
    Sympal - aCMS based on Symfony • A project with 75% custom functionality and 25% CMS functionality. • The 75% custom is no problem • But what about that 25%? • It sometimes ends up taking more time than the 75% custom! • We repeat ourselves a lot when it comes to CMS functionality Jonathan H. Wage: Sympal a CMS Based on Symfony 6
  • 7.
    Sympal - aCMS based on Symfony So the idea is to provide what something like Drupal gives you with a powerful MVC framework and ORM under the hood. Jonathan H. Wage: Sympal a CMS Based on Symfony 7
  • 8.
    Sympal - aCMS based on Symfony The name Sympal was coined by my friend and ex co-worker Josh Reynolds a few years ago while brainstorming. Sympal was born that day and I began recording notes and collecting code from old projects. Symfony + Drupal = Sympal Jonathan H. Wage: Sympal a CMS Based on Symfony 8
  • 9.
    Sympal - aCMS based on Symfony The code has existed in my own private repositories for a long time but not until the last few months have I started to formalize it in to a working product and made it available to the public Jonathan H. Wage: Sympal a CMS Based on Symfony 9
  • 10.
    Sympal - aCMS based on Symfony Highlights Jonathan H. Wage: Sympal a CMS Based on Symfony 10
  • 11.
    Sympal - aCMS based on Symfony • CLI or web installation • Menus • Breadcrumbs • Content types • Inline or backend content editing • Content slots • Plugin manager - Download/Install/Uninstall Sympal plugins from the CLI or web browser. • Configuration controlled via YAML or a web form • Security - users, groups and permissions Jonathan H. Wage: Sympal a CMS Based on Symfony 11
  • 12.
    Sympal - aCMS based on Symfony • Events • Sending E-Mail • Multiple Sites • Multiple Themes/Layouts • Internationalized URLs • Map menus to content • Change url of content without breaking old urls • SEO • Logged in user Dashboard • Uses YUI for JS framework Jonathan H. Wage: Sympal a CMS Based on Symfony 12
  • 13.
    Sympal - aCMS based on Symfony Installation Jonathan H. Wage: Sympal a CMS Based on Symfony 13
  • 14.
    Sympal - aCMS based on Symfony • Install from your browser • Or from the command line • Use in new or existing projects Jonathan H. Wage: Sympal a CMS Based on Symfony 14
  • 15.
    Sympal - aCMS based on Symfony Install from your browser Jonathan H. Wage: Sympal a CMS Based on Symfony 15
  • 16.
    Sympal - aCMS based on Symfony • Install from the command line $ php symfony sympal:install --interactive • Interactive option prompts you for the same information as the browser installation • Omit --interactive and default values will be used Jonathan H. Wage: Sympal a CMS Based on Symfony 16
  • 17.
    Sympal - aCMS based on Symfony Once installed you will see the default Sympal website. Jonathan H. Wage: Sympal a CMS Based on Symfony 17
  • 18.
    Sympal - aCMS based on Symfony Menus Jonathan H. Wage: Sympal a CMS Based on Symfony 18
  • 19.
    Sympal - aCMS based on Symfony • Only requires one query • Multiple menus • Sub-menus • No matter how large or how complex they only ever require one query. • Menus can optionally be cached for 0 queries. Jonathan H. Wage: Sympal a CMS Based on Symfony 19
  • 20.
    Sympal - aCMS based on Symfony YUI tree view for managing menus Jonathan H. Wage: Sympal a CMS Based on Symfony 20
  • 21.
    Sympal - aCMS based on Symfony Drag and drop ordering Jonathan H. Wage: Sympal a CMS Based on Symfony 21
  • 22.
    Sympal - aCMS based on Symfony Right click a menu leaf to manage Jonathan H. Wage: Sympal a CMS Based on Symfony 22
  • 23.
    Sympal - aCMS based on Symfony Rendering menus is done with a Symfony helper // returns instance of sfSympalMenuSite which extends sfSympalMenu $menu = get_sympal_menu('footer'); // sfSympalMenu implements __toString() which invokes rendering echo $menu; Jonathan H. Wage: Sympal a CMS Based on Symfony 23
  • 24.
    Sympal - aCMS based on Symfony Use custom menu class class myMenuClass extends sfSympalMenuSite { } echo get_sympal_menu('footer', true, 'myMenuClass'); Jonathan H. Wage: Sympal a CMS Based on Symfony 24
  • 25.
    Sympal - aCMS based on Symfony • Specify global custom menu class in configuration all: sympal_config: menu_class: myMenuClass • Now all your menus use that class Jonathan H. Wage: Sympal a CMS Based on Symfony 25
  • 26.
    Sympal - aCMS based on Symfony • Core of menu system is database agnostic • sfSympalMenu implements the basic menu functionality • sfSympalMenuSite extends sfSympalMenu and implements the binding to the Doctrine MenuItem model Jonathan H. Wage: Sympal a CMS Based on Symfony 26
  • 27.
    Sympal - aCMS based on Symfony Using sfSympalMenu standalone $menu = new sfSympalMenu('My Test Menu'); $menu->addChild('Google', 'http://www.google.com'); $sensio = $menu->addChild('Sensio', 'http://www.sensio.com'); $sensio->addChild('Sensio Labs', 'http://www.sensiolabs.com'); $sensio->addChild('The Symfony MVC Framework', 'http://www.symfony-project.com'); $sensio->addChild('The Symfony Components', 'http://components.symfony- project.org'); $sensio->addChild('The Doctrine ORM', 'http://www.doctrine-project.org'); $menu->addChild('Yahoo', 'http://www.yahoo.com'); echo $menu; Jonathan H. Wage: Sympal a CMS Based on Symfony 27
  • 28.
    Sympal - aCMS based on Symfony • Serves multiple purposes – Breadcrumbs – Admin bar menu – Floating editor panel • Building hierarchical structure through OO interface • Rendering HTML for the hierarchy Jonathan H. Wage: Sympal a CMS Based on Symfony 28
  • 29.
    Sympal - aCMS based on Symfony • Connect to events to alter these objects before they are rendered • Sympal plugins can add items to the admin bar, menus, floating editor panel, etc. • Install a Sympal plugin and the functionality appears in your site and is instantly available. Jonathan H. Wage: Sympal a CMS Based on Symfony 29
  • 30.
    Sympal - aCMS based on Symfony • The rendering of menus are done through these functions which can be overridden and customized. – render() – renderChild() – renderChildBody() – renderLink() – renderLabel() • Rendering is split in to multiple methods to allow you to override only the pieces you need to change. Jonathan H. Wage: Sympal a CMS Based on Symfony 30
  • 31.
    Sympal - aCMS based on Symfony • Admin bar rendering is customized with sfSympalMenuAdminBar class • Overrides renderChild() method so that the proper HTML is generated for YUI to work Jonathan H. Wage: Sympal a CMS Based on Symfony 31
  • 32.
    Sympal - aCMS based on Symfony Breadcrumbs Jonathan H. Wage: Sympal a CMS Based on Symfony 32
  • 33.
    Sympal - aCMS based on Symfony • Breadcrumbs don’t require any additional queries • Generated from the same information used for menus • Also generated with special child class of sfSympalMenuSite named sfSympalMenuBreadcrumbs Jonathan H. Wage: Sympal a CMS Based on Symfony 33
  • 34.
    Sympal - aCMS based on Symfony Rendering breadcrumbs are done with a Symfony helper, similar to the menus // Get the current menu item to render breadcrumbs for // Or render breadcrumbs for any Doctrine MenuItem instance $menuItem = sfSympalToolkit::getCurrentMenuItem(); // Returns instance of sfSympalMenuBreadcrumbs $breadcrumbs = get_sympal_breadcrumbs($menuItem); echo $breadcrumbs; Jonathan H. Wage: Sympal a CMS Based on Symfony 34
  • 35.
    Sympal - aCMS based on Symfony Content Types Jonathan H. Wage: Sympal a CMS Based on Symfony 35
  • 36.
    Sympal - aCMS based on Symfony • Sympal comes bundled with two content types – Page - Simple title and body – ContentList - Content type which allows you to specify information to render a list of another type of content. • Specify the query • Sorting • Limit • Conditions of list, etc. • What template to render the list with Jonathan H. Wage: Sympal a CMS Based on Symfony 36
  • 37.
    Sympal - aCMS based on Symfony • Easily add new content types through Sympal plugins • Generate a new Sympal plugin that contains the skeleton for a new content type which can be installed Jonathan H. Wage: Sympal a CMS Based on Symfony 37
  • 38.
    Sympal - aCMS based on Symfony Generate the new Sympal plugin $ php symfony sympal:plugin-generate Article --content-type=Article sfSympalArticlePlugin/ config/ doctrine/ schema.yml routing.yml sfSympalArticlePluginConfiguration.class.php data/ fixtures/ install.yml lib/ LICENSE package.xml.tmpl README Jonathan H. Wage: Sympal a CMS Based on Symfony 38
  • 39.
    Sympal - aCMS based on Symfony • Inspect the generated plugin • Have a look at the default schema.yml created --- Article: actAs: [sfSympalContentType] columns: title: string(255) body: clob Jonathan H. Wage: Sympal a CMS Based on Symfony 39
  • 40.
    Sympal - aCMS based on Symfony • Now we can install the generated plugin $ php symfony sympal:plugin-install Article • Installation does the following – Generates models, forms, etc. for schema – Creates tables in the database – Adds a sample content list for content type – Adds a sample content record for content type – Adds a menu item to the primary menu which is mapped to the content list for the new content type Jonathan H. Wage: Sympal a CMS Based on Symfony 40
  • 41.
    Sympal - aCMS based on Symfony When we go to add new content we can now add Articles Jonathan H. Wage: Sympal a CMS Based on Symfony 41
  • 42.
    Sympal - aCMS based on Symfony We can click the menu item added to the primary menu to view the list of articles. Jonathan H. Wage: Sympal a CMS Based on Symfony 42
  • 43.
    Sympal - aCMS based on Symfony Click the sample article to view it Jonathan H. Wage: Sympal a CMS Based on Symfony 43
  • 44.
    Sympal - aCMS based on Symfony • Rendering of content types utilizes Content Templates • Use different templates to render different content types • Use different templates to render individual content records • By default it just uses some basic templates Jonathan H. Wage: Sympal a CMS Based on Symfony 44
  • 45.
    Sympal - aCMS based on Symfony Inline Editing Jonathan H. Wage: Sympal a CMS Based on Symfony 45
  • 46.
    Sympal - aCMS based on Symfony Sympal allows you to edit your content inline when logged in as an authorized content editor. Jonathan H. Wage: Sympal a CMS Based on Symfony 46
  • 47.
    Sympal - aCMS based on Symfony When you double click some content to edit the inline editor will come up Jonathan H. Wage: Sympal a CMS Based on Symfony 47
  • 48.
    Sympal - aCMS based on Symfony Edit model columns inline in addition to content slots Jonathan H. Wage: Sympal a CMS Based on Symfony 48
  • 49.
    Sympal - aCMS based on Symfony Plugin Manager Jonathan H. Wage: Sympal a CMS Based on Symfony 49
  • 50.
    Sympal - aCMS based on Symfony • Download, install and uninstall plugins • Works from the CLI or web browser • Sympal plugin manager tries to get a plugin through the symfony plugin:install task first then tries to find the plugin in SVN and check it out Jonathan H. Wage: Sympal a CMS Based on Symfony 50
  • 51.
    Sympal - aCMS based on Symfony From the command line Jonathan H. Wage: Sympal a CMS Based on Symfony 51
  • 52.
    Sympal - aCMS based on Symfony From the web browser Jonathan H. Wage: Sympal a CMS Based on Symfony 52
  • 53.
    Sympal - aCMS based on Symfony Jonathan H. Wage: Sympal a CMS Based on Symfony 53
  • 54.
    Sympal - aCMS based on Symfony Configuration Jonathan H. Wage: Sympal a CMS Based on Symfony 54
  • 55.
    Sympal - aCMS based on Symfony Controlled via YAML all: sympal_config: menu_class: sfSympalMenuSite yui_path: http://yui.yahooapis.com/2.7.0/build super_admin_signin_url: @sympal_dashboard enable_all_modules: true admin_module_web_dir: /sfSympalPlugin load_default_css: true Jonathan H. Wage: Sympal a CMS Based on Symfony 55
  • 56.
    Sympal - aCMS based on Symfony • Or YAML can be controlled via a web form • When configuration form is saved the YAML file is written Jonathan H. Wage: Sympal a CMS Based on Symfony 56
  • 57.
    Sympal - aCMS based on Symfony • Since the configuration uses the symfony app.yml it can be controlled at different levels of symfony – Project – Application – Module Jonathan H. Wage: Sympal a CMS Based on Symfony 57
  • 58.
    Sympal - aCMS based on Symfony • Other items related to content records can be configured at different levels. For example the layout can be controlled – Globally – Per site – Per content type – Per content record • This means you can customize the layout an individual content record uses. Jonathan H. Wage: Sympal a CMS Based on Symfony 58
  • 59.
    Sympal - aCMS based on Symfony Security Jonathan H. Wage: Sympal a CMS Based on Symfony 59
  • 60.
    Sympal - aCMS based on Symfony • sfSympalUserPlugin is forked version of sfDoctrineGuardPlugin – Users – Groups – Permissions – Forgot Password – Registration • Menus, content records, etc. can all be locked down with permissions. Jonathan H. Wage: Sympal a CMS Based on Symfony 60
  • 61.
    Sympal - aCMS based on Symfony List users Jonathan H. Wage: Sympal a CMS Based on Symfony 61
  • 62.
    Sympal - aCMS based on Symfony Edit users Jonathan H. Wage: Sympal a CMS Based on Symfony 62
  • 63.
    Sympal - aCMS based on Symfony List groups Jonathan H. Wage: Sympal a CMS Based on Symfony 63
  • 64.
    Sympal - aCMS based on Symfony Edit group Jonathan H. Wage: Sympal a CMS Based on Symfony 64
  • 65.
    Sympal - aCMS based on Symfony List permissions Jonathan H. Wage: Sympal a CMS Based on Symfony 65
  • 66.
    Sympal - aCMS based on Symfony Edit permission Jonathan H. Wage: Sympal a CMS Based on Symfony 66
  • 67.
    Sympal - aCMS based on Symfony Sympal Admin Generator Theme Jonathan H. Wage: Sympal a CMS Based on Symfony 67
  • 68.
    Sympal - aCMS based on Symfony • Sympal comes with custom admin generator them • Tabbed forms for fieldsets and embedded forms Jonathan H. Wage: Sympal a CMS Based on Symfony 68
  • 69.
    Sympal - aCMS based on Symfony Easily click Filters to popup the filters form Jonathan H. Wage: Sympal a CMS Based on Symfony 69
  • 70.
    Sympal - aCMS based on Symfony Floating Editor Panel Jonathan H. Wage: Sympal a CMS Based on Symfony 70
  • 71.
    Sympal - aCMS based on Symfony When logged in as editor and viewing a content record a floating editor panel is displayed Jonathan H. Wage: Sympal a CMS Based on Symfony 71
  • 72.
    Sympal - aCMS based on Symfony Content Slot Types Jonathan H. Wage: Sympal a CMS Based on Symfony 72
  • 73.
    Sympal - aCMS based on Symfony • A content slot in Sympal is an arbitrary piece of content and has a type. • Sympal comes bundled with a few content slot types Jonathan H. Wage: Sympal a CMS Based on Symfony 73
  • 74.
    Sympal - aCMS based on Symfony • The default slot types offered by Sympal are – Markdown – MultiLineText – RichText – Text • Add your own custom slot types for your projects Jonathan H. Wage: Sympal a CMS Based on Symfony 74
  • 75.
    Sympal - aCMS based on Symfony YUI Rich Text Editor Jonathan H. Wage: Sympal a CMS Based on Symfony 75
  • 76.
    Sympal - aCMS based on Symfony The RichText slot type uses the YUI rich text editor Jonathan H. Wage: Sympal a CMS Based on Symfony 76
  • 77.
    Sympal - aCMS based on Symfony The YUI rich text editor also implements the ability to upload and embed images inline Jonathan H. Wage: Sympal a CMS Based on Symfony 77
  • 78.
    Sympal - aCMS based on Symfony Sending E-Mails Jonathan H. Wage: Sympal a CMS Based on Symfony 78
  • 79.
    Sympal - aCMS based on Symfony • A reoccurring need • Re-implementing the functionality over and over wasting time • We need a standard way to send and manage our e-mail templates • Sympal offers a solution Jonathan H. Wage: Sympal a CMS Based on Symfony 79
  • 80.
    Sympal - aCMS based on Symfony In your actions you can easily create new e-mails and send them class my_moduleActions extends sfActions { public function executeSome_action(sfWebRequest $request) { $variables = array( 'name' => 'Jonathan H. Wage' ); $email = $this->newEmail('email_module/test', $variables); $email->send('jonwage@gmail.com'); } } Jonathan H. Wage: Sympal a CMS Based on Symfony 80
  • 81.
    Sympal - aCMS based on Symfony • The templates used for a Sympal e- mail are just a partial or component • In the previous example we use a partial named _test.php Hello <?php echo $name ?>, This is a test e-mail that we are sending to <?php echo $name ?> Jonathan H. Wage: Sympal a CMS Based on Symfony 81
  • 82.
    Sympal - aCMS based on Symfony • The first line of the template is the subject • The second line and after is the body of the e-mail • This way the contents of the e- mail(subject and body) are managed in one place Jonathan H. Wage: Sympal a CMS Based on Symfony 82
  • 83.
    Sympal - aCMS based on Symfony • The newEmail() method returns an instance of sfSympalMail • sfSympalMail is a wrapper around your mail sending program which defaults to Swift in Sympal Jonathan H. Wage: Sympal a CMS Based on Symfony 83
  • 84.
    Sympal - aCMS based on Symfony Multiple Sites Jonathan H. Wage: Sympal a CMS Based on Symfony 84
  • 85.
    Sympal - aCMS based on Symfony • Sympal can handle multiple sites • A sympal site is directly bound to a symfony application • This is how Sympal knows which site you are in and can limit the data to only that site Jonathan H. Wage: Sympal a CMS Based on Symfony 85
  • 86.
    Sympal - aCMS based on Symfony Jonathan H. Wage: Sympal a CMS Based on Symfony 86
  • 87.
    Sympal - aCMS based on Symfony Search Engine Optimization Jonathan H. Wage: Sympal a CMS Based on Symfony 87
  • 88.
    Sympal - aCMS based on Symfony • SEO capabilities are built in • You can specify global title, keywords and description for your project. • They can also be overridden by each site or even by individual content records Jonathan H. Wage: Sympal a CMS Based on Symfony 88
  • 89.
    Sympal - aCMS based on Symfony • sfSympalAutoSEOPlugin – Who is going to write it? :) – Automatically generate SEO for content records from the final rendered HTML • Parse the first <h1> tag value for the meta title • Build a list of top words used in the content record for the meta keywords • Parse the first <p> tag value for the meta description – Write good content and you’ll have SEO Jonathan H. Wage: Sympal a CMS Based on Symfony 89
  • 90.
    Sympal - aCMS based on Symfony Dashboard Jonathan H. Wage: Sympal a CMS Based on Symfony 90
  • 91.
    Sympal - aCMS based on Symfony When a user logs in and has some credentials he’ll be forwarded to his dashboard. A super administrator would see everything. Something like the below... Jonathan H. Wage: Sympal a CMS Based on Symfony 91
  • 92.
    Sympal - aCMS based on Symfony • Dashboard is generated using the sfSympalMenu classes • The menu instance used to generate the dashboard is passed through an event so you can easily add to it by connecting to an event Jonathan H. Wage: Sympal a CMS Based on Symfony 92
  • 93.
    Sympal - aCMS based on Symfony Connect to dashboard event and add to the menu object class sfSympalTestPluginConfiguration extends sfPluginConfiguration { public function initialize() { $this->dispatcher->connect('sympal.load_dashboard_boxes', array($this, 'loadDashboardBoxes') ); } public function loadDashboardBoxes(sfEvent $event) { $menu = $event['menu']; $menu->addChild('My New Box', '@route_name'); } } Jonathan H. Wage: Sympal a CMS Based on Symfony 93
  • 94.
    Sympal - aCMS based on Symfony Multiple Themes Jonathan H. Wage: Sympal a CMS Based on Symfony 94
  • 95.
    Sympal - aCMS based on Symfony • Sympal offers the ability to have themes and you can configure in multiple places what them to use – Globally – Per site – Per content type – Or per content record Jonathan H. Wage: Sympal a CMS Based on Symfony 95
  • 96.
    Sympal - aCMS based on Symfony • We can now easily have Sympal theme plugins that you can download and instantly have a new theme to change to • We already have three themes available that you can download and use – sfSympalPlugin - The default theme included with Sympal – sfSympalJwageThemePlugin - The theme used on my personal website, jwage.com – sfSympalDoctrineThemePlugin - The theme which powers the Doctrine website Jonathan H. Wage: Sympal a CMS Based on Symfony 96
  • 97.
    Sympal - aCMS based on Symfony Doctrine Theme Sympal Theme Jonathan H. Wage: Sympal a CMS Based on Symfony 97
  • 98.
    Sympal - aCMS based on Symfony Sympal CLI Tasks Jonathan H. Wage: Sympal a CMS Based on Symfony 98
  • 99.
    Sympal - aCMS based on Symfony Sympal comes with some other pretty useful tasks for improving your productivity when working in Symfony Jonathan H. Wage: Sympal a CMS Based on Symfony 99
  • 100.
    Sympal - aCMS based on Symfony • Most notable CLI tasks – sympal:delete-model - Delete a model from your project. Finds and deletes model, form and filter files all in one command – sympal:report-statistics - This task will report back to the Symfony Plugins API what all plugins you’re using in your project and will add them to your stack. – sympal:event-list - Report a list of events that are available for a URL in your application • See who has connected to an event Jonathan H. Wage: Sympal a CMS Based on Symfony 100
  • 101.
    Sympal - aCMS based on Symfony Show a list of all available events for a URL Jonathan H. Wage: Sympal a CMS Based on Symfony 101
  • 102.
    Sympal - aCMS based on Symfony Show only the events which have been connected to Jonathan H. Wage: Sympal a CMS Based on Symfony 102
  • 103.
    Sympal - aCMS based on Symfony Inspect an individual event to see who has connected to it and more importantly where! Jonathan H. Wage: Sympal a CMS Based on Symfony 103
  • 104.
    Sympal - aCMS based on Symfony More on Sympal Events Jonathan H. Wage: Sympal a CMS Based on Symfony 104
  • 105.
    Sympal - aCMS based on Symfony • Some might say I have overused the Symfony events system in Sympal • But, I really like it and I find it very useful in the CMS context. It allows for things to be very flexible and “changeable” by use of events. Jonathan H. Wage: Sympal a CMS Based on Symfony 105
  • 106.
    Sympal - aCMS based on Symfony • A re-occurring question – How can I add to a model of another plugin, or a model in my project from a plugin. – Before Sympal this was not possible but now if you models simply actAs sfSympalRecord or sfSympalContentType you can connect to an event which is notified during the setup of a Doctrine model Jonathan H. Wage: Sympal a CMS Based on Symfony 106
  • 107.
    Sympal - aCMS based on Symfony • Add a new column to the Sympal User model • The schema for the model looks like this User: tableName: users actAs: [Timestampable, sfSympalRecord] columns: first_name: string(255) last_name: string(255) # ... Jonathan H. Wage: Sympal a CMS Based on Symfony 107
  • 108.
    Sympal - aCMS based on Symfony • The actAs: [sfSympalRecord] allows us to connect to two events – sympal.user.set_table_definition – sympal.user.set_up • The set table definition allows us to add new columns, indexes, etc. • The set up allows us to add relationships, add behaviors, etc. Jonathan H. Wage: Sympal a CMS Based on Symfony 108
  • 109.
    Sympal - aCMS based on Symfony Now lets connect to the set table definition event and add a new column class sfSympalTestPluginConfiguration extends sfPluginConfiguration { public function initialize() { $this->dispatcher->connect('sympal.user.set_table_definition', array($this, 'setUserTableDefinition') ); } public function setUserTableDefinition(sfEvent $event) { $model = $event->getSubject(); $model->hasColumn('my_new_column', 'string', 255); } } Jonathan H. Wage: Sympal a CMS Based on Symfony 109
  • 110.
    Sympal - aCMS based on Symfony • We have a lot more events and I can’t talk about them all • But I will try and list some of the other notable events – sympal.user.pre_signin – sympal.user.post_signin – sympal.load_breadcrumbs – sympal.<model_name>.method_not_found – sympal.post_render_page_content – sympal.load_tools Jonathan H. Wage: Sympal a CMS Based on Symfony 110
  • 111.
    Sympal - aCMS based on Symfony With the Symfony events and the PHP __call() magic function we can fake “extending” a class by invoking a method_not_found event and letting users connect to it class sfSympalTestPluginConfiguration extends sfPluginConfiguration { public function initialize() { $this->dispatcher->connect('sympal.user.method_not_found', array(new myUserExtension(), 'extend') ); } } Jonathan H. Wage: Sympal a CMS Based on Symfony 111
  • 112.
    Sympal - aCMS based on Symfony Now lets define the myUserExtension class and add some new functionality class myUserExtension extends sfSympalExtendClass { public function getFullName() { return trim($this->getFirstName().' '.$this->getLastName()); } } Jonathan H. Wage: Sympal a CMS Based on Symfony 112
  • 113.
    Sympal - aCMS based on Symfony Now when I work with a User model instance I will be able to access my getFullName() method $user = new User(); $user->first_name = 'Jonathan'; $user->last_name = 'Wage'; echo $user->getFullName(); // Jonathan Wage Jonathan H. Wage: Sympal a CMS Based on Symfony 113
  • 114.
    Sympal - aCMS based on Symfony What is next? Jonathan H. Wage: Sympal a CMS Based on Symfony 114
  • 115.
    Sympal - aCMS based on Symfony • Continued development of Sympal • Work towards a 1.0 release • Spread the word and try and get as much feedback as possible Jonathan H. Wage: Sympal a CMS Based on Symfony 115
  • 116.
    Sympal - aCMS based on Symfony What do we need? Jonathan H. Wage: Sympal a CMS Based on Symfony 116
  • 117.
    Sympal - aCMS based on Symfony • Users, testers, feedback, etc. • Development help, documentation help • For development, we need the most help with the frontend Jonathan H. Wage: Sympal a CMS Based on Symfony 117
  • 118.
    Sympal - aCMS based on Symfony • Frontend development – YUI/JS/CSS guru – Usability guru • Backend development – Familiarity with Symfony and Doctrine obviously – Familiarity with other popular CMS in any other languages to help with functionality and implementation Jonathan H. Wage: Sympal a CMS Based on Symfony 118
  • 119.
    Sympal - aCMS based on Symfony Questions? Jonathan H. Wage jonathan.wage@sensio.com +1 415 992 5468 sensiolabs.com | doctrine-project.org | sympalphp.org | jwage.com You can contact Jonathan about Doctrine and Open-Source or for training, consulting, application development, or business related questions at jonathan.wage@sensio.com Jonathan H. Wage: Sympal a CMS Based on Symfony 119