Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
bc77d7c0 | 4 | | Copyright CiviCRM LLC. All rights reserved. | |
6a488035 | 5 | | | |
bc77d7c0 TO |
6 | | This work is published under the GNU AGPLv3 license with some | |
7 | | permitted exceptions and without any warranty. For full license | | |
8 | | and copyright information, see https://civicrm.org/licensing | | |
6a488035 | 9 | +--------------------------------------------------------------------+ |
d25dd0ee | 10 | */ |
6a488035 TO |
11 | |
12 | /** | |
13 | * | |
14 | * @package CRM | |
ca5cec67 | 15 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
6a488035 TO |
16 | */ |
17 | ||
18 | /** | |
07f8d162 | 19 | * Contribution Page form. |
6a488035 TO |
20 | */ |
21 | class CRM_Contribute_Form_ContributionPage extends CRM_Core_Form { | |
22 | ||
23 | /** | |
fe482240 | 24 | * The page id saved to the session for an update. |
6a488035 TO |
25 | * |
26 | * @var int | |
6a488035 TO |
27 | */ |
28 | protected $_id; | |
29 | ||
30 | /** | |
fe482240 | 31 | * The pledgeBlock id saved to the session for an update. |
6a488035 TO |
32 | * |
33 | * @var int | |
6a488035 TO |
34 | */ |
35 | protected $_pledgeBlockID; | |
36 | ||
37 | /** | |
100fef9d | 38 | * Are we in single form mode or wizard mode? |
6a488035 | 39 | * |
d51c6add | 40 | * @var bool |
6a488035 TO |
41 | */ |
42 | protected $_single; | |
43 | ||
44 | /** | |
100fef9d | 45 | * Is this the first page? |
6a488035 | 46 | * |
d51c6add | 47 | * @var bool |
6a488035 TO |
48 | */ |
49 | protected $_first = FALSE; | |
50 | ||
5fe87df6 N |
51 | /** |
52 | * Is this the last page? | |
53 | * | |
d51c6add | 54 | * @var bool |
5fe87df6 N |
55 | */ |
56 | protected $_last = FALSE; | |
57 | ||
6a488035 | 58 | /** |
100fef9d | 59 | * Store price set id. |
6a488035 TO |
60 | * |
61 | * @var int | |
6a488035 TO |
62 | */ |
63 | protected $_priceSetID = NULL; | |
64 | ||
65 | protected $_values; | |
d5965a37 | 66 | |
6e62b28c TM |
67 | /** |
68 | * Explicitly declare the entity api name. | |
69 | */ | |
70 | public function getDefaultEntity() { | |
71 | return 'Contribution'; | |
72 | } | |
6a488035 | 73 | |
a0a2c91d MWMC |
74 | /** |
75 | * Explicitly declare the form context. | |
76 | */ | |
77 | public function getDefaultContext() { | |
78 | return 'create'; | |
79 | } | |
80 | ||
6a488035 | 81 | /** |
fe482240 | 82 | * Set variables up before form is built. |
6a488035 TO |
83 | */ |
84 | public function preProcess() { | |
85 | // current contribution page id | |
86 | $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', | |
87 | $this, FALSE, NULL, 'REQUEST' | |
88 | ); | |
89 | $this->assign('contributionPageID', $this->_id); | |
90 | ||
91 | // get the requested action | |
92 | $this->_action = CRM_Utils_Request::retrieve('action', 'String', | |
93 | // default to 'browse' | |
94 | $this, FALSE, 'browse' | |
95 | ); | |
96 | ||
97 | // setting title and 3rd level breadcrumb for html page if contrib page exists | |
98 | if ($this->_id) { | |
99 | $title = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_ContributionPage', $this->_id, 'title'); | |
100 | ||
101 | if ($this->_action == CRM_Core_Action::UPDATE) { | |
102 | $this->_single = TRUE; | |
103 | } | |
104 | } | |
105 | ||
e4fa553b | 106 | // CRM-16776 - show edit/copy/create buttons on Profiles Tab if user has required permission. |
107 | if (CRM_Core_Permission::check('administer CiviCRM')) { | |
108 | $this->assign('perm', TRUE); | |
109 | } | |
6a488035 TO |
110 | // set up tabs |
111 | CRM_Contribute_Form_ContributionPage_TabHeader::build($this); | |
112 | ||
113 | if ($this->_action == CRM_Core_Action::UPDATE) { | |
1ca02e8b | 114 | $this->setTitle(ts('Configure Page - %1', [1 => $title])); |
6a488035 TO |
115 | } |
116 | elseif ($this->_action == CRM_Core_Action::VIEW) { | |
1ca02e8b | 117 | $this->setTitle(ts('Preview Page - %1', [1 => $title])); |
6a488035 TO |
118 | } |
119 | elseif ($this->_action == CRM_Core_Action::DELETE) { | |
1ca02e8b | 120 | $this->setTitle(ts('Delete Page - %1', [1 => $title])); |
6a488035 TO |
121 | } |
122 | ||
123 | //cache values. | |
124 | $this->_values = $this->get('values'); | |
125 | if (!is_array($this->_values)) { | |
be2fb01f | 126 | $this->_values = []; |
6a488035 | 127 | if (isset($this->_id) && $this->_id) { |
be2fb01f | 128 | $params = ['id' => $this->_id]; |
6a488035 | 129 | CRM_Core_DAO::commonRetrieve('CRM_Contribute_DAO_ContributionPage', $params, $this->_values); |
c0eb40c1 | 130 | CRM_Contribute_BAO_ContributionPage::setValues($this->_id, $this->_values); |
6a488035 TO |
131 | } |
132 | $this->set('values', $this->_values); | |
133 | } | |
c50f55b5 | 134 | |
bb08e888 | 135 | // Check permission to edit contribution page |
66af7c48 | 136 | if (CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus() && $this->_action & CRM_Core_Action::UPDATE) { |
bb08e888 E |
137 | $financialTypeID = CRM_Contribute_PseudoConstant::financialType($this->_values['financial_type_id']); |
138 | if (!CRM_Core_Permission::check('edit contributions of type ' . $financialTypeID)) { | |
beb414cc | 139 | CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.')); |
bb08e888 E |
140 | } |
141 | } | |
142 | ||
c50f55b5 | 143 | // Preload libraries required by the "Profiles" tab |
be2fb01f | 144 | $schemas = ['IndividualModel', 'OrganizationModel', 'ContributionModel']; |
166a1708 | 145 | if (CRM_Core_Component::isEnabled('CiviMember')) { |
c50f55b5 CW |
146 | $schemas[] = 'MembershipModel'; |
147 | } | |
148 | CRM_UF_Page_ProfileEditor::registerProfileScripts(); | |
149 | CRM_UF_Page_ProfileEditor::registerSchemas($schemas); | |
6a488035 TO |
150 | } |
151 | ||
152 | /** | |
fe482240 | 153 | * Build the form object. |
6a488035 TO |
154 | */ |
155 | public function buildQuickForm() { | |
156 | $this->applyFilter('__ALL__', 'trim'); | |
157 | ||
158 | $session = CRM_Core_Session::singleton(); | |
9c1bc317 | 159 | $this->_cancelURL = $_POST['cancelURL'] ?? NULL; |
6a488035 TO |
160 | |
161 | if (!$this->_cancelURL) { | |
162 | $this->_cancelURL = CRM_Utils_System::url('civicrm/admin/contribute', 'reset=1'); | |
163 | } | |
164 | ||
165 | if ($this->_cancelURL) { | |
166 | $this->addElement('hidden', 'cancelURL', $this->_cancelURL); | |
167 | } | |
168 | ||
6a488035 | 169 | if ($this->_single) { |
be2fb01f CW |
170 | $buttons = [ |
171 | [ | |
5fe87df6 N |
172 | 'type' => 'next', |
173 | 'name' => ts('Save'), | |
174 | 'spacing' => ' ', | |
175 | 'isDefault' => TRUE, | |
be2fb01f CW |
176 | ], |
177 | [ | |
5fe87df6 N |
178 | 'type' => 'upload', |
179 | 'name' => ts('Save and Done'), | |
180 | 'spacing' => ' ', | |
181 | 'subName' => 'done', | |
be2fb01f CW |
182 | ], |
183 | ]; | |
5fe87df6 | 184 | if (!$this->_last) { |
be2fb01f | 185 | $buttons[] = [ |
5fe87df6 N |
186 | 'type' => 'submit', |
187 | 'name' => ts('Save and Next'), | |
188 | 'spacing' => ' ', | |
189 | 'subName' => 'savenext', | |
be2fb01f | 190 | ]; |
5fe87df6 | 191 | } |
be2fb01f | 192 | $buttons[] = [ |
5fe87df6 N |
193 | 'type' => 'cancel', |
194 | 'name' => ts('Cancel'), | |
be2fb01f | 195 | ]; |
5fe87df6 | 196 | $this->addButtons($buttons); |
6a488035 TO |
197 | } |
198 | else { | |
be2fb01f | 199 | $buttons = []; |
6a488035 | 200 | if (!$this->_first) { |
be2fb01f | 201 | $buttons[] = [ |
6a488035 | 202 | 'type' => 'back', |
f212d37d | 203 | 'name' => ts('Previous'), |
6a488035 | 204 | 'spacing' => ' ', |
be2fb01f | 205 | ]; |
6a488035 | 206 | } |
be2fb01f | 207 | $buttons[] = [ |
6a488035 | 208 | 'type' => 'next', |
f212d37d | 209 | 'name' => ts('Continue'), |
6a488035 TO |
210 | 'spacing' => ' ', |
211 | 'isDefault' => TRUE, | |
be2fb01f CW |
212 | ]; |
213 | $buttons[] = [ | |
6a488035 TO |
214 | 'type' => 'cancel', |
215 | 'name' => ts('Cancel'), | |
be2fb01f | 216 | ]; |
6a488035 TO |
217 | |
218 | $this->addButtons($buttons); | |
219 | } | |
220 | ||
221 | $session->replaceUserContext($this->_cancelURL); | |
133e2c99 | 222 | |
1ebebaab AH |
223 | // don't show option for contribution amounts section if membership price set |
224 | // this flag is sent to template | |
133e2c99 | 225 | |
1ebebaab AH |
226 | $membershipBlock = new CRM_Member_DAO_MembershipBlock(); |
227 | $membershipBlock->entity_table = 'civicrm_contribution_page'; | |
228 | $membershipBlock->entity_id = $this->_id; | |
229 | $membershipBlock->is_active = 1; | |
230 | $hasMembershipBlk = FALSE; | |
133e2c99 | 231 | if ($membershipBlock->find(TRUE) && |
1ebebaab AH |
232 | ($setID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, NULL, 1)) |
233 | ) { | |
234 | $extends = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'extends'); | |
235 | if ($extends && $extends == CRM_Core_Component::getComponentID('CiviMember')) { | |
236 | $hasMembershipBlk = TRUE; | |
237 | } | |
238 | } | |
239 | // set value in DOM that membership price set exists | |
be2fb01f | 240 | CRM_Core_Resources::singleton()->addSetting(['memberPriceset' => $hasMembershipBlk]); |
6a488035 TO |
241 | } |
242 | ||
243 | /** | |
c490a46a | 244 | * Set default values for the form. Note that in edit/view mode |
6a488035 TO |
245 | * the default values are retrieved from the database |
246 | * | |
6a488035 | 247 | * |
a6c01b45 CW |
248 | * @return array |
249 | * defaults | |
6a488035 | 250 | */ |
00be9182 | 251 | public function setDefaultValues() { |
6a488035 TO |
252 | //some child classes calling setdefaults directly w/o preprocess. |
253 | $this->_values = $this->get('values'); | |
254 | if (!is_array($this->_values)) { | |
be2fb01f | 255 | $this->_values = []; |
6a488035 | 256 | if (isset($this->_id) && $this->_id) { |
be2fb01f | 257 | $params = ['id' => $this->_id]; |
6a488035 TO |
258 | CRM_Core_DAO::commonRetrieve('CRM_Contribute_DAO_ContributionPage', $params, $this->_values); |
259 | } | |
260 | $this->set('values', $this->_values); | |
261 | } | |
262 | $defaults = $this->_values; | |
263 | ||
264 | $config = CRM_Core_Config::singleton(); | |
265 | if (isset($this->_id)) { | |
266 | ||
267 | //set defaults for pledgeBlock values. | |
be2fb01f | 268 | $pledgeBlockParams = [ |
6a488035 | 269 | 'entity_id' => $this->_id, |
671f71f8 | 270 | 'entity_table' => 'civicrm_contribution_page', |
be2fb01f CW |
271 | ]; |
272 | $pledgeBlockDefaults = []; | |
6a488035 TO |
273 | CRM_Pledge_BAO_PledgeBlock::retrieve($pledgeBlockParams, $pledgeBlockDefaults); |
274 | if ($this->_pledgeBlockID = CRM_Utils_Array::value('id', $pledgeBlockDefaults)) { | |
275 | $defaults['is_pledge_active'] = TRUE; | |
276 | } | |
be2fb01f | 277 | $pledgeBlock = [ |
353ffa53 TO |
278 | 'is_pledge_interval', |
279 | 'max_reminders', | |
280 | 'initial_reminder_day', | |
281 | 'additional_reminder_day', | |
dccd9f4f ERL |
282 | 'pledge_start_date', |
283 | 'is_pledge_start_date_visible', | |
284 | 'is_pledge_start_date_editable', | |
be2fb01f | 285 | ]; |
6a488035 | 286 | foreach ($pledgeBlock as $key) { |
9c1bc317 | 287 | $defaults[$key] = $pledgeBlockDefaults[$key] ?? NULL; |
de6c59ca | 288 | if ($key == 'pledge_start_date' && !empty($pledgeBlockDefaults[$key])) { |
dccd9f4f | 289 | $defaultPledgeDate = (array) json_decode($pledgeBlockDefaults['pledge_start_date']); |
be2fb01f | 290 | $pledgeDateFields = [ |
dccd9f4f ERL |
291 | 'pledge_calendar_date' => 'calendar_date', |
292 | 'pledge_calendar_month' => 'calendar_month', | |
be2fb01f | 293 | ]; |
dccd9f4f ERL |
294 | $defaults['pledge_default_toggle'] = key($defaultPledgeDate); |
295 | foreach ($pledgeDateFields as $key => $value) { | |
296 | if (array_key_exists($value, $defaultPledgeDate)) { | |
297 | $defaults[$key] = reset($defaultPledgeDate); | |
298 | $this->assign($key, reset($defaultPledgeDate)); | |
299 | } | |
300 | } | |
301 | } | |
6a488035 | 302 | } |
a7488080 | 303 | if (!empty($pledgeBlockDefaults['pledge_frequency_unit'])) { |
6a488035 | 304 | $defaults['pledge_frequency_unit'] = array_fill_keys(explode(CRM_Core_DAO::VALUE_SEPARATOR, |
353ffa53 TO |
305 | $pledgeBlockDefaults['pledge_frequency_unit'] |
306 | ), '1'); | |
6a488035 TO |
307 | } |
308 | ||
309 | // fix the display of the monetary value, CRM-4038 | |
310 | if (isset($defaults['goal_amount'])) { | |
d90d1031 | 311 | $defaults['goal_amount'] = CRM_Utils_Money::formatLocaleNumericRoundedForDefaultCurrency($defaults['goal_amount']); |
6a488035 TO |
312 | } |
313 | ||
314 | // get price set of type contributions | |
315 | //this is the value for stored in db if price set extends contribution | |
316 | $usedFor = 2; | |
9da8dc8c | 317 | $this->_priceSetID = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, $usedFor, 1); |
6a488035 TO |
318 | if ($this->_priceSetID) { |
319 | $defaults['price_set_id'] = $this->_priceSetID; | |
320 | } | |
6a488035 TO |
321 | } |
322 | else { | |
323 | $defaults['is_active'] = 1; | |
324 | // set current date as start date | |
e843748f | 325 | // @todo look to change to $defaults['start_date'] = date('Ymd His'); |
326 | // main settings form overrides this to implement above but this is left here | |
327 | // 'in case' another extending form uses start_date - for now | |
b59a905f | 328 | $defaults['start_date'] = date('Y-m-d H:i:s'); |
6a488035 TO |
329 | } |
330 | ||
a7488080 | 331 | if (!empty($defaults['recur_frequency_unit'])) { |
6a488035 | 332 | $defaults['recur_frequency_unit'] = array_fill_keys(explode(CRM_Core_DAO::VALUE_SEPARATOR, |
353ffa53 TO |
333 | $defaults['recur_frequency_unit'] |
334 | ), '1'); | |
6a488035 TO |
335 | } |
336 | else { | |
09fbb309 | 337 | // CRM-10860 |
be2fb01f | 338 | $defaults['recur_frequency_unit'] = ['month' => 1]; |
6a488035 TO |
339 | } |
340 | ||
6a488035 TO |
341 | // confirm page starts out enabled |
342 | if (!isset($defaults['is_confirm_enabled'])) { | |
343 | $defaults['is_confirm_enabled'] = 1; | |
344 | } | |
345 | ||
346 | return $defaults; | |
347 | } | |
348 | ||
349 | /** | |
fe482240 | 350 | * Process the form. |
6a488035 TO |
351 | */ |
352 | public function postProcess() { | |
353 | $pageId = $this->get('id'); | |
354 | //page is newly created. | |
355 | if ($pageId && !$this->_id) { | |
356 | $session = CRM_Core_Session::singleton(); | |
357 | $session->pushUserContext(CRM_Utils_System::url('civicrm/admin/contribute', 'reset=1')); | |
358 | } | |
359 | } | |
360 | ||
00be9182 | 361 | public function endPostProcess() { |
6a488035 TO |
362 | // make submit buttons keep the current working tab opened, or save and next tab |
363 | if ($this->_action & CRM_Core_Action::UPDATE) { | |
364 | $className = CRM_Utils_String::getClassName($this->_name); | |
365 | ||
366 | //retrieve list of pages from StateMachine and find next page | |
367 | //this is quite painful because StateMachine is full of protected variables | |
368 | //so we have to retrieve all pages, find current page, and then retrieve next | |
369 | $stateMachine = new CRM_Contribute_StateMachine_ContributionPage($this); | |
353ffa53 TO |
370 | $states = $stateMachine->getStates(); |
371 | $statesList = array_keys($states); | |
372 | $currKey = array_search($className, $statesList); | |
373 | $nextPage = (array_key_exists($currKey + 1, $statesList)) ? $statesList[$currKey + 1] : ''; | |
6a488035 TO |
374 | |
375 | //unfortunately, some classes don't map to subpage names, so we alter the exceptions | |
376 | ||
377 | switch ($className) { | |
378 | case 'Contribute': | |
353ffa53 | 379 | $attributes = $this->getVar('_attributes'); |
b90552b7 | 380 | $subPage = CRM_Utils_Request::retrieveComponent($attributes); |
6a488035 TO |
381 | if ($subPage == 'friend') { |
382 | $nextPage = 'custom'; | |
383 | } | |
384 | else { | |
385 | $nextPage = 'settings'; | |
386 | } | |
387 | break; | |
388 | ||
389 | case 'MembershipBlock': | |
353ffa53 | 390 | $subPage = 'membership'; |
353ffa53 | 391 | $nextPage = 'thankyou'; |
6a488035 TO |
392 | break; |
393 | ||
d2539131 EL |
394 | case 'Widget': |
395 | $subPage = 'widget'; | |
396 | $nextPage = 'pcp'; | |
397 | break; | |
398 | ||
6a488035 | 399 | default: |
353ffa53 | 400 | $subPage = strtolower($className); |
353ffa53 | 401 | $nextPage = strtolower($nextPage); |
6a488035 TO |
402 | |
403 | if ($subPage == 'amount') { | |
404 | $nextPage = 'membership'; | |
405 | } | |
406 | elseif ($subPage == 'thankyou') { | |
407 | $nextPage = 'friend'; | |
408 | } | |
409 | break; | |
410 | } | |
411 | ||
412 | CRM_Core_Session::setStatus(ts("'%1' information has been saved.", | |
be2fb01f | 413 | [1 => CRM_Utils_Array::value('title', CRM_Utils_Array::value($subPage, $this->get('tabHeader')), $className)] |
1ca02e8b | 414 | ), $this->getTitle(), 'success'); |
6a488035 TO |
415 | |
416 | $this->postProcessHook(); | |
417 | ||
418 | if ($this->controller->getButtonName('submit') == "_qf_{$className}_next") { | |
419 | CRM_Utils_System::redirect(CRM_Utils_System::url("civicrm/admin/contribute/{$subPage}", | |
353ffa53 TO |
420 | "action=update&reset=1&id={$this->_id}" |
421 | )); | |
6a488035 TO |
422 | } |
423 | elseif ($this->controller->getButtonName('submit') == "_qf_{$className}_submit_savenext") { | |
424 | if ($nextPage) { | |
425 | CRM_Utils_System::redirect(CRM_Utils_System::url("civicrm/admin/contribute/{$nextPage}", | |
353ffa53 TO |
426 | "action=update&reset=1&id={$this->_id}" |
427 | )); | |
6a488035 TO |
428 | } |
429 | else { | |
430 | CRM_Utils_System::redirect(CRM_Utils_System::url("civicrm/admin/contribute", | |
353ffa53 TO |
431 | "reset=1" |
432 | )); | |
6a488035 TO |
433 | } |
434 | } | |
435 | else { | |
436 | CRM_Utils_System::redirect(CRM_Utils_System::url("civicrm/admin/contribute", 'reset=1')); | |
437 | } | |
438 | } | |
439 | } | |
440 | ||
186c9c17 | 441 | /** |
fe482240 | 442 | * Use the form name to create the tpl file name. |
186c9c17 EM |
443 | * |
444 | * @return string | |
186c9c17 | 445 | */ |
1330f57a | 446 | |
186c9c17 EM |
447 | /** |
448 | * @return string | |
449 | */ | |
00be9182 | 450 | public function getTemplateFileName() { |
cc4f2812 | 451 | if ($this->controller->getPrint() || $this->getVar('_id') <= 0 || |
6a488035 TO |
452 | ($this->_action & CRM_Core_Action::DELETE) || |
453 | (CRM_Utils_String::getClassName($this->_name) == 'AddProduct') | |
454 | ) { | |
455 | return parent::getTemplateFileName(); | |
456 | } | |
457 | else { | |
458 | // hack lets suppress the form rendering for now | |
459 | self::$_template->assign('isForm', FALSE); | |
460 | return 'CRM/Contribute/Form/ContributionPage/Tab.tpl'; | |
461 | } | |
462 | } | |
96025800 | 463 | |
6a488035 | 464 | } |