- Indentation: 2 spaces (all files)
- Comparisons: Always use strict equality (
===) - PHP: CamelCase classes, camelCase methods
- JS: Single quotes, semicolons required
CRM_Core_Transaction → /CRM/Core/Transaction.php
CRM_Contribute_BAO_Contribution → /CRM/Contribute/BAO/Contribution.php
- Table
civicrm_contribution_product→ XML:/xml/schema/**/ContributionProduct.xml - Search SQL files: Use
*.mysql(not*.sql)
develop- new features and PRsmaster- stable releasehotfix- urgent production fixes
| Context | Syntax | Parameter Format |
|---|---|---|
| PHP | ts('text', [...]) |
[1 => $val, 2 => $val] |
| Smarty | {ts 1=$var}text %1{/ts} |
1=$var 2=$var |
| Drupal | t('text', [...]) / $this->t(...) |
['!1' => $val] |
// PHP: use ts() with numbered placeholders
ts('Hello %1', [1 => $name]);
// Smarty: use {ts} block with parameters
{ts 1=$name}Hello %1{/ts}
{ts escape='js'}Text in JS context{/ts}
// Drupal: use t() with ! prefix placeholders
t('Hello !1', ['!1' => $name]);See agent docs for detailed patterns: php-engineer, frontend-engineer, drupal-module-developer
| Path | Purpose |
|---|---|
/CRM/ |
PHP core classes (BAO, DAO, Form) |
/api/v3/ |
API endpoints |
/templates/ |
Smarty templates (.tpl) |
/xml/schema/ |
Database schema definitions |
/neticrm/ |
netiCRM extensions |
/drupal/ |
civicrm drupal module base dir |
/js/, /css/, /packages/jquery |
Frontend assets |
/CRM/*/xml/Menu/*.xml |
Route definitions |
Routes in CRM/*/xml/Menu/*.xml: <path> (URL), <page_callback> (handler), <access_arguments> (permissions: ,=AND ;=OR)
Defined in CRM_Core_Permission::basicPermissions() and CRM/*/Info.php::getPermissions()
- Core:
access CiviCRM,administer CiviCRM,view/edit/delete contacts - Components:
access CiviContribute,access CiviEvent,access CiviMember, etc. - Check:
CRM_Core_Permission::check('permission string')
Use these agent when job needed
- drupal-module-developer - Drupal integration
- structure-planner - Architecture planning