Sympal is a content management system built on Symfony and Doctrine. It provides common CMS functionality through plugins while leveraging Symfony's flexibility. Key features include menus, breadcrumbs, content types, inline editing, and a plugin manager for installing additional functionality. Configuration is controlled through YAML files or a web interface.
Boost PC performance: How more available memory can improve productivity
Sympal A Cmf Based On Symfony
1. Sympal - a CMS based on Symfony
Sympal
Content Management System Based on Symfony
Jonathan H. Wage: Sympal a CMS Based on Symfony 1
2. 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
3. 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
4. Sympal - a CMS based on Symfony
The Idea
Jonathan H. Wage: Sympal a CMS Based on Symfony 4
5. 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
6. 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
7. 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
8. 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
9. 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
10. Sympal - a CMS based on Symfony
Highlights
Jonathan H. Wage: Sympal a CMS Based on Symfony 10
11. 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
12. 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
13. Sympal - a CMS based on Symfony
Installation
Jonathan H. Wage: Sympal a CMS Based on Symfony 13
14. 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
15. Sympal - a CMS based on Symfony
Install from your browser
Jonathan H. Wage: Sympal a CMS Based on Symfony 15
16. 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
17. 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
18. Sympal - a CMS based on Symfony
Menus
Jonathan H. Wage: Sympal a CMS Based on Symfony 18
19. 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
20. Sympal - a CMS based on Symfony
YUI tree view for managing menus
Jonathan H. Wage: Sympal a CMS Based on Symfony 20
21. Sympal - a CMS based on Symfony
Drag and drop ordering
Jonathan H. Wage: Sympal a CMS Based on Symfony 21
22. Sympal - a CMS based on Symfony
Right click a menu leaf to manage
Jonathan H. Wage: Sympal a CMS Based on Symfony 22
23. 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
24. 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
25. 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
26. 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
27. 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
28. 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
29. 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
30. 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
31. 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
32. Sympal - a CMS based on Symfony
Breadcrumbs
Jonathan H. Wage: Sympal a CMS Based on Symfony 32
33. 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
34. 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
35. Sympal - a CMS based on Symfony
Content Types
Jonathan H. Wage: Sympal a CMS Based on Symfony 35
36. 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
37. 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
38. 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
39. 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
40. 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
41. 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
42. 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
43. Sympal - a CMS based on Symfony
Click the sample article to view it
Jonathan H. Wage: Sympal a CMS Based on Symfony 43
44. 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
45. Sympal - a CMS based on Symfony
Inline Editing
Jonathan H. Wage: Sympal a CMS Based on Symfony 45
46. 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
47. 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
48. 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
49. Sympal - a CMS based on Symfony
Plugin Manager
Jonathan H. Wage: Sympal a CMS Based on Symfony 49
50. 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
51. Sympal - a CMS based on Symfony
From the command line
Jonathan H. Wage: Sympal a CMS Based on Symfony 51
52. Sympal - a CMS based on Symfony
From the web browser
Jonathan H. Wage: Sympal a CMS Based on Symfony 52
53. Sympal - a CMS based on Symfony
Jonathan H. Wage: Sympal a CMS Based on Symfony 53
54. Sympal - a CMS based on Symfony
Configuration
Jonathan H. Wage: Sympal a CMS Based on Symfony 54
55. 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
56. 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
57. 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
58. 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
59. Sympal - a CMS based on Symfony
Security
Jonathan H. Wage: Sympal a CMS Based on Symfony 59
60. 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
61. Sympal - a CMS based on Symfony
List users
Jonathan H. Wage: Sympal a CMS Based on Symfony 61
62. Sympal - a CMS based on Symfony
Edit users
Jonathan H. Wage: Sympal a CMS Based on Symfony 62
63. Sympal - a CMS based on Symfony
List groups
Jonathan H. Wage: Sympal a CMS Based on Symfony 63
64. Sympal - a CMS based on Symfony
Edit group
Jonathan H. Wage: Sympal a CMS Based on Symfony 64
65. Sympal - a CMS based on Symfony
List permissions
Jonathan H. Wage: Sympal a CMS Based on Symfony 65
66. Sympal - a CMS based on Symfony
Edit permission
Jonathan H. Wage: Sympal a CMS Based on Symfony 66
67. Sympal - a CMS based on Symfony
Sympal Admin Generator
Theme
Jonathan H. Wage: Sympal a CMS Based on Symfony 67
68. 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
69. Sympal - a CMS based on Symfony
Easily click Filters to popup the
filters form
Jonathan H. Wage: Sympal a CMS Based on Symfony 69
70. Sympal - a CMS based on Symfony
Floating Editor Panel
Jonathan H. Wage: Sympal a CMS Based on Symfony 70
71. 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
72. Sympal - a CMS based on Symfony
Content Slot Types
Jonathan H. Wage: Sympal a CMS Based on Symfony 72
73. 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
74. 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
75. Sympal - a CMS based on Symfony
YUI Rich Text Editor
Jonathan H. Wage: Sympal a CMS Based on Symfony 75
76. 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
77. 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
78. Sympal - a CMS based on Symfony
Sending E-Mails
Jonathan H. Wage: Sympal a CMS Based on Symfony 78
79. 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
80. 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
81. 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
82. 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
83. 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
84. Sympal - a CMS based on Symfony
Multiple Sites
Jonathan H. Wage: Sympal a CMS Based on Symfony 84
85. 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
86. Sympal - a CMS based on Symfony
Jonathan H. Wage: Sympal a CMS Based on Symfony 86
87. Sympal - a CMS based on Symfony
Search Engine Optimization
Jonathan H. Wage: Sympal a CMS Based on Symfony 87
88. 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
89. 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
90. Sympal - a CMS based on Symfony
Dashboard
Jonathan H. Wage: Sympal a CMS Based on Symfony 90
91. 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
92. 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
93. 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
94. Sympal - a CMS based on Symfony
Multiple Themes
Jonathan H. Wage: Sympal a CMS Based on Symfony 94
95. 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
96. 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
97. Sympal - a CMS based on Symfony
Doctrine Theme
Sympal Theme
Jonathan H. Wage: Sympal a CMS Based on Symfony 97
98. Sympal - a CMS based on Symfony
Sympal CLI Tasks
Jonathan H. Wage: Sympal a CMS Based on Symfony 98
99. 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
100. 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
101. 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
102. 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
103. 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
104. Sympal - a CMS based on Symfony
More on Sympal Events
Jonathan H. Wage: Sympal a CMS Based on Symfony 104
105. 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
106. 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
107. 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
108. 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
109. 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
110. 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
111. 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
112. 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
113. 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
114. Sympal - a CMS based on Symfony
What is next?
Jonathan H. Wage: Sympal a CMS Based on Symfony 114
115. 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
116. Sympal - a CMS based on Symfony
What do we need?
Jonathan H. Wage: Sympal a CMS Based on Symfony 116
117. 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
118. 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
119. 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