3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
29 * This interface defines methods that need to be implemented
30 * for a component to introduce itself to the system.
33 * @copyright CiviCRM LLC (c) 2004-2014
38 abstract class CRM_Core_Component_Info
{
41 * Name of the class (minus component namespace path)
42 * of the component invocation class'es name.
44 CONST COMPONENT_INVOKE_CLASS
= 'Invoke';
47 * Name of the class (minus component namespace path)
48 * of the component configuration class'es name.
50 CONST COMPONENT_CONFIG_CLASS
= 'Config';
53 * Name of the class (minus component namespace path)
54 * of the component BAO Query class'es name.
56 CONST COMPONENT_BAO_QUERY_CLASS
= 'BAO_Query';
59 * Name of the class (minus component namespace path)
60 * of the component user dashboard plugin.
62 CONST COMPONENT_USERDASHBOARD_CLASS
= 'Page_UserDashboard';
65 * Name of the class (minus component namespace path)
66 * of the component tab offered to contact record view.
68 CONST COMPONENT_TAB_CLASS
= 'Page_Tab';
71 * Name of the class (minus component namespace path)
72 * of the component tab offered to contact record view.
74 CONST COMPONENT_ADVSEARCHPANE_CLASS
= 'Form_Search_AdvancedSearchPane';
77 * Name of the directory (assumed in component directory)
78 * where xml resources used by this component live.
80 CONST COMPONENT_XML_RESOURCES
= 'xml';
83 * Name of the directory (assumed in xml resources path)
84 * containing component menu definition XML file names.
86 CONST COMPONENT_MENU_XML
= 'Menu';
89 * Stores component information.
90 * @var array component settings as key/value pairs
95 * Stores component keyword
96 * @var string name of component keyword
101 * Class constructor, sets name and namespace (those are stored
102 * in the component registry (database) and no need to duplicate
103 * them here, as well as populates the info variable.
105 * @param string $name name of the component
106 * @param string $namespace namespace prefix for component's files
110 public function __construct($name, $namespace, $componentID) {
112 $this->namespace = $namespace;
113 $this->componentID
= $componentID;
114 $this->info
= $this->getInfo();
115 $this->info
['url'] = $this->getKeyword();
119 * Provides base information about the component.
120 * Needs to be implemented in component's information
123 * @return array collection of required component settings
127 abstract public function getInfo();
130 * Get a list of entities to register via API
132 * @return array list of entities; same format as CRM_Utils_Hook::managedEntities(&$entities)
133 * @see CRM_Utils_Hook::managedEntities
135 public function getManagedEntities() {
140 * Provides permissions that are unwise for Anonymous Roles to have
142 * @return array list of permissions
143 * @see CRM_Component_Info::getPermissions
145 public function getAnonymousPermissionWarnings() {
150 * Provides permissions that are used by component.
151 * Needs to be implemented in component's information
154 * NOTE: if using conditionally permission return,
155 * implementation of $getAllUnconditionally is required.
157 * @param bool $getAllUnconditionally
159 * @return array|null collection of permissions, null if none
162 abstract public function getPermissions($getAllUnconditionally = FALSE);
165 * Provides information about user dashboard element
166 * offered by this component.
168 * @return array|null collection of required dashboard settings,
169 * null if no element offered
173 abstract public function getUserDashboardElement();
176 * Provides information about user dashboard element
177 * offered by this component.
179 * @return array|null collection of required dashboard settings,
180 * null if no element offered
184 abstract public function registerTab();
187 * Provides information about advanced search pane
188 * offered by this component.
190 * @return array|null collection of required pane settings,
191 * null if no element offered
195 abstract public function registerAdvancedSearchPane();
198 * Provides potential activity types that this
199 * component might want to register in activity history.
200 * Needs to be implemented in component's information
203 * @return array|null collection of activity types
207 abstract public function getActivityTypes();
210 * Provides information whether given component is currently
211 * marked as enabled in configuration.
213 * @return boolean true if component is enabled, false if not
217 public function isEnabled() {
218 $config = CRM_Core_Config
::singleton();
219 if (in_array($this->info
['name'], $config->enableComponents
)) {
226 * Provides component's configuration object.
228 * @return mixed component's configuration object
232 public function getConfigObject() {
233 return $this->_instantiate(self
::COMPONENT_CONFIG_CLASS
);
237 * Provides component's menu definition object.
239 * @return mixed component's menu definition object
243 public function getMenuObject() {
244 return $this->_instantiate(self
::COMPONENT_MENU_CLASS
);
248 * Provides component's invocation object.
250 * @return mixed component's invocation object
254 public function getInvokeObject() {
255 return $this->_instantiate(self
::COMPONENT_INVOKE_CLASS
);
259 * Provides component's BAO Query object.
261 * @return mixed component's BAO Query object
265 public function getBAOQueryObject() {
266 return $this->_instantiate(self
::COMPONENT_BAO_QUERY_CLASS
);
270 * Builds advanced search form's component specific pane.
275 public function buildAdvancedSearchPaneForm(&$form) {
276 $bao = $this->getBAOQueryObject();
277 $bao->buildSearchForm($form);
281 * Provides component's user dashboard page object.
283 * @return mixed component's User Dashboard applet object
287 public function getUserDashboardObject() {
288 return $this->_instantiate(self
::COMPONENT_USERDASHBOARD_CLASS
);
292 * Provides component's contact record tab object.
294 * @return mixed component's contact record tab object
298 public function getTabObject() {
299 return $this->_instantiate(self
::COMPONENT_TAB_CLASS
);
303 * Provides component's advanced search pane's template path.
305 * @return string component's advanced search pane's template path
309 public function getAdvancedSearchPaneTemplatePath() {
310 $fullpath = $this->namespace . '_' . self
::COMPONENT_ADVSEARCHPANE_CLASS
;
311 return str_replace('_', DIRECTORY_SEPARATOR
, $fullpath . '.tpl');
315 * Provides information whether given component uses system wide search.
317 * @return boolean true if component needs search integration
321 public function usesSearch() {
322 return $this->info
['search'] ?
TRUE : FALSE;
326 * Provides the xml menu files
328 * @return array array of menu files
332 public function menuFiles() {
333 return CRM_Utils_File
::getFilesByExtension($this->_getMenuXMLPath(), 'xml');
337 * Simple "keyword" getter.
338 * FIXME: It should be protected so the keyword is not
339 * FIXME: accessed from beyond component infrastructure.
341 * @return string component keyword
345 public function getKeyword() {
346 return $this->keyword
;
350 * Helper for figuring out menu XML file location.
352 * @return mixed component's element as class instance
356 private function _getMenuXMLPath() {
357 global $civicrm_root;
358 $fullpath = $this->namespace . '_' . self
::COMPONENT_XML_RESOURCES
. '_' . self
::COMPONENT_MENU_XML
;
359 return CRM_Utils_File
::addTrailingSlash($civicrm_root . DIRECTORY_SEPARATOR
. str_replace('_', DIRECTORY_SEPARATOR
, $fullpath));
363 * Helper for instantiating component's elements.
367 * @return mixed component's element as class instance
370 private function _instantiate($cl) {
371 $className = $this->namespace . '_' . $cl;
372 require_once (str_replace('_', DIRECTORY_SEPARATOR
, $className) . '.php');
373 return new $className();