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 +--------------------------------------------------------------------+
32 * @copyright CiviCRM LLC (c) 2004-2013
38 * This class generates form components for processing Event
41 class CRM_Event_Form_Registration_AdditionalParticipant
extends CRM_Event_Form_Registration
{
44 * The defaults involved in this page
47 public $_defaults = array();
50 * pre-registered additional participant id.
53 public $additionalParticipantId = NULL;
56 * Function to set variables up before form is built
61 function preProcess() {
64 $participantNo = substr($this->_name
, 12);
66 //lets process in-queue participants.
67 if ($this->_participantId
&& $this->_additionalParticipantIds
) {
68 $this->_additionalParticipantId
= CRM_Utils_Array
::value($participantNo, $this->_additionalParticipantIds
);
71 $participantCnt = $participantNo +
1;
72 $this->assign('formId', $participantNo);
73 $this->_params
= array();
74 $this->_params
= $this->get('params');
76 $participantTot = $this->_params
[0]['additional_participants'] +
1;
77 $skipCount = count(array_keys($this->_params
, "skip"));
79 $this->assign('skipCount', $skipCount);
81 CRM_Utils_System
::setTitle(ts('Register Participant %1 of %2', array(1 => $participantCnt, 2 => $participantTot)));
83 //CRM-4320, hack to check last participant.
84 $this->_lastParticipant
= FALSE;
85 if ($participantTot == $participantCnt) {
86 $this->_lastParticipant
= TRUE;
88 $this->assign('lastParticipant', $this->_lastParticipant
);
92 * This function sets the default values for the form. For edit/view mode
93 * the default values are retrieved from the database
99 function setDefaultValues() {
100 $defaults = $unsetSubmittedOptions = array();
102 //fix for CRM-3088, default value for discount set.
103 if (!empty($this->_values
['discount'])) {
104 $discountId = CRM_Core_BAO_Discount
::findSet($this->_eventId
, 'civicrm_event');
105 if ($discountId && CRM_Utils_Array
::value('default_discount_fee_id', $this->_values
['event'])) {
106 $discountKey = CRM_Core_DAO
::getFieldValue("CRM_Core_DAO_OptionValue", $this->_values
['event']['default_discount_fee_id']
109 $defaults['amount'] = key(array_slice($this->_values
['discount'][$discountId], $discountKey - 1, $discountKey, TRUE));
112 if ($this->_priceSetId
) {
113 foreach ($this->_feeBlock
as $key => $val) {
114 if (!CRM_Utils_Array
::value('options', $val)) {
118 $optionsFull = CRM_Utils_Array
::value('option_full_ids', $val, array());
119 foreach ($val['options'] as $keys => $values) {
120 if ($values['is_default'] && !in_array($keys, $optionsFull)) {
121 if ($val['html_type'] == 'CheckBox') {
122 $defaults["price_{$key}"][$keys] = 1;
125 $defaults["price_{$key}"] = $keys;
129 if (!empty($optionsFull)) {
130 $unsetSubmittedOptions[$val['id']] = $optionsFull;
135 //CRM-4320, setdefault additional participant values.
136 if ($this->_allowConfirmation
&& $this->_additionalParticipantId
) {
137 //hack to get set default from eventFees.php
138 $this->_discountId
= $discountId;
139 $this->_pId
= $this->_additionalParticipantId
;
140 $this->_contactId
= CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_Participant', $this->_additionalParticipantId
, 'contact_id');
141 $participantDefaults = CRM_Event_Form_EventFees
::setDefaultValues($this);
142 $participantDefaults = array_merge($this->_defaults
, $participantDefaults);
143 // use primary email address if billing email address is empty
144 if (empty($this->_defaults
["email-{$this->_bltID}"]) &&
145 !empty($this->_defaults
["email-Primary"])
147 $participantDefaults["email-{$this->_bltID}"] = $this->_defaults
["email-Primary"];
149 $defaults = array_merge($defaults, $participantDefaults);
152 $defaults = array_merge($this->_defaults
, $defaults);
154 //reset values for all options those are full.
155 if (!empty($unsetSubmittedOptions) && empty($_POST)) {
156 $this->resetElementValue($unsetSubmittedOptions);
159 //load default campaign from page.
160 if (array_key_exists('participant_campaign_id', $this->_fields
)) {
161 $defaults['participant_campaign_id'] = CRM_Utils_Array
::value('campaign_id', $this->_values
['event']);
163 CRM_Core_BAO_Address
::fixAllStateSelects($this, $this->_defaults
);
169 * Function to build the form
174 public function buildQuickForm() {
175 $config = CRM_Core_Config
::singleton();
176 $button = substr($this->controller
->getButtonName(), -4);
178 $this->add('hidden', 'scriptFee', NULL);
179 $this->add('hidden', 'scriptArray', NULL);
181 if ($this->_values
['event']['is_monetary']) {
182 CRM_Event_Form_Registration_Register
::buildAmount($this);
184 $first_name = $last_name = NULL;
185 $pre = $post = array();
187 'pre', 'post') as $keys) {
188 if (isset($this->_values
['additional_custom_' . $keys . '_id'])) {
189 $this->buildCustom($this->_values
['additional_custom_' . $keys . '_id'], 'additionalCustom' . ucfirst($keys), TRUE);
190 $
$keys = CRM_Core_BAO_UFGroup
::getFields($this->_values
['additional_custom_' . $keys . '_id']);
193 'first_name', 'last_name') as $name) {
194 if (CRM_Utils_Array
::value($name, $
$keys) &&
195 CRM_Utils_Array
::value('is_required', CRM_Utils_Array
::value($name, $
$keys))
202 $required = ($button == 'skip' ||
203 $this->_values
['event']['allow_same_participant_emails'] == 1 &&
204 ($first_name && $last_name)
209 if ($this->isLastParticipant(TRUE) && !CRM_Utils_Array
::value('is_monetary', $this->_values
['event'])) {
210 $js = array('onclick' => "return submitOnce(this,'" . $this->_name
. "','" . ts('Processing') . "');");
213 //handle case where user might sart with waiting by group
214 //registration and skip some people and now group fit to
215 //become registered so need to take payment from user.
216 //this case only occurs at dynamic waiting status, CRM-4320
217 $statusMessage = NULL;
218 $allowToProceed = TRUE;
219 $includeSkipButton = TRUE;
220 $this->_resetAllowWaitlist
= FALSE;
222 $pricesetFieldsCount = CRM_Price_BAO_Set
::getPricesetCount($this->_priceSetId
);
224 if ($this->_lastParticipant ||
$pricesetFieldsCount) {
225 //get the participant total.
226 $processedCnt = self
::getParticipantCount($this, $this->_params
, TRUE);
229 if (!$this->_allowConfirmation
&&
230 CRM_Utils_Array
::value('bypass_payment', $this->_params
[0]) &&
231 $this->_lastParticipant
234 //get the event spaces.
235 $spaces = $this->_availableRegistrations
;
237 $currentPageMaxCount = 1;
238 if ($pricesetFieldsCount) {
239 $currentPageMaxCount = $pricesetFieldsCount;
242 //we might did reset allow waiting in case of dynamic calculation
243 if (CRM_Utils_Array
::value('bypass_payment', $this->_params
[0]) &&
244 is_numeric($spaces) &&
245 $processedCnt > $spaces
247 $this->_allowWaitlist
= TRUE;
248 $this->set('allowWaitlist', TRUE);
251 //lets allow to become a part of runtime waiting list, if primary selected pay later.
252 $realPayLater = FALSE;
253 if (CRM_Utils_Array
::value('is_monetary', $this->_values
['event']) &&
254 CRM_Utils_Array
::value('is_pay_later', $this->_values
['event'])
256 $realPayLater = CRM_Utils_Array
::value('is_pay_later', $this->_params
[0]);
259 //truly spaces are greater than required.
260 if (is_numeric($spaces) && $spaces >= ($processedCnt +
$currentPageMaxCount)) {
261 if (CRM_Utils_Array
::value('amount', $this->_params
[0], 0) == 0 ||
$this->_requireApproval
) {
262 $this->_allowWaitlist
= FALSE;
263 $this->set('allowWaitlist', $this->_allowWaitlist
);
264 if ($this->_requireApproval
) {
265 $statusMessage = ts("It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.", array(1 => ++
$processedCnt, 2 => $spaces));
268 $statusMessage = ts("It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed).", array(1 => ++
$processedCnt, 2 => $spaces));
272 $statusMessage = ts("It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed). Please go back to the main registration page and reduce the number of additional people. You will also need to complete payment information.", array(1 => ++
$processedCnt, 2 => $spaces));
273 $allowToProceed = FALSE;
275 CRM_Core_Session
::setStatus($statusMessage, ts('Registration Error'), 'error');
277 elseif ($processedCnt == $spaces) {
278 if (CRM_Utils_Array
::value('amount', $this->_params
[0], 0) == 0
279 ||
$realPayLater ||
$this->_requireApproval
281 $this->_resetAllowWaitlist
= TRUE;
282 if ($this->_requireApproval
) {
283 $statusMessage = ts("If you skip this participant there will be enough spaces in the event for your group (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.");
286 $statusMessage = ts("If you skip this participant there will be enough spaces in the event for your group (you will not be wait listed).");
290 //hey there is enough space and we require payment.
291 $statusMessage = ts("If you skip this participant there will be enough spaces in the event for your group (you will not be wait listed). Please go back to the main registration page and reduce the number of additional people. You will also need to complete payment information.");
292 $includeSkipButton = FALSE;
297 // for priceset with count
298 if ($pricesetFieldsCount &&
299 CRM_Utils_Array
::value('has_waitlist', $this->_values
['event']) &&
300 !$this->_allowConfirmation
303 if ($this->_isEventFull
) {
304 $statusMessage = ts('This event is currently full. You are registering for the waiting list. You will be notified if spaces become available.');
306 elseif ($this->_allowWaitlist ||
307 (!$this->_allowWaitlist
&& ($processedCnt +
$pricesetFieldsCount) > $this->_availableRegistrations
)
310 $waitingMsg = ts('It looks like you are registering more participants then there are spaces available. All participants will be added to the waiting list. You will be notified if spaces become available.');
311 $confirmedMsg = ts('It looks like there are enough spaces in this event for your group (you will not be wait listed).');
312 if ($this->_requireApproval
) {
313 $waitingMsg = ts('It looks like you are now registering a group of %1 participants. The event has %2 available spaces (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.');
314 $confirmedMsg = ts('It looks there are enough spaces in this event for your group (you will not be wait listed). Registration for this event requires approval. You will receive an email once your registration has been reviewed.');
317 $this->assign('waitingMsg', $waitingMsg);
318 $this->assign('confirmedMsg', $confirmedMsg);
320 $this->assign('availableRegistrations', $this->_availableRegistrations
);
321 $this->assign('currentParticipantCount', $processedCnt);
322 $this->assign('allowGroupOnWaitlist', TRUE);
324 $paymentBypassed = NULL;
325 if (CRM_Utils_Array
::value('bypass_payment', $this->_params
[0]) &&
326 !$this->_allowWaitlist
&&
328 !$this->_requireApproval
&&
329 !(CRM_Utils_Array
::value('amount', $this->_params
[0], 0) == 0)
331 $paymentBypassed = ts('Please go back to the main registration page, to complete payment information.');
333 $this->assign('paymentBypassed', $paymentBypassed);
337 $this->assign('statusMessage', $statusMessage);
340 array('type' => 'back',
341 'name' => ts('<< Go Back'),
342 'spacing' => '  ',
347 if ($allowToProceed) {
348 $buttons = array_merge($buttons, array(
349 array('type' => 'next',
350 'name' => ts('Continue >>'),
351 'spacing' => ' ',
357 if ($includeSkipButton) {
358 $buttons = array_merge($buttons, array(
359 array('type' => 'next',
360 'name' => ts('Skip Participant >>|'),
367 $this->addButtons($buttons);
368 $this->addFormRule(array('CRM_Event_Form_Registration_AdditionalParticipant', 'formRule'), $this);
374 * @param array $fields the input form values
375 * @param array $files the uploaded files if any
376 * @param array $options additional user data
378 * @return true if no errors, else array of errors
382 static function formRule($fields, $files, $self) {
384 //get the button name.
385 $button = substr($self->controller
->getButtonName(), -4);
387 $realPayLater = FALSE;
388 if (CRM_Utils_Array
::value('is_monetary', $self->_values
['event']) &&
389 CRM_Utils_Array
::value('is_pay_later', $self->_values
['event'])
391 $realPayLater = CRM_Utils_Array
::value('is_pay_later', $self->_params
[0]);
394 if ($button != 'skip') {
395 //Check that either an email or firstname+lastname is included in the form(CRM-9587)
396 CRM_Event_Form_Registration_Register
::checkProfileComplete($fields, $errors, $self->_eventId
);
398 //Additional Participant can also register for an event only once
399 $isRegistered = CRM_Event_Form_Registration_Register
::checkRegistration($fields, $self, TRUE);
401 if ($self->_values
['event']['allow_same_participant_emails']) {
402 $errors['_qf_default'] = ts('A person is already registered for this event.');
405 $errors["email-{$self->_bltID}"] = ts('A person with this email address is already registered for this event.');
409 //get the complete params.
410 $params = $self->get('params');
412 //take the participant instance.
413 $addParticipantNum = substr($self->_name
, 12);
415 if (is_array($params)) {
416 foreach ($params as $key => $value) {
417 if ($key != $addParticipantNum) {
418 if (!$self->_values
['event']['allow_same_participant_emails']) {
419 //collect all email fields
420 $existingEmails = array();
421 $additionalParticipantEmails = array();
422 if (is_array($value)) {
423 foreach ($value as $key => $val) {
424 if (substr($key, 0, 6) == 'email-' && $val) {
425 $existingEmails[] = $val;
429 foreach ($fields as $key => $val) {
430 if (substr($key, 0, 6) == 'email-' && $val) {
431 $additionalParticipantEmails[] = $val;
435 //check if any emails are common to both arrays
436 if (count(array_intersect($existingEmails, $additionalParticipantEmails))) {
437 $errors[$mailKey] = ts('The email address must be unique for each participant.');
442 // check with first_name and last_name for additional participants
443 if (!empty($value['first_name']) && (CRM_Utils_Array
::value('first_name', $value) == CRM_Utils_Array
::value('first_name', $fields)) &&
444 (CRM_Utils_Array
::value('last_name',$value) == CRM_Utils_Array
::value('last_name', $fields))
446 $errors['first_name'] = ts('The first name and last name must be unique for each participant.');
454 //check for atleast one pricefields should be selected
455 if (CRM_Utils_Array
::value('priceSetId', $fields)) {
456 $allParticipantParams = $params;
458 //format current participant params.
459 $allParticipantParams[$addParticipantNum] = self
::formatPriceSetParams($self, $fields);
460 $totalParticipants = self
::getParticipantCount($self, $allParticipantParams);
462 //validate price field params.
463 $priceSetErrors = self
::validatePriceSet($self, $allParticipantParams);
464 $errors = array_merge($errors, CRM_Utils_Array
::value($addParticipantNum, $priceSetErrors, array()));
466 if (!$self->_allowConfirmation
&&
467 is_numeric($self->_availableRegistrations
)
469 if (CRM_Utils_Array
::value('bypass_payment', $self->_params
[0]) &&
470 !$self->_allowWaitlist
&&
472 !$self->_requireApproval
&&
473 !(CRM_Utils_Array
::value('amount', $self->_params
[0], 0) == 0) &&
474 $totalParticipants < $self->_availableRegistrations
476 $errors['_qf_default'] = ts("Your event registration will be confirmed. Please go back to the main registration page, to complete payment information.");
478 //check for availability of registrations.
479 if (!$self->_allowConfirmation
&&
480 !CRM_Utils_Array
::value('has_waitlist', $self->_values
['event']) &&
481 $totalParticipants > $self->_availableRegistrations
483 $errors['_qf_default'] = ts('It looks like event has only %2 seats available and you are trying to register %1 participants, so could you please select price options accordingly.', array(1 => $totalParticipants, 2 => $self->_availableRegistrations
));
489 if ($button == 'skip' && $self->_lastParticipant
&& CRM_Utils_Array
::value('priceSetId', $fields)) {
490 $pricesetFieldsCount = CRM_Price_BAO_Set
::getPricesetCount($fields['priceSetId']);
491 if (($pricesetFieldsCount < 1) ||
$self->_allowConfirmation
) {
495 if (CRM_Utils_Array
::value('has_waitlist', $self->_values
['event']) &&
496 CRM_Utils_Array
::value('bypass_payment', $self->_params
[0]) &&
497 !$self->_allowWaitlist
&&
499 !$self->_requireApproval
&&
500 !(CRM_Utils_Array
::value('amount', $self->_params
[0], 0) == 0)
502 $errors['_qf_default'] = ts("You are going to skip the last participant, your event registration will be confirmed. Please go back to the main registration page, to complete payment information.");
507 if ($button != 'skip' &&
508 $self->_values
['event']['is_monetary'] &&
509 !isset($errors['_qf_default']) &&
510 !$self->validatePaymentValues($self, $fields)
512 $errors['_qf_default'] = ts("Your payment information looks incomplete. Please go back to the main registration page, to complete payment information.");
513 $self->set('forcePayement', TRUE);
515 elseif ($button == 'skip') {
516 $self->set('forcePayement', TRUE);
522 function validatePaymentValues($self, $fields) {
524 if (CRM_Utils_Array
::value('bypass_payment', $self->_params
[0]) ||
525 $self->_allowWaitlist ||
526 empty($self->_fields
) ||
527 CRM_Utils_Array
::value('amount', $self->_params
[0]) > 0
532 $validatePayement = FALSE;
533 if (CRM_Utils_Array
::value('priceSetId', $fields)) {
535 CRM_Price_BAO_Set
::processAmount($self->_values
['fee'], $fields, $lineItem);
536 if ($fields['amount'] > 0) {
537 $validatePayement = TRUE;
538 // $self->_forcePayement = true;
542 elseif (CRM_Utils_Array
::value('amount', $fields) &&
543 (CRM_Utils_Array
::value('value', $self->_values
['fee'][$fields['amount']]) > 0)
545 $validatePayement = TRUE;
548 if (!$validatePayement) {
554 CRM_Core_Form
::validateMandatoryFields($self->_fields
, $fields, $errors);
556 // make sure that credit card number and cvv are valid
557 CRM_Core_Payment_Form
::validateCreditCard($self->_params
[0], $errors);
563 foreach (CRM_Contact_BAO_Contact
::$_greetingTypes as $greeting) {
564 if ($greetingType = CRM_Utils_Array
::value($greeting, $self->_params
[0])) {
565 $customizedValue = CRM_Core_OptionGroup
::getValue($greeting, 'Customized', 'name');
566 if ($customizedValue == $greetingType && empty($self->_params
[0][$greeting . '_custom'])) {
574 * Function to process the form
580 public function postProcess() {
581 //get the button name.
582 $button = substr($this->controller
->getButtonName(), -4);
584 //take the participant instance.
585 $addParticipantNum = substr($this->_name
, 12);
587 //user submitted params.
588 $params = $this->controller
->exportValues($this->_name
);
590 if (!$this->_allowConfirmation
) {
591 // check if the participant is already registered
592 $params['contact_id'] = CRM_Event_Form_Registration_Register
::checkRegistration($params, $this, TRUE, TRUE);
595 //carry campaign to partcipants.
596 if (array_key_exists('participant_campaign_id', $params)) {
597 $params['campaign_id'] = $params['participant_campaign_id'];
600 $params['campaign_id'] = CRM_Utils_Array
::value('campaign_id', $this->_values
['event']);
603 // if waiting is enabled
604 if (!$this->_allowConfirmation
&&
605 is_numeric($this->_availableRegistrations
)
607 $this->_allowWaitlist
= FALSE;
608 //get the current page count.
609 $currentCount = self
::getParticipantCount($this, $params);
610 if ($button == 'skip') {
611 $currentCount = 'skip';
614 //get the total count.
615 $previousCount = self
::getParticipantCount($this, $this->_params
, TRUE);
616 $totalParticipants = $previousCount;
617 if (is_numeric($currentCount)) {
618 $totalParticipants +
= $currentCount;
620 if (CRM_Utils_Array
::value('has_waitlist', $this->_values
['event']) &&
621 $totalParticipants > $this->_availableRegistrations
623 $this->_allowWaitlist
= TRUE;
625 $this->set('allowWaitlist', $this->_allowWaitlist
);
626 $this->_lineItemParticipantsCount
[$addParticipantNum] = $currentCount;
629 if ($button == 'skip') {
630 //hack for free/zero amount event.
631 if ($this->_resetAllowWaitlist
) {
632 $this->_allowWaitlist
= FALSE;
633 $this->set('allowWaitlist', FALSE);
634 if ($this->_requireApproval
) {
635 $status = ts("You have skipped last participant and which result into event having enough spaces, but your registration require approval, Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.");
638 $status = ts("You have skipped last participant and which result into event having enough spaces, hence your group become as register participants though you selected on wait list.");
640 CRM_Core_Session
::setStatus($status);
643 $this->_params
[$addParticipantNum] = 'skip';
644 if (isset($this->_lineItem
)) {
645 $this->_lineItem
[$addParticipantNum] = 'skip';
646 $this->_lineItemParticipantsCount
[$addParticipantNum] = 'skip';
651 $config = CRM_Core_Config
::singleton();
652 $params['currencyID'] = $config->defaultCurrency
;
654 if ($this->_values
['event']['is_monetary']) {
657 $discountId = CRM_Core_BAO_Discount
::findSet($this->_eventId
, 'civicrm_event');
659 if (!empty($this->_values
['discount'][$discountId])) {
660 $params['discount_id'] = $discountId;
661 $params['amount_level'] = $this->_values
['discount'][$discountId][$params['amount']]['label'];
662 $params['amount'] = $this->_values
['discount'][$discountId][$params['amount']]['value'];
664 elseif (empty($params['priceSetId'])) {
665 $params['amount_level'] = $this->_values
['fee'][$params['amount']]['label'];
666 $params['amount'] = $this->_values
['fee'][$params['amount']]['value'];
670 CRM_Price_BAO_Set
::processAmount($this->_values
['fee'], $params, $lineItem);
672 //build the line item..
673 if (array_key_exists($addParticipantNum, $this->_lineItem
)) {
674 $this->_lineItem
[$addParticipantNum] = $lineItem;
677 $this->_lineItem
[] = $lineItem;
682 if (array_key_exists('participant_role', $params)) {
683 $params['participant_role_id'] = $params['participant_role'];
686 if (!CRM_Utils_Array
::value('participant_role_id', $params) && $this->_values
['event']['default_role_id']) {
687 $params['participant_role_id'] = $this->_values
['event']['default_role_id'];
690 if (CRM_Utils_Array
::value('is_pay_later', $this->_params
[0])) {
691 $params['is_pay_later'] = 1;
694 //carry additional participant id, contact id if pre-registered.
695 if ($this->_allowConfirmation
&& $this->_additionalParticipantId
) {
696 $params['contact_id'] = $this->_contactId
;
697 $params['participant_id'] = $this->_additionalParticipantId
;
700 //build the params array.
701 if (array_key_exists($addParticipantNum, $this->_params
)) {
702 $this->_params
[$addParticipantNum] = $params;
705 $this->_params
[] = $params;
709 //finally set the params.
710 $this->set('params', $this->_params
);
712 if ($this->_lineItem
) {
713 $this->set('lineItem', $this->_lineItem
);
714 $this->set('lineItemParticipantsCount', $this->_lineItemParticipantsCount
);
717 $participantNo = count($this->_params
);
718 if ($button != 'skip') {
719 $statusMsg = ts('Registration information for participant %1 has been saved.', array(1 => $participantNo));
720 CRM_Core_Session
::setStatus($statusMsg, ts('Registration Saved'), 'success');
723 //to check whether call processRegistration()
724 if (!$this->_values
['event']['is_monetary']
725 && CRM_Utils_Array
::value('additional_participants', $this->_params
[0])
726 && $this->isLastParticipant()
728 CRM_Event_Form_Registration_Register
::processRegistration($this->_params
, NULL);
732 function &getPages($additionalParticipant) {
734 for ($i = 1; $i <= $additionalParticipant; $i++
) {
735 $details["Participant_{$i}"] = array(
736 'className' => 'CRM_Event_Form_Registration_AdditionalParticipant',
737 'title' => "Register Additional Participant {$i}",
744 * check whether call current participant is last one
746 * @return boolean ture on success.
749 function isLastParticipant($isButtonJs = FALSE) {
750 $participant = $isButtonJs ?
$this->_params
[0]['additional_participants'] : $this->_params
[0]['additional_participants'] +
1;
751 if (count($this->_params
) == $participant) {
758 * Reset values for all options those are full.
761 function resetElementValue($optionFullIds = array(
763 if (!is_array($optionFullIds) ||
764 empty($optionFullIds) ||
765 !$this->isSubmitted()
770 foreach ($optionFullIds as $fldId => $optIds) {
771 $name = "price_$fldId";
772 if (!$this->elementExists($name)) {
776 $element = $this->getElement($name);
777 $eleType = $element->getType();
779 $resetSubmitted = FALSE;
782 if ($element->isFrozen()) {
783 $element->setValue('');
784 $resetSubmitted = TRUE;
789 if (is_array($element->_elements
)) {
790 foreach ($element->_elements
as $child) {
791 $childType = $child->getType();
792 $methodName = 'getName';
794 $methodName = 'getValue';
796 if (in_array($child->{$methodName}(), $optIds) && $child->isFrozen()) {
797 $resetSubmitted = TRUE;
798 $child->updateAttributes(array('checked' => NULL));
805 $resetSubmitted = TRUE;
806 $element->_values
= array();
810 //finally unset values from submitted.
811 if ($resetSubmitted) {
812 $this->resetSubmittedValue($name, $optIds);
817 function resetSubmittedValue($elementName, $optionIds = array(
819 if (empty($elementName) ||
820 !$this->elementExists($elementName) ||
821 !$this->getSubmitValue($elementName)
826 'constantValues', 'submitValues', 'defaultValues') as $val) {
827 $values = &$this->{"_$val"};
828 if (!is_array($values) ||
empty($values)) {
831 $eleVal = CRM_Utils_Array
::value($elementName, $values);
832 if (empty($eleVal)) {
835 if (is_array($eleVal)) {
837 foreach ($eleVal as $keyId => $ignore) {
838 if (in_array($keyId, $optionIds)) {
840 unset($values[$elementName][$keyId]);
843 if ($found && empty($values[$elementName][$keyId])) {
844 $values[$elementName][$keyId] = NULL;
848 $values[$elementName][$keyId] = NULL;