3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.3 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2013
37 * defines a simple implemenation of a drupal block.
38 * blocks definitions and html are in a smarty template file
41 class CRM_Core_Block
{
44 * the following blocks are supported
58 * template file names for the above blocks
60 static $_properties = NULL;
66 function __construct() {}
69 * initialises the $_properties array
73 static function initProperties() {
74 if (!defined('BLOCK_CACHE_GLOBAL')) {
75 define('BLOCK_CACHE_GLOBAL', 0x0008);
78 if (!defined('BLOCK_CACHE_PER_PAGE')) {
79 define('BLOCK_CACHE_PER_PAGE', 0x0004);
82 if (!defined('BLOCK_NO_CACHE')) {
83 define('BLOCK_NO_CACHE', -1);
86 if (!(self
::$_properties)) {
87 $config = CRM_Core_Config
::singleton();
88 self
::$_properties = array(
89 // set status item to 0 to disable block by default (at install)
90 self
::CREATE_NEW
=> array(
91 'template' => 'CreateNew.tpl',
92 'info' => ts('CiviCRM Create New Record'),
95 'cache' => BLOCK_CACHE_GLOBAL
,
99 'pages' => "civicrm\ncivicrm/*",
100 'region' => $config->userSystem
->getDefaultBlockLocation(),
102 self
::RECENTLY_VIEWED
=> array(
103 'template' => 'RecentlyViewed.tpl',
104 'info' => ts('CiviCRM Recent Items'),
105 'subject' => ts('Recent Items'),
107 'cache' => BLOCK_NO_CACHE
,
111 'pages' => "civicrm\ncivicrm/*",
112 'region' => $config->userSystem
->getDefaultBlockLocation(),
114 self
::DASHBOARD
=> array(
115 'template' => 'Dashboard.tpl',
116 'info' => ts('CiviCRM Contact Dashboard'),
119 'cache' => BLOCK_NO_CACHE
,
123 'pages' => "civicrm\ncivicrm/*",
124 'region' => $config->userSystem
->getDefaultBlockLocation(),
127 'template' => 'Add.tpl',
128 'info' => ts('CiviCRM Quick Add'),
129 'subject' => ts('New Individual'),
131 'cache' => BLOCK_NO_CACHE
,
135 'pages' => "civicrm\ncivicrm/*",
136 'region' => $config->userSystem
->getDefaultBlockLocation(),
138 self
::LANGSWITCH
=> array(
139 'template' => 'LangSwitch.tpl',
140 'info' => ts('CiviCRM Language Switcher'),
142 'templateValues' => array(),
144 'cache' => BLOCK_NO_CACHE
,
148 'pages' => "civicrm\ncivicrm/*",
149 'region' => $config->userSystem
->getDefaultBlockLocation(),
151 self
::EVENT
=> array(
152 'template' => 'Event.tpl',
153 'info' => ts('CiviCRM Upcoming Events'),
154 'subject' => ts('Upcoming Events'),
155 'templateValues' => array(),
157 'cache' => BLOCK_NO_CACHE
,
161 'pages' => "civicrm\ncivicrm/*",
162 'region' => $config->userSystem
->getDefaultBlockLocation(),
164 self
::FULLTEXT_SEARCH
=> array(
165 'template' => 'FullTextSearch.tpl',
166 'info' => ts('CiviCRM Full-text Search'),
167 'subject' => ts('Full-text Search'),
169 'cache' => BLOCK_NO_CACHE
,
173 'pages' => "civicrm\ncivicrm/*",
174 'region' => $config->userSystem
->getDefaultBlockLocation(),
178 ksort(self
::$_properties);
183 * returns the desired property from the $_properties array
185 * @params int $id one of the class constants (ADD, SEARCH, etc.)
186 * @params string $property the desired property
188 * @return string the value of the desired property
190 static function getProperty($id, $property) {
191 if (!(self
::$_properties)) {
192 self
::initProperties();
194 return isset(self
::$_properties[$id][$property]) ? self
::$_properties[$id][$property] : NULL;
198 * sets the desired property in the $_properties array
200 * @params int $id one of the class constants (ADD, SEARCH, etc.)
201 * @params string $property the desired property
202 * @params string $value the value of the desired property
206 static function setProperty($id, $property, $value) {
207 if (!(self
::$_properties)) {
208 self
::initProperties();
210 self
::$_properties[$id][$property] = $value;
214 * returns the whole $_properties array
216 * @return array the $_properties array
218 static function properties() {
219 if (!(self
::$_properties)) {
220 self
::initProperties();
222 return self
::$_properties;
226 * Creates the info block for drupal
231 static function getInfo() {
234 foreach (self
::properties() as $id => $value) {
235 if ($value['active']) {
236 if (in_array($id, array(
237 self
::ADD
, self
::CREATE_NEW
))) {
239 if (!CRM_Core_Permission
::check('add contacts') &&
240 !CRM_Core_Permission
::check('edit groups')
244 //validate across edit/view - CRM-5666
245 if ($hasAccess && ($id == self
::ADD
)) {
246 $hasAccess = CRM_Core_Permission
::giveMeAllACLs();
253 if ($id == self
::EVENT
&&
254 (!CRM_Core_Permission
::access('CiviEvent', FALSE) ||
255 !CRM_Core_Permission
::check('view event info')
262 'info' => $value['info'],
263 'cache' => $value['cache'],
264 'status' => $value['active'],
265 'region' => $value['region'],
266 'visibility' => $value['visibility'],
267 'pages' => $value['pages'],
268 'status' => $value['status'],
269 'weight' => $value['weight'],
278 * set the post action values for the block.
280 * php is lame and u cannot call functions from static initializers
286 private static function setTemplateValues($id) {
288 case self
::CREATE_NEW
:
289 self
::setTemplateShortcutValues();
292 case self
::DASHBOARD
:
293 self
::setTemplateDashboardValues();
297 $defaultLocation = CRM_Core_BAO_LocationType
::getDefault();
298 $defaultPrimaryLocationId = $defaultLocation->id
;
299 $values = array('postURL' => CRM_Utils_System
::url('civicrm/contact/add', 'reset=1&ct=Individual'),
300 'primaryLocationType' => $defaultPrimaryLocationId,
303 foreach (CRM_Contact_BAO_Contact
::$_greetingTypes as $greeting) {
304 $values[$greeting . '_id'] = CRM_Contact_BAO_Contact_Utils
::defaultGreeting('Individual', $greeting);
307 self
::setProperty(self
::ADD
,
313 case self
::FULLTEXT_SEARCH
:
315 'fullTextSearchID' => CRM_Core_DAO
::getFieldValue('CRM_Core_DAO_OptionValue',
316 'CRM_Contact_Form_Search_Custom_FullText', 'value', 'name'
318 self
::setProperty(self
::FULLTEXT_SEARCH
, 'templateValues', $urlArray);
321 case self
::RECENTLY_VIEWED
:
322 $recent = CRM_Utils_Recent
::get();
323 self
::setProperty(self
::RECENTLY_VIEWED
, 'templateValues', array('recentlyViewed' => $recent));
327 self
::setTemplateEventValues();
333 * create the list of options to create New objects for the application and format is as a block
338 private static function setTemplateShortcutValues() {
339 $config = CRM_Core_Config
::singleton();
341 static $shortCuts = array();
344 if (CRM_Core_Permission
::check('add contacts')) {
345 if (CRM_Core_Permission
::giveMeAllACLs()) {
346 $shortCuts = CRM_Contact_BAO_ContactType
::getCreateNewList();
350 // new activity (select target contact)
351 $shortCuts = array_merge($shortCuts, array(
353 'path' => 'civicrm/activity',
354 'query' => 'action=add&reset=1&context=standalone',
355 'ref' => 'new-activity',
356 'title' => ts('Activity'),
359 $components = CRM_Core_Component
::getEnabledComponents();
361 if (!empty($config->enableComponents
)) {
362 // check if we can process credit card contribs
363 $newCredit = CRM_Core_Payment
::allowBackofficeCreditCard();
365 foreach ($components as $componentName => $obj) {
366 if (in_array($componentName, $config->enableComponents
)) {
367 $obj->creatNewShortcut($shortCuts, $newCredit);
372 // new email (select recipients)
373 $shortCuts = array_merge($shortCuts, array(
374 array('path' => 'civicrm/activity/email/add',
375 'query' => 'atype=3&action=add&reset=1&context=standalone',
376 'ref' => 'new-email',
377 'title' => ts('Email'),
380 if (CRM_Core_Permission
::check('edit groups')) {
381 $shortCuts = array_merge($shortCuts, array(
382 array('path' => 'civicrm/group/add',
383 'query' => 'reset=1',
384 'ref' => 'new-group',
385 'title' => ts('Group'),
389 if (CRM_Core_Permission
::check('administer CiviCRM')) {
390 $shortCuts = array_merge($shortCuts, array(
391 array('path' => 'civicrm/admin/tag',
392 'query' => 'reset=1&action=add',
394 'title' => ts('Tag'),
398 if (empty($shortCuts)) {
404 foreach ($shortCuts as $short) {
406 if (isset($short['url'])) {
407 $value['url'] = $short['url'];
410 $value['url'] = CRM_Utils_System
::url($short['path'], $short['query'], FALSE);
412 $value['title'] = $short['title'];
413 $value['ref'] = $short['ref'];
417 // call links hook to add user defined links
418 CRM_Utils_Hook
::links('create.new.shorcuts',
420 CRM_Core_DAO
::$_nullObject,
422 CRM_Core_DAO
::$_nullObject
425 self
::setProperty(self
::CREATE_NEW
, 'templateValues', array('shortCuts' => $values));
429 * create the list of dashboard links
434 private static function setTemplateDashboardValues() {
435 static $dashboardLinks = array();
436 if (CRM_Core_Permission
::check('access Contact Dashboard')) {
437 $dashboardLinks = array(
438 array('path' => 'civicrm/user',
439 'query' => 'reset=1',
440 'title' => ts('My Contact Dashboard'),
444 if (empty($dashboardLinks)) {
449 foreach ($dashboardLinks as $dash) {
451 if (isset($dash['url'])) {
452 $value['url'] = $dash['url'];
455 $value['url'] = CRM_Utils_System
::url($dash['path'], $dash['query'], FALSE);
457 $value['title'] = $dash['title'];
458 $value['key'] = CRM_Utils_Array
::value('key', $dash);
461 self
::setProperty(self
::DASHBOARD
, 'templateValues', array('dashboardLinks' => $values));
465 * create the list of mail urls for the application and format is as a block
470 private static function setTemplateMailValues() {
471 static $shortCuts = NULL;
475 array('path' => 'civicrm/mailing/send',
476 'query' => 'reset=1',
477 'title' => ts('Send Mailing'),
480 'path' => 'civicrm/mailing/browse',
481 'query' => 'reset=1',
482 'title' => ts('Browse Sent Mailings'),
488 foreach ($shortCuts as $short) {
490 $value['url'] = CRM_Utils_System
::url($short['path'], $short['query']);
491 $value['title'] = $short['title'];
494 self
::setProperty(self
::MAIL
, 'templateValues', array('shortCuts' => $values));
498 * create the list of shortcuts for the application and format is as a block
503 private static function setTemplateMenuValues() {
504 $config = CRM_Core_Config
::singleton();
506 $path = 'navigation';
507 $values = CRM_Core_Menu
::getNavigation();
509 self
::setProperty(self
::MENU
, 'templateValues', array('menu' => $values));
514 * create the event blocks for upcoming events
519 private static function setTemplateEventValues() {
520 $config = CRM_Core_Config
::singleton();
522 $info = CRM_Event_BAO_Event
::getCompleteInfo(date("Ymd"));
525 $session = CRM_Core_Session
::singleton();
526 // check if registration link should be displayed
527 foreach ($info as $id => $event) {
528 $info[$id]['onlineRegistration'] = CRM_Event_BAO_Event
::validRegistrationRequest($event,
529 $session->get('userID')
533 self
::setProperty(self
::EVENT
, 'templateValues', array('eventBlock' => $info));
538 * Given an id creates a subject/content array
540 * @param int $id id of the block
545 static function getContent($id) {
546 // return if upgrade mode
547 $config = CRM_Core_Config
::singleton();
548 if ($config->isUpgradeMode()) {
552 if (!self
::getProperty($id, 'active')) {
556 if ($id == self
::EVENT
&&
557 CRM_Core_Permission
::check('view event info')
559 // is CiviEvent enabled?
560 if (!CRM_Core_Permission
::access('CiviEvent', FALSE)) {
565 elseif (!CRM_Core_Permission
::check('access CiviCRM')) {
568 elseif ($id == self
::ADD
) {
570 if (!CRM_Core_Permission
::check('add contacts') &&
571 !CRM_Core_Permission
::check('edit groups')
575 //validate across edit/view - CRM-5666
577 $hasAccess = CRM_Core_Permission
::giveMeAllACLs();
584 self
::setTemplateValues($id);
586 // Suppress Recent Items block if it's empty - CRM-5188
587 if ($id == self
::RECENTLY_VIEWED
) {
588 $recent = self
::getProperty($id, 'templateValues');
589 if (CRM_Utils_Array
::crmIsEmptyArray($recent)) {
594 // Suppress Language switcher if language is inherited from CMS - CRM-9971
595 $config = CRM_Core_Config
::singleton();
596 if ($id == self
::LANGSWITCH
&& property_exists($config, "inheritLocale") && $config->inheritLocale
) {
601 $block['name'] = 'block-civicrm';
602 $block['id'] = $block['name'] . '_' . $id;
603 $block['subject'] = self
::fetch($id, 'Subject.tpl',
604 array('subject' => self
::getProperty($id, 'subject'))
606 $block['content'] = self
::fetch($id, self
::getProperty($id, 'template'),
607 self
::getProperty($id, 'templateValues')
615 * Given an id and a template, fetch the contents
617 * @param int $id id of the block
618 * @param string $fileName name of the template file
619 * @param array $properties template variables
624 static function fetch($id, $fileName, $properties) {
625 $template = CRM_Core_Smarty
::singleton();
628 $template->assign($properties);
631 return $template->fetch('CRM/Block/' . $fileName);