CiviCon2013 Joomla Developerx

CiviCRM/Joomla
development/customization
Brian Shaughnessy
Lighthouse Consulting & Design
www.lcdservices.biz
why customize?
 not-for-profits…
o range widely in the services they provide
o range widely in the business processes they
implement
 impossible to have one-size-fits-all
 overkill to move everything to configuration
options
goals




code review/architecture
customization methods
best practices
examples
architecture
DB
DAO
PEAR
BAO
Smarty
Web
jQuery
User
directory structure






CRM: application
templates: Smarty .tpl files
packages: included libraries
extern: externally triggered files (IPN)
css
Joomla
directory structure: CRM
 component/feature area
o
o
o
o
o
DAO: data access objects
BAO: business access objects
Form
Page
[Controller/Selector/xml/StateMachine]
example
class/tpl correlation
 CRM/Event/Form/Registration/Register.php
 CRM_Event_Form_Registration_Register
 templates/CRM/
Event/Form/Registration/Register.tpl
standard form flow





::preProcess
::setDefaultValues
::buildQuickForm
::formRule
::postProcess
customization methods
 PHP overrides
 Smarty overrides
o file.extra.tpl addendum
 Joomla plugin
 CiviCRM extensions
o
o
o
o
reports
search
payment gateway
modules*
don’t hack core!
 just don’t do it…
unless you have no other choice…
debugging tips
 print variables
o CRM_Core_Error::debug(�varname’, $varObj);
[log to screen]
o CRM_Core_Error::debug_var(�varname’,$varObj);
[log to file]
o CRM_Core_Error::debug_log_message($msg,
TRUE/FALSE);
[log to screen or file]
o CRM_Core_Error::backtrace();
 tail log file
o /media/civicrm/ConfigAndLog/FILE.log
debugging tips
 enable debugging
 display smarty variables
o append: &smartyDebug=1
 search “.tpl” in page source to trace file
 log queries to file
o define( 'CIVICRM_DAO_DEBUG', 1 );
 log mail to file
o define('CIVICRM_MAIL_LOG', '/path/to/mail.log');
php/tpl overrides
 define location
o Administer > System Settings > Directories
 follow folder pattern for core files
 pros:
o complete control over code flow/layout without
hacking core
 cons:
o must be maintained through upgrades
 be sure to comment thoroughly!
php override example
 report templates are a common area where
clients want customizations.
 the template defines the fields, filters, sort
options, calculations, action options, and display
 most of those options are defined in a large array
during class construction
 current employer report:
o remove country
o add relationship end date
o add relationship enabled/disabled
smarty override example
 any page rendered by CiviCRM is pushed
through the Smarty templating engine
 the Smarty file contains the html and passed
variables to be rendered
 events and profiles may have ID-specific
subfolders
o CRM/Event/Form/Registration/1/Register.tpl
file.extra.tpl files
 instead of overriding Smarty files, you can
create a new file named filename.extra.tpl
 benefit: avoid modifying and maintaining the
entire .tpl file – only need to interact with the
elements you are modifying
 relies on js/jquery for most implementations
 limitations: template files included via
another template file is not captured by the
.extra insertion code
Joomla plugins
 use plugins to implement hooks (events)
 wiki.civicrm.org/confluence/display/CRMDOC
/Hook+Reference
 within your plugin class, implement:
o civicrm_hookName(…) { }
hooks






modify forms process
impact objects before/after saving
extension lifecycle
ACL
impact GUI (links, page, nav, etc.)
other…
plugin example
 CiviCRM has a user dashboard page that
summarizes the contact’s involvement with
your organization
 Let’s create a plugin to retrieve the contact’s
product purchases from RedShop and include
the list in the dashboard
api v3
 wiki.civicrm.org/confluence/display/CRMDOC
/API+Reference
 drupal.demo.civicrm.org/civicrm/ajax/doc/api
#explorer
 Bindings: PHP/AJAX/REST/Smarty
 Actions: Create/Delete/Get/GetCount/
GetSingle/GetFields/GetValue/Replace/
Update
 Chainable
api:php
 standard format to work with objects
$params = array(
'version'
=> 3,
'last_name'
=> 'Doe',
'contact_type' => 'Individual',
);
$contact = civicrm_api('contact', 'get', $params);
Array
(
[is_error] => 0
[version] => 3
[count] => 2
[values] => Array
(
[4] => Array
(
[contact_id] => 4
[contact_type] => Individual
[contact_sub_type] =>
[sort_name] => Doe, John
[display_name] => Mr. John Doe
[do_not_email] => 0
[do_not_phone] => 0
[do_not_mail] => 0
[do_not_sms] => 1
[do_not_trade] => 0
[is_opt_out] => 0
[legal_identifier] =>
[external_identifier] =>
[nick_name] => J.D.
[legal_name] =>
[image_URL] =>
[preferred_mail_format] => Both
[first_name] => John
[middle_name] => P.
[last_name] => Doe
[job_title] => Executive Director
api:php
civicrm extensions
 CMS-agnostic
 can be submitted to the CiviCRM extension
directory
 installed through:
Administer В» System Settings В»
Manage Extensions
 payment processors, custom search, custom
report, module*
extension
 create folder in custom extension directory:
domain.type.name
 create info.xml to define the extension
parameters
 refer to documentation for xml options and
naming conventions
 create php and tpl files
o php files reside in base directory
o tpl files reside in
 install/enable/run/test
extension
 wiki.civicrm.org/confluence/display/CRMDOC
/Extensions
 wiki.civicrm.org/confluence/display/CRMDOC
/Extension+Reference
 wiki.civicrm.org/confluence/display/CRMDOC
/Create+a+Module+Extension
 github.com/totten/civix/
 civicrm.org/extensions
sample civi module
 custom birthday search via module
 provide advanced tools to search contacts by
birthday, including searching by month, year
range, age range, day range
joomla extensions
 various states of development/version
compatibility
 http://wiki.civicrm.org/confluence/display/CR
MDOC/Joomla%21+Extensions+for+CiviCRM+
%283rd+party%29
 http://civicrm.org/extensions
 http://extensions.joomla.org/extensions/exte
nsion-specific/civicrm
 https://github.com/lcdservices
extensions








CiviSearch plugin
CiviCRM Group Sync component
CiviAuthenticate plugin
CiviEvent module
CiviUser component
CiviLinker plugin
Gloriant CiviCRM component
CiviLead
resources
 www.civicrm.org
 book.civicrm.org/
[user admin and developer guides]
 wiki.civicrm.org/confluence/display/CRMDOC
/CiviCRM+Documentation
[online documentation]
community





wiki: http://wiki.civicrm.org
forum: http://forum.civicrm.org/
IRC: #civicrm on irc.freenode.net
blogs: http://civicrm.org/blog/
bug: http://issues.civicrm.org