CRM-16354 - Migrate forms to new wysiwyg code
[civicrm-core.git] / CRM / Contribute / Form / ContributionPage / Amount.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
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-2015
32 * $Id$
33 *
34 */
35
36 /**
37 * form to process actions on the group aspect of Custom Data
38 */
39 class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_ContributionPage {
40
41 /**
42 * Contribution amount block.
43 *
44 * @var array
45 */
46 protected $_amountBlock = array();
47
48 /**
49 * Constants for number of options for data types of multiple option.
50 */
51 const NUM_OPTION = 11;
52
53 /**
54 * Build the form object.
55 *
56 * @return void
57 */
58 public function buildQuickForm() {
59
60 // do u want to allow a free form text field for amount
61 $this->addElement('checkbox', 'is_allow_other_amount', ts('Allow other amounts'), NULL, array('onclick' => "minMax(this);showHideAmountBlock( this, 'is_allow_other_amount' );"));
62 $this->add('text', 'min_amount', ts('Minimum Amount'), array('size' => 8, 'maxlength' => 8));
63 $this->addRule('min_amount', ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('9.99', ' '))), 'money');
64
65 $this->add('text', 'max_amount', ts('Maximum Amount'), array('size' => 8, 'maxlength' => 8));
66 $this->addRule('max_amount', ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('99.99', ' '))), 'money');
67
68 //CRM-12055
69 $this->add('text', 'amount_label', ts('Contribution Amounts Label'));
70
71 $default = array($this->createElement('radio', NULL, NULL, NULL, 0));
72 $this->add('hidden', "price_field_id", '', array('id' => "price_field_id"));
73 $this->add('hidden', "price_field_other", '', array('id' => "price_field_option"));
74 for ($i = 1; $i <= self::NUM_OPTION; $i++) {
75 // label
76 $this->add('text', "label[$i]", ts('Label'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_OptionValue', 'label'));
77
78 $this->add('hidden', "price_field_value[$i]", '', array('id' => "price_field_value[$i]"));
79
80 // value
81 $this->add('text', "value[$i]", ts('Value'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_OptionValue', 'value'));
82 $this->addRule("value[$i]", ts('Please enter a valid money value (e.g. %1).', array(1 => CRM_Utils_Money::format('99.99', ' '))), 'money');
83
84 // default
85 $default[] = $this->createElement('radio', NULL, NULL, NULL, $i);
86 }
87
88 $this->addGroup($default, 'default');
89
90 $this->addElement('checkbox', 'amount_block_is_active', ts('Contribution Amounts section enabled'), NULL, array('onclick' => "showHideAmountBlock( this, 'amount_block_is_active' );"));
91
92 $this->addElement('checkbox', 'is_monetary', ts('Execute real-time monetary transactions'));
93
94 $paymentProcessor = CRM_Core_PseudoConstant::paymentProcessor();
95 $recurringPaymentProcessor = array();
96
97 if (!empty($paymentProcessor)) {
98 $paymentProcessorIds = implode(',', array_keys($paymentProcessor));
99 $query = "
100 SELECT id
101 FROM civicrm_payment_processor
102 WHERE id IN ({$paymentProcessorIds})
103 AND is_recur = 1";
104 $dao = CRM_Core_DAO::executeQuery($query);
105 while ($dao->fetch()) {
106 $recurringPaymentProcessor[] = $dao->id;
107 }
108 }
109 $this->assign('recurringPaymentProcessor', $recurringPaymentProcessor);
110 if (count($paymentProcessor)) {
111 $this->assign('paymentProcessor', $paymentProcessor);
112 }
113
114 $this->addCheckBox('payment_processor', ts('Payment Processor'),
115 array_flip($paymentProcessor),
116 NULL, NULL, NULL, NULL,
117 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>')
118 );
119
120 //check if selected payment processor supports recurring payment
121 if (!empty($recurringPaymentProcessor)) {
122 $this->addElement('checkbox', 'is_recur', ts('Recurring Contributions'), NULL,
123 array('onclick' => "showHideByValue('is_recur',true,'recurFields','table-row','radio',false);")
124 );
125 $this->addCheckBox('recur_frequency_unit', ts('Supported recurring units'),
126 CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE),
127 NULL, NULL, NULL, NULL,
128 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>'), TRUE
129 );
130 $this->addElement('checkbox', 'is_recur_interval', ts('Support recurring intervals'));
131 $this->addElement('checkbox', 'is_recur_installments', ts('Offer installments'));
132 }
133
134 // add pay later options
135 $this->addElement('checkbox', 'is_pay_later', ts('Pay later option'), NULL);
136 $this->addElement('textarea', 'pay_later_text', ts('Pay later label'),
137 CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_text'),
138 FALSE
139 );
140 $this->add('wysiwyg', 'pay_later_receipt', ts('Pay Later Instructions'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_ContributionPage', 'pay_later_receipt'));
141 $this->addElement('checkbox', 'is_billing_required', ts('Billing address required'));
142
143 //add partial payment options
144
145 // add price set fields
146 $price = CRM_Price_BAO_PriceSet::getAssoc(FALSE, 'CiviContribute');
147 if (CRM_Utils_System::isNull($price)) {
148 $this->assign('price', FALSE);
149 }
150 else {
151 $this->assign('price', TRUE);
152 }
153 $this->add('select', 'price_set_id', ts('Price Set'),
154 array(
155 '' => ts('- none -'),
156 ) + $price,
157 NULL, array('onchange' => "showHideAmountBlock( this.value, 'price_set_id' );")
158 );
159 //CiviPledge fields.
160 $config = CRM_Core_Config::singleton();
161 if (in_array('CiviPledge', $config->enableComponents)) {
162 $this->assign('civiPledge', TRUE);
163 $this->addElement('checkbox', 'is_pledge_active', ts('Pledges'),
164 NULL, array('onclick' => "showHideAmountBlock( this, 'is_pledge_active' ); return showHideByValue('is_pledge_active',true,'pledgeFields','table-row','radio',false);")
165 );
166 $this->addCheckBox('pledge_frequency_unit', ts('Supported pledge frequencies'),
167 CRM_Core_OptionGroup::values('recur_frequency_units', FALSE, FALSE, TRUE),
168 NULL, NULL, NULL, NULL,
169 array('&nbsp;&nbsp;', '&nbsp;&nbsp;', '&nbsp;&nbsp;', '<br/>'), TRUE
170 );
171 $this->addElement('checkbox', 'is_pledge_interval', ts('Allow frequency intervals'));
172 $this->addElement('text', 'initial_reminder_day', ts('Send payment reminder'), array('size' => 3));
173 $this->addElement('text', 'max_reminders', ts('Send up to'), array('size' => 3));
174 $this->addElement('text', 'additional_reminder_day', ts('Send additional reminders'), array('size' => 3));
175 }
176
177 //add currency element.
178 $this->addCurrency('currency', ts('Currency'));
179
180 $this->addFormRule(array('CRM_Contribute_Form_ContributionPage_Amount', 'formRule'), $this);
181
182 parent::buildQuickForm();
183 }
184
185 /**
186 * Set default values for the form. Note that in edit/view mode
187 * the default values are retrieved from the database
188 *
189 *
190 * @return array
191 */
192 public function setDefaultValues() {
193 $defaults = parent::setDefaultValues();
194 $title = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_ContributionPage', $this->_id, 'title');
195 CRM_Utils_System::setTitle(ts('Contribution Amounts') . " ($title)");
196
197 if (empty($defaults['pay_later_text'])) {
198 $defaults['pay_later_text'] = ts('I will send payment by check');
199 }
200
201 if (!empty($defaults['amount_block_is_active'])) {
202
203 if ($priceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, NULL)) {
204 if ($isQuick = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config')) {
205 $this->assign('isQuick', $isQuick);
206 //$priceField = CRM_Core_DAO::getFieldValue( 'CRM_Price_DAO_PriceField', $priceSetId, 'id', 'price_set_id' );
207 $options = $pFIDs = array();
208 $priceFieldParams = array('price_set_id' => $priceSetId);
209 $priceFields = CRM_Core_DAO::commonRetrieveAll('CRM_Price_DAO_PriceField', 'price_set_id', $priceSetId, $pFIDs, $return = array(
210 'html_type',
211 'name',
212 'is_active',
213 'label',
214 ));
215 foreach ($priceFields as $priceField) {
216 if ($priceField['id'] && $priceField['html_type'] == 'Radio' && $priceField['name'] == 'contribution_amount') {
217 $defaults['price_field_id'] = $priceField['id'];
218 $priceFieldOptions = CRM_Price_BAO_PriceFieldValue::getValues($priceField['id'], $options, 'id', 1);
219 if (empty($priceFieldOptions)) {
220 continue;
221 }
222 $countRow = 0;
223 $defaults['amount_label'] = $priceField['label'];
224 foreach ($options as $optionId => $optionValue) {
225 $countRow++;
226 $defaults['value'][$countRow] = $optionValue['amount'];
227 $defaults['label'][$countRow] = CRM_Utils_Array::value('label', $optionValue);
228 $defaults['name'][$countRow] = CRM_Utils_Array::value('name', $optionValue);
229 $defaults['weight'][$countRow] = $optionValue['weight'];
230
231 $defaults["price_field_value"][$countRow] = $optionValue['id'];
232 if ($optionValue['is_default']) {
233 $defaults['default'] = $countRow;
234 }
235 }
236 }
237 elseif ($priceField['id'] && $priceField['html_type'] == 'Text' && $priceField['name'] = 'other_amount' && $priceField['is_active']) {
238 $defaults['price_field_other'] = $priceField['id'];
239 if (!isset($defaults['amount_label'])) {
240 $defaults['amount_label'] = $priceField['label'];
241 }
242 }
243 }
244 }
245 }
246
247 if (empty($defaults['amount_label'])) {
248 $defaults['amount_label'] = ts('Contribution Amount');
249 }
250
251 if (!empty($defaults['value']) && is_array($defaults['value'])) {
252
253 // CRM-4038: fix value display
254 foreach ($defaults['value'] as & $amount) {
255 $amount = trim(CRM_Utils_Money::format($amount, ' '));
256 }
257 }
258 }
259
260 // fix the display of the monetary value, CRM-4038
261 if (isset($defaults['min_amount'])) {
262 $defaults['min_amount'] = CRM_Utils_Money::format($defaults['min_amount'], NULL, '%a');
263 }
264 if (isset($defaults['max_amount'])) {
265 $defaults['max_amount'] = CRM_Utils_Money::format($defaults['max_amount'], NULL, '%a');
266 }
267
268 if (!empty($defaults['payment_processor'])) {
269 $defaults['payment_processor'] = array_fill_keys(explode(CRM_Core_DAO::VALUE_SEPARATOR,
270 $defaults['payment_processor']
271 ), '1');
272 }
273 return $defaults;
274 }
275
276 /**
277 * Global form rule.
278 *
279 * @param array $fields
280 * The input form values.
281 * @param array $files
282 * The uploaded files if any.
283 * @param $self
284 *
285 *
286 * @return bool|array
287 * true if no errors, else array of errors
288 */
289 public static function formRule($fields, $files, $self) {
290 $errors = array();
291 //as for separate membership payment we has to have
292 //contribution amount section enabled, hence to disable it need to
293 //check if separate membership payment enabled,
294 //if so disable first separate membership payment option
295 //then disable contribution amount section. CRM-3801,
296
297 $membershipBlock = new CRM_Member_DAO_MembershipBlock();
298 $membershipBlock->entity_table = 'civicrm_contribution_page';
299 $membershipBlock->entity_id = $self->_id;
300 $membershipBlock->is_active = 1;
301 $hasMembershipBlk = FALSE;
302 if ($membershipBlock->find(TRUE)) {
303 if (!empty($fields['amount_block_is_active']) &&
304 ($setID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $self->_id, NULL, 1))
305 ) {
306 $extends = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'extends');
307 if ($extends && $extends == CRM_Core_Component::getComponentID('CiviMember')) {
308 $errors['amount_block_is_active'] = ts('You cannot use a Membership Price Set when the Contribution Amounts section is enabled. Click the Memberships tab above, and select your Membership Price Set on that form. Membership Price Sets may include additional fields for non-membership options that require an additional fee (e.g. magazine subscription) or an additional voluntary contribution.');
309 return $errors;
310 }
311 }
312 $hasMembershipBlk = TRUE;
313 if ($membershipBlock->is_separate_payment && empty($fields['amount_block_is_active'])) {
314 $errors['amount_block_is_active'] = ts('To disable Contribution Amounts section you need to first disable Separate Membership Payment option from Membership Settings.');
315 }
316 }
317
318 //check for the amount label (mandatory)
319 if (!empty($fields['amount_block_is_active']) && empty($fields['amount_label'])) {
320 $errors['amount_label'] = ts('Please enter the contribution amount label.');
321 }
322 $minAmount = CRM_Utils_Array::value('min_amount', $fields);
323 $maxAmount = CRM_Utils_Array::value('max_amount', $fields);
324 if (!empty($minAmount) && !empty($maxAmount)) {
325 $minAmount = CRM_Utils_Rule::cleanMoney($minAmount);
326 $maxAmount = CRM_Utils_Rule::cleanMoney($maxAmount);
327 if ((float ) $minAmount > (float ) $maxAmount) {
328 $errors['min_amount'] = ts('Minimum Amount should be less than Maximum Amount');
329 }
330 }
331
332 if (isset($fields['is_pay_later'])) {
333 if (empty($fields['pay_later_text'])) {
334 $errors['pay_later_text'] = ts('Please enter the text for the \'pay later\' checkbox displayed on the contribution form.');
335 }
336 if (empty($fields['pay_later_receipt'])) {
337 $errors['pay_later_receipt'] = ts('Please enter the instructions to be sent to the contributor when they choose to \'pay later\'.');
338 }
339 }
340
341 // don't allow price set w/ membership signup, CRM-5095
342 if ($priceSetId = CRM_Utils_Array::value('price_set_id', $fields)) {
343 // don't allow price set w/ membership.
344 if ($hasMembershipBlk) {
345 $errors['price_set_id'] = ts('You cannot enable both a Contribution Price Set and Membership Signup on the same online contribution page.');
346 }
347 }
348 else {
349 if (isset($fields['is_recur'])) {
350 if (empty($fields['recur_frequency_unit'])) {
351 $errors['recur_frequency_unit'] = ts('At least one recurring frequency option needs to be checked.');
352 }
353 }
354
355 // validation for pledge fields.
356 if (!empty($fields['is_pledge_active'])) {
357 if (empty($fields['pledge_frequency_unit'])) {
358 $errors['pledge_frequency_unit'] = ts('At least one pledge frequency option needs to be checked.');
359 }
360 if (!empty($fields['is_recur'])) {
361 $errors['is_recur'] = ts('You cannot enable both Recurring Contributions AND Pledges on the same online contribution page.');
362 }
363 }
364
365 // If Contribution amount section is enabled, then
366 // Allow other amounts must be enabled OR the Fixed Contribution
367 // Contribution options must contain at least one set of values.
368 if (!empty($fields['amount_block_is_active'])) {
369 if (empty($fields['is_allow_other_amount']) &&
370 !$priceSetId
371 ) {
372 //get the values of amount block
373 $values = CRM_Utils_Array::value('value', $fields);
374 $isSetRow = FALSE;
375 for ($i = 1; $i < self::NUM_OPTION; $i++) {
376 if ((isset($values[$i]) && (strlen(trim($values[$i])) > 0))) {
377 $isSetRow = TRUE;
378 }
379 }
380 if (!$isSetRow) {
381 $errors['amount_block_is_active'] = ts('If you want to enable the \'Contribution Amounts section\', you need to either \'Allow Other Amounts\' and/or enter at least one row in the \'Fixed Contribution Amounts\' table.');
382 }
383 }
384 }
385 }
386
387 if (!empty($fields['payment_processor']) && $financialType = CRM_Contribute_BAO_Contribution::validateFinancialType($self->_defaultValues['financial_type_id'])) {
388 $errors['payment_processor'] = ts("Financial Account of account relationship of 'Expense Account is' is not configured for Financial Type : ") . $financialType;
389 }
390
391 if (!empty($fields['is_recur_interval'])) {
392 foreach (array_keys($fields['payment_processor']) as $paymentProcessorID) {
393 $paymentProcessorTypeId = CRM_Core_DAO::getFieldValue(
394 'CRM_Financial_DAO_PaymentProcessor',
395 $paymentProcessorID,
396 'payment_processor_type_id'
397 );
398 $paymentProcessorType = CRM_Core_PseudoConstant::paymentProcessorType(FALSE, $paymentProcessorTypeId, 'name');
399 if ($paymentProcessorType == 'Google_Checkout') {
400 $errors['is_recur_interval'] = ts('Google Checkout does not support recurring intervals');
401 break;
402 }
403 }
404 }
405
406 return $errors;
407 }
408
409 /**
410 * Process the form.
411 *
412 * @return void
413 */
414 public function postProcess() {
415 // get the submitted form values.
416 $params = $this->controller->exportValues($this->_name);
417
418 //update 'is_billing_required'
419 if (empty($params['is_pay_later'])) {
420 $params['is_billing_required'] = 0;
421 }
422
423 if (array_key_exists('payment_processor', $params)) {
424 if (array_key_exists(CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', 'AuthNet',
425 'id', 'payment_processor_type_id'
426 ),
427 CRM_Utils_Array::value('payment_processor', $params)
428 )) {
429 CRM_Core_Session::setStatus(ts(' Please note that the Authorize.net payment processor only allows recurring contributions and auto-renew memberships with payment intervals from 7-365 days or 1-12 months (i.e. not greater than 1 year).'), '', 'alert');
430 }
431 }
432
433 // check for price set.
434 $priceSetID = CRM_Utils_Array::value('price_set_id', $params);
435
436 // get required fields.
437 $fields = array(
438 'id' => $this->_id,
439 'is_recur' => FALSE,
440 'min_amount' => "null",
441 'max_amount' => "null",
442 'is_monetary' => FALSE,
443 'is_pay_later' => FALSE,
444 'is_billing_required' => FALSE,
445 'is_recur_interval' => FALSE,
446 'is_recur_installments' => FALSE,
447 'recur_frequency_unit' => "null",
448 'default_amount_id' => "null",
449 'is_allow_other_amount' => FALSE,
450 'amount_block_is_active' => FALSE,
451 );
452 $resetFields = array();
453 if ($priceSetID) {
454 $resetFields = array('min_amount', 'max_amount', 'is_allow_other_amount');
455 }
456
457 if (empty($params['is_recur'])) {
458 $resetFields = array_merge($resetFields, array('is_recur_interval', 'recur_frequency_unit'));
459 }
460
461 foreach ($fields as $field => $defaultVal) {
462 $val = CRM_Utils_Array::value($field, $params, $defaultVal);
463 if (in_array($field, $resetFields)) {
464 $val = $defaultVal;
465 }
466
467 if (in_array($field, array(
468 'min_amount',
469 'max_amount',
470 ))) {
471 $val = CRM_Utils_Rule::cleanMoney($val);
472 }
473
474 $params[$field] = $val;
475 }
476
477 if ($params['is_recur']) {
478 $params['recur_frequency_unit'] = implode(CRM_Core_DAO::VALUE_SEPARATOR,
479 array_keys($params['recur_frequency_unit'])
480 );
481 $params['is_recur_interval'] = CRM_Utils_Array::value('is_recur_interval', $params, FALSE);
482 $params['is_recur_installments'] = CRM_Utils_Array::value('is_recur_installments', $params, FALSE);
483 }
484
485 if (array_key_exists('payment_processor', $params) &&
486 !CRM_Utils_System::isNull($params['payment_processor'])
487 ) {
488 $params['payment_processor'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, array_keys($params['payment_processor']));
489 }
490 else {
491 $params['payment_processor'] = 'null';
492 }
493
494 $contributionPage = CRM_Contribute_BAO_ContributionPage::create($params);
495 $contributionPageID = $contributionPage->id;
496
497 // prepare for data cleanup.
498 $deleteAmountBlk = $deletePledgeBlk = $deletePriceSet = FALSE;
499 if ($this->_priceSetID) {
500 $deletePriceSet = TRUE;
501 }
502 if ($this->_pledgeBlockID) {
503 $deletePledgeBlk = TRUE;
504 }
505 if (!empty($this->_amountBlock)) {
506 $deleteAmountBlk = TRUE;
507 }
508
509 if ($contributionPageID) {
510
511 if (!empty($params['amount_block_is_active'])) {
512 // handle price set.
513 if ($priceSetID) {
514 // add/update price set.
515 $deletePriceSet = FALSE;
516 if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) {
517 $deleteAmountBlk = TRUE;
518 }
519
520 CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageID, $priceSetID);
521 }
522 else {
523
524 $deletePriceSet = FALSE;
525 // process contribution amount block
526 $deleteAmountBlk = FALSE;
527
528 $labels = CRM_Utils_Array::value('label', $params);
529 $values = CRM_Utils_Array::value('value', $params);
530 $default = CRM_Utils_Array::value('default', $params);
531
532 $options = array();
533 for ($i = 1; $i < self::NUM_OPTION; $i++) {
534 if (isset($values[$i]) &&
535 (strlen(trim($values[$i])) > 0)
536 ) {
537 $options[] = array(
538 'label' => trim($labels[$i]),
539 'value' => CRM_Utils_Rule::cleanMoney(trim($values[$i])),
540 'weight' => $i,
541 'is_active' => 1,
542 'is_default' => $default == $i,
543 );
544 }
545 }
546 /* || !empty($params['price_field_value']) || CRM_Utils_Array::value( 'price_field_other', $params )*/
547 if (!empty($options) || !empty($params['is_allow_other_amount'])) {
548 $fieldParams['is_quick_config'] = 1;
549 $noContriAmount = NULL;
550 $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3);
551 if (!(!empty($params['price_field_id']) || !empty($params['price_field_other'])) && !$usedPriceSetId) {
552 $pageTitle = strtolower(CRM_Utils_String::munge($this->_values['title'], '_', 245));
553 $setParams['title'] = $this->_values['title'];
554 if (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle, 'id', 'name')) {
555 $setParams['name'] = $pageTitle;
556 }
557 elseif (!CRM_Core_DAO::getFieldValue('CRM_Price_BAO_PriceSet', $pageTitle . '_' . $this->_id, 'id', 'name')) {
558 $setParams['name'] = $pageTitle . '_' . $this->_id;
559 }
560 else {
561 $timeSec = explode(".", microtime(TRUE));
562 $setParams['name'] = $pageTitle . '_' . date('is', $timeSec[0]) . $timeSec[1];
563 }
564 $setParams['is_quick_config'] = 1;
565 $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
566 $setParams['extends'] = CRM_Core_Component::getComponentID('CiviContribute');
567 $priceSet = CRM_Price_BAO_PriceSet::create($setParams);
568 $priceSetId = $priceSet->id;
569 }
570 elseif ($usedPriceSetId && empty($params['price_field_id'])) {
571 $priceSetId = $usedPriceSetId;
572 }
573 else {
574 if ($priceFieldId = CRM_Utils_Array::value('price_field_id', $params)) {
575 foreach ($params['price_field_value'] as $arrayID => $fieldValueID) {
576 if (empty($params['label'][$arrayID]) && empty($params['value'][$arrayID]) && !empty($fieldValueID)) {
577 CRM_Price_BAO_PriceFieldValue::setIsActive($fieldValueID, '0');
578 unset($params['price_field_value'][$arrayID]);
579 }
580 }
581 if (implode('', $params['price_field_value'])) {
582 $fieldParams['id'] = CRM_Utils_Array::value('price_field_id', $params);
583 $fieldParams['option_id'] = $params['price_field_value'];
584 }
585 else {
586 $noContriAmount = 0;
587 CRM_Price_BAO_PriceField::setIsActive($priceFieldId, '0');
588 }
589 }
590 else {
591 $priceFieldId = CRM_Utils_Array::value('price_field_other', $params);
592 }
593 $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceFieldId, 'price_set_id');
594 }
595 CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $this->_id, $priceSetId);
596 if (!empty($options)) {
597 $editedFieldParams = array(
598 'price_set_id' => $priceSetId,
599 'name' => 'contribution_amount',
600 );
601 $editedResults = array();
602 $noContriAmount = 1;
603 CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults);
604 if (empty($editedResults['id'])) {
605 $fieldParams['name'] = strtolower(CRM_Utils_String::munge("Contribution Amount", '_', 245));
606 }
607 else {
608 $fieldParams['id'] = CRM_Utils_Array::value('id', $editedResults);
609 }
610
611 $fieldParams['price_set_id'] = $priceSetId;
612 $fieldParams['is_active'] = 1;
613 $fieldParams['weight'] = 2;
614
615 if (!empty($params['is_allow_other_amount'])) {
616 $fieldParams['is_required'] = 0;
617 }
618 else {
619 $fieldParams['is_required'] = 1;
620 }
621 $fieldParams['label'] = $params['amount_label'];
622 $fieldParams['html_type'] = 'Radio';
623 $fieldParams['option_label'] = $params['label'];
624 $fieldParams['option_amount'] = $params['value'];
625 $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
626 foreach ($options as $value) {
627 $fieldParams['option_weight'][$value['weight']] = $value['weight'];
628 }
629 $fieldParams['default_option'] = $params['default'];
630 $priceField = CRM_Price_BAO_PriceField::create($fieldParams);
631 }
632 if (!empty($params['is_allow_other_amount']) && empty($params['price_field_other'])) {
633 $editedFieldParams = array(
634 'price_set_id' => $priceSetId,
635 'name' => 'other_amount',
636 );
637 $editedResults = array();
638
639 CRM_Price_BAO_PriceField::retrieve($editedFieldParams, $editedResults);
640
641 if (!$priceFieldID = CRM_Utils_Array::value('id', $editedResults)) {
642 $fieldParams = array(
643 'name' => 'other_amount',
644 'label' => 'Other Amount',
645 'price_set_id' => $priceSetId,
646 'html_type' => 'Text',
647 'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $this->_values),
648 'is_display_amounts' => 0,
649 'weight' => 3,
650 );
651 $fieldParams['option_weight'][1] = 1;
652 $fieldParams['option_amount'][1] = 1;
653 if (!$noContriAmount) {
654 $fieldParams['is_required'] = 1;
655 $fieldParams['option_label'][1] = $fieldParams['label'] = $params['amount_label'];
656 }
657 else {
658 $fieldParams['is_required'] = 0;
659 $fieldParams['option_label'][1] = $fieldParams['label'] = 'Other Amount';
660 }
661
662 $priceField = CRM_Price_BAO_PriceField::create($fieldParams);
663 }
664 else {
665 if (empty($editedResults['is_active'])) {
666 $fieldParams = $editedResults;
667 if (!$noContriAmount) {
668 $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id');
669 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']);
670 $fieldParams = array(
671 'is_required' => 1,
672 'label' => $params['amount_label'],
673 'id' => $priceFieldID,
674 );
675 }
676 $fieldParams['is_active'] = 1;
677 $priceField = CRM_Price_BAO_PriceField::add($fieldParams);
678 }
679 }
680 }
681 elseif (empty($params['is_allow_other_amount']) && !empty($params['price_field_other'])) {
682 CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0');
683 }
684 elseif ($priceFieldID = CRM_Utils_Array::value('price_field_other', $params)) {
685 $priceFieldValueID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldID, 'id', 'price_field_id');
686 if (!$noContriAmount) {
687 $fieldParams = array(
688 'is_required' => 1,
689 'label' => $params['amount_label'],
690 'id' => $priceFieldID,
691 );
692 CRM_Price_BAO_PriceField::add($fieldParams);
693 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', $params['amount_label']);
694 }
695 else {
696 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceField', $priceFieldID, 'is_required', 0);
697 CRM_Core_DAO::setFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldValueID, 'label', 'Other Amount');
698 }
699 }
700 }
701
702 if (!empty($params['is_pledge_active'])) {
703 $deletePledgeBlk = FALSE;
704 $pledgeBlockParams = array(
705 'entity_id' => $contributionPageID,
706 'entity_table' => ts('civicrm_contribution_page'),
707 );
708 if ($this->_pledgeBlockID) {
709 $pledgeBlockParams['id'] = $this->_pledgeBlockID;
710 }
711 $pledgeBlock = array(
712 'pledge_frequency_unit',
713 'max_reminders',
714 'initial_reminder_day',
715 'additional_reminder_day',
716 );
717 foreach ($pledgeBlock as $key) {
718 $pledgeBlockParams[$key] = CRM_Utils_Array::value($key, $params);
719 }
720 $pledgeBlockParams['is_pledge_interval'] = CRM_Utils_Array::value('is_pledge_interval',
721 $params, FALSE
722 );
723 // create pledge block.
724 CRM_Pledge_BAO_PledgeBlock::create($pledgeBlockParams);
725 }
726 }
727 }
728 else {
729 if (!empty($params['price_field_id']) || !empty($params['price_field_other'])) {
730 $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 3);
731 if ($usedPriceSetId) {
732 if (!empty($params['price_field_id'])) {
733 CRM_Price_BAO_PriceField::setIsActive($params['price_field_id'], '0');
734 }
735 if (!empty($params['price_field_other'])) {
736 CRM_Price_BAO_PriceField::setIsActive($params['price_field_other'], '0');
737 }
738 }
739 else {
740 $deleteAmountBlk = TRUE;
741 $deletePriceSet = TRUE;
742 }
743 }
744 }
745
746 // delete pledge block.
747 if ($deletePledgeBlk) {
748 CRM_Pledge_BAO_PledgeBlock::deletePledgeBlock($this->_pledgeBlockID);
749 }
750
751 // delete previous price set.
752 if ($deletePriceSet) {
753 CRM_Price_BAO_PriceSet::removeFrom('civicrm_contribution_page', $contributionPageID);
754 }
755
756 if ($deleteAmountBlk) {
757 $priceField = !empty($params['price_field_id']) ? $params['price_field_id'] : CRM_Utils_Array::value('price_field_other', $params);
758 if ($priceField) {
759 $priceSetID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceField, 'price_set_id');
760 CRM_Price_BAO_PriceSet::setIsQuickConfig($priceSetID, 0);
761 }
762 }
763 }
764 parent::endPostProcess();
765 }
766
767 /**
768 * Return a descriptive name for the page, used in wizard header
769 *
770 * @return string
771 */
772 public function getTitle() {
773 return ts('Amounts');
774 }
775
776 }