bulk comment fix
[civicrm-core.git] / CRM / Admin / Page / AJAX.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
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. |
13 | |
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. |
18 | |
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 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2014
32 * $Id$
33 *
34 */
35
36 /**
37 * This class contains all the function that are called using AJAX
38 */
39 class CRM_Admin_Page_AJAX {
40
41 /**
42 * CRM-12337 Output navigation menu as executable javascript
43 * @see smarty_function_crmNavigationMenu
44 */
45 static function getNavigationMenu() {
46 $session = CRM_Core_Session::singleton();
47 $contactID = $session->get('userID');
48 if ($contactID) {
49 // Set headers to encourage browsers to cache for a long time
50 // If we want to refresh the menu we will send a different url
51 $year = 60*60*24*364;
52 header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + $year));
53 header('Content-Type: application/javascript');
54 header("Cache-Control: max-age=$year, public");
55
56 // Render template as a javascript file
57 $smarty = CRM_Core_Smarty::singleton();
58 $navigation = CRM_Core_BAO_Navigation::createNavigation($contactID);
59 $smarty->assign('timeGenerated', date('d M Y H:i:s'));
60 $smarty->assign('navigation', $navigation);
61 print $smarty->fetch('CRM/common/Navigation.tpl');
62 }
63 CRM_Utils_System::civiExit();
64 }
65
66 /**
67 * Return menu tree as json data for editing
68 */
69 static function getNavigationList() {
70 echo CRM_Core_BAO_Navigation::buildNavigation(TRUE, FALSE);
71 CRM_Utils_System::civiExit();
72 }
73
74 /**
75 * Function to process drag/move action for menu tree
76 */
77 static function menuTree() {
78 CRM_Core_BAO_Navigation::processNavigation($_GET);
79 }
80
81 /**
82 * Function to build status message while
83 * enabling/ disabling various objects
84 */
85 static function getStatusMsg() {
86 require_once('api/v3/utils.php');
87 $recordID = CRM_Utils_Type::escape($_GET['id'], 'Integer');
88 $entity = CRM_Utils_Type::escape($_GET['entity'], 'String');
89 $ret = array();
90
91 if ($recordID && $entity && $recordBAO = _civicrm_api3_get_BAO($entity)) {
92 switch ($recordBAO) {
93 case 'CRM_Core_BAO_UFGroup':
94 $method = 'getUFJoinRecord';
95 $result = array($recordBAO, $method);
96 $ufJoin = call_user_func_array(($result), array($recordID, TRUE));
97 if (!empty($ufJoin)) {
98 $ret['content'] = ts('This profile is currently used for %1.', array(1 => implode(', ', $ufJoin))) . ' <br/><br/>' . ts('If you disable the profile - it will be removed from these forms and/or modules. Do you want to continue?');
99 }
100 else {
101 $ret['content'] = ts('Are you sure you want to disable this profile?');
102 }
103 break;
104
105 case 'CRM_Price_BAO_PriceSet':
106 $usedBy = CRM_Price_BAO_PriceSet::getUsedBy($recordID);
107 $priceSet = CRM_Price_BAO_PriceSet::getTitle($recordID);
108
109 if (!CRM_Utils_System::isNull($usedBy)) {
110 $template = CRM_Core_Smarty::singleton();
111 $template->assign('usedBy', $usedBy);
112 $comps = array(
113 'Event' => 'civicrm_event',
114 'Contribution' => 'civicrm_contribution_page',
115 'EventTemplate' => 'civicrm_event_template'
116 );
117 $contexts = array();
118 foreach ($comps as $name => $table) {
119 if (array_key_exists($table, $usedBy)) {
120 $contexts[] = $name;
121 }
122 }
123 $template->assign('contexts', $contexts);
124
125 $ret['illegal'] = TRUE;
126 $table = $template->fetch('CRM/Price/Page/table.tpl');
127 $ret['content'] = ts('Unable to disable the \'%1\' price set - it is currently in use by one or more active events, contribution pages or contributions.', array(
128 1 => $priceSet)) . "<br/> $table";
129 }
130 else {
131 $ret['content'] = ts('Are you sure you want to disable \'%1\' Price Set?', array(1 => $priceSet));
132 }
133 break;
134
135 case 'CRM_Event_BAO_Event':
136 $ret['content'] = ts('Are you sure you want to disable this Event?');
137 break;
138
139 case 'CRM_Core_BAO_UFField':
140 $ret['content'] = ts('Are you sure you want to disable this CiviCRM Profile field?');
141 break;
142
143 case 'CRM_Contribute_BAO_ManagePremiums':
144 $ret['content'] = ts('Are you sure you want to disable this premium? This action will remove the premium from any contribution pages that currently offer it. However it will not delete the premium record - so you can re-enable it and add it back to your contribution page(s) at a later time.');
145 break;
146
147 case 'CRM_Contact_BAO_RelationshipType':
148 $ret['content'] = ts('Are you sure you want to disable this relationship type?') . '<br/><br/>' . ts('Users will no longer be able to select this value when adding or editing relationships between contacts.');
149 break;
150
151 case 'CRM_Financial_BAO_FinancialType':
152 $ret['content'] = ts('Are you sure you want to disable this financial type?');
153 break;
154
155 case 'CRM_Financial_BAO_FinancialAccount':
156 if (!CRM_Financial_BAO_FinancialAccount::getARAccounts($recordID)) {
157 $ret['illegal'] = TRUE;
158 $ret['content'] = ts('The selected financial account cannot be disabled because at least one Accounts Receivable type account is required (to ensure that accounting transactions are in balance).');
159 }
160 else {
161 $ret['content'] = ts('Are you sure you want to disable this financial account?');
162 }
163 break;
164
165 case 'CRM_Financial_BAO_PaymentProcessor':
166 $ret['content'] = ts('Are you sure you want to disable this payment processor?') . ' <br/><br/>' . ts('Users will no longer be able to select this value when adding or editing transaction pages.');
167 break;
168
169 case 'CRM_Financial_BAO_PaymentProcessorType':
170 $ret['content'] = ts('Are you sure you want to disable this payment processor type?');
171 break;
172
173 case 'CRM_Core_BAO_LocationType':
174 $ret['content'] = ts('Are you sure you want to disable this location type?') . ' <br/><br/>' . ts('Users will no longer be able to select this value when adding or editing contact locations.');
175 break;
176
177 case 'CRM_Event_BAO_ParticipantStatusType':
178 $ret['content'] = ts('Are you sure you want to disable this Participant Status?') . '<br/><br/> ' . ts('Users will no longer be able to select this value when adding or editing Participant Status.');
179 break;
180
181 case 'CRM_Mailing_BAO_Component':
182 $ret['content'] = ts('Are you sure you want to disable this component?');
183 break;
184
185 case 'CRM_Core_BAO_CustomField':
186 $ret['content'] = ts('Are you sure you want to disable this custom data field?');
187 break;
188
189 case 'CRM_Core_BAO_CustomGroup':
190 $ret['content'] = ts('Are you sure you want to disable this custom data group? Any profile fields that are linked to custom fields of this group will be disabled.');
191 break;
192
193 case 'CRM_Core_BAO_MessageTemplate':
194 $ret['content'] = ts('Are you sure you want to disable this message tempate?');
195 break;
196
197 case 'CRM_ACL_BAO_ACL':
198 $ret['content'] = ts('Are you sure you want to disable this ACL?');
199 break;
200
201 case 'CRM_ACL_BAO_EntityRole':
202 $ret['content'] = ts('Are you sure you want to disable this ACL Role Assignment?');
203 break;
204
205 case 'CRM_Member_BAO_MembershipType':
206 $ret['content'] = ts('Are you sure you want to disable this membership type?');
207 break;
208
209 case 'CRM_Member_BAO_MembershipStatus':
210 $ret['content'] = ts('Are you sure you want to disable this membership status rule?');
211 break;
212
213 case 'CRM_Price_BAO_PriceField':
214 $ret['content'] = ts('Are you sure you want to disable this price field?');
215 break;
216
217 case 'CRM_Contact_BAO_Group':
218 $ret['content'] = ts('Are you sure you want to disable this Group?');
219 break;
220
221 case 'CRM_Core_BAO_OptionGroup':
222 $ret['content'] = ts('Are you sure you want to disable this Option?');
223 break;
224
225 case 'CRM_Contact_BAO_ContactType':
226 $ret['content'] = ts('Are you sure you want to disable this Contact Type?');
227 break;
228
229 case 'CRM_Core_BAO_OptionValue':
230 $label = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionValue', $recordID, 'label');
231 $ret['content'] = ts('Are you sure you want to disable the \'%1\' option ?', array(1 => $label));
232 $ret['content'] .= '<br /><br />' . ts('WARNING - Disabling an option which has been assigned to existing records will result in that option being cleared when the record is edited.');
233 break;
234
235 case 'CRM_Contribute_BAO_ContributionRecur':
236 $recurDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recordID);
237 $ret['content'] = ts('Are you sure you want to mark this recurring contribution as cancelled?');
238 $ret['content'] .= '<br /><br /><strong>' . ts('WARNING - This action sets the CiviCRM recurring contribution status to Cancelled, but does NOT send a cancellation request to the payment processor. You will need to ensure that this recurring payment (subscription) is cancelled by the payment processor.') . '</strong>';
239 if ($recurDetails->membership_id) {
240 $ret['content'] .= '<br /><br /><strong>' . ts('This recurring contribution is linked to an auto-renew membership. If you cancel it, the associated membership will no longer renew automatically. However, the current membership status will not be affected.') . '</strong>';
241 }
242 break;
243
244 default:
245 $ret['content'] = ts('Are you sure you want to disable this record?');
246 break;
247 }
248 }
249 else {
250 $ret = array('status' => 'error', 'content' => 'Error: Unknown entity type.', 'illegal' => TRUE);
251 }
252 CRM_Core_Page_AJAX::returnJsonResponse($ret);
253 }
254
255 static function mergeTagList() {
256 $name = CRM_Utils_Type::escape($_GET['term'], 'String');
257 $fromId = CRM_Utils_Type::escape($_GET['fromId'], 'Integer');
258 $limit = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'search_autocomplete_count', NULL, 10);
259
260 // build used-for clause to be used in main query
261 $usedForTagA = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Tag', $fromId, 'used_for');
262 $usedForClause = array();
263 if ($usedForTagA) {
264 $usedForTagA = explode(",", $usedForTagA);
265 foreach ($usedForTagA as $key => $value) {
266 $usedForClause[] = "t1.used_for LIKE '%{$value}%'";
267 }
268 }
269 $usedForClause = !empty($usedForClause) ? implode(' OR ', $usedForClause) : '1';
270 sort($usedForTagA);
271
272 // query to list mergable tags
273 $query = "
274 SELECT t1.name, t1.id, t1.used_for, t2.name as parent
275 FROM civicrm_tag t1
276 LEFT JOIN civicrm_tag t2 ON t1.parent_id = t2.id
277 WHERE t1.id <> {$fromId} AND
278 t1.name LIKE '%{$name}%' AND
279 ({$usedForClause})
280 LIMIT $limit";
281 $dao = CRM_Core_DAO::executeQuery($query);
282 $result = array();
283
284 while ($dao->fetch()) {
285 $row = array(
286 'id' => $dao->id,
287 'text' => ($dao->parent ? "{$dao->parent} :: " : '') . $dao->name,
288 );
289 // Add warning about used_for types
290 if (!empty($dao->used_for)) {
291 $usedForTagB = explode(',', $dao->used_for);
292 sort($usedForTagB);
293 $usedForDiff = array_diff($usedForTagA, $usedForTagB);
294 if (!empty($usedForDiff)) {
295 $row['warning'] = TRUE;
296 }
297 }
298 $result[] = $row;
299 }
300 print json_encode($result);
301 CRM_Utils_System::civiExit();
302 }
303
304 function mappingList() {
305 $params = array('mappingID');
306 foreach ($params as $param) {
307 $$param = CRM_Utils_Array::value($param, $_POST);
308 }
309
310 if (!$mappingID) {
311 echo json_encode(array('error_msg' => 'required params missing.'));
312 CRM_Utils_System::civiExit();
313 }
314
315 $selectionOptions = CRM_Core_BAO_ActionSchedule::getSelection1($mappingID);
316 extract($selectionOptions);
317
318 $elements = array();
319 foreach ($sel4 as $id => $name) {
320 $elements[] = array(
321 'name' => $name,
322 'value' => $id,
323 );
324 }
325
326 echo json_encode($elements);
327 CRM_Utils_System::civiExit();
328 }
329
330 function mappingList1() {
331 $params = array('mappingID');
332 foreach ($params as $param) {
333 $$param = CRM_Utils_Array::value($param, $_POST);
334 }
335
336 if (!$mappingID) {
337 echo json_encode(array('error_msg' => 'required params missing.'));
338 CRM_Utils_System::civiExit();
339 }
340
341 $selectionOptions = CRM_Core_BAO_ActionSchedule::getSelection1($mappingID);
342 extract($selectionOptions);
343
344 $elements = array();
345 foreach ($sel5 as $id => $name) {
346 $elements['sel5'][] = array(
347 'name' => $name,
348 'value' => $id,
349 );
350 }
351 $elements['recipientMapping'] = $recipientMapping;
352
353 echo json_encode($elements);
354 CRM_Utils_System::civiExit();
355 }
356
357 static function mergeTags() {
358 $tagAId = CRM_Utils_Type::escape($_POST['fromId'], 'Integer');
359 $tagBId = CRM_Utils_Type::escape($_POST['toId'], 'Integer');
360
361 $result = CRM_Core_BAO_EntityTag::mergeTags($tagAId, $tagBId);
362
363 if (!empty($result['tagB_used_for'])) {
364 $usedFor = CRM_Core_OptionGroup::values('tag_used_for');
365 foreach ($result['tagB_used_for'] as & $val) {
366 $val = $usedFor[$val];
367 }
368 $result['tagB_used_for'] = implode(', ', $result['tagB_used_for']);
369 }
370
371 $result['message'] = ts('"%1" has been merged with "%2". All records previously tagged "%1" are now tagged "%2".',
372 array(1 => $result['tagA'], 2 => $result['tagB'])
373 );
374
375 echo json_encode($result);
376 CRM_Utils_System::civiExit();
377 }
378
379 function recipient() {
380 $params = array('recipient');
381 foreach ($params as $param) {
382 $$param = CRM_Utils_Array::value($param, $_POST);
383 }
384
385 if (!$recipient) {
386 echo json_encode(array('error_msg' => 'required params missing.'));
387 CRM_Utils_System::civiExit();
388 }
389
390 switch ($recipient) {
391 case 'Participant Status':
392 $values = CRM_Event_PseudoConstant::participantStatus();
393 break;
394
395 case 'participant_role':
396 $values = CRM_Event_PseudoConstant::participantRole();
397 break;
398
399 default:
400 exit;
401 }
402
403 $elements = array();
404 foreach ($values as $id => $name) {
405 $elements[] = array(
406 'name' => $name,
407 'value' => $id,
408 );
409 }
410
411 echo json_encode($elements);
412 CRM_Utils_System::civiExit();
413 }
414 }
415