PageRenderTime 64ms CodeModel.GetById 36ms RepoModel.GetById 1ms app.codeStats 0ms

/sites/all/modules/crowdfunding/src/FormControllers/PledgeSelection.php

https://gitlab.com/bossagna/meik
PHP | 167 lines | 134 code | 30 blank | 3 comment | 12 complexity | 3020289b483d16b7aeeed7e147ca6861 MD5 | raw file
  1. <?php
  2. namespace Drupal\crowdfunding\FormControllers;
  3. class PledgeSelection extends \Drupal\cool\BaseForm {
  4. static private $order;
  5. static private $order_wrapper;
  6. /**
  7. * @var \Drupal\crowdfunding\Model\Project
  8. */
  9. static private $Project;
  10. static public function getId() {
  11. return 'crowdfunding_backing_selection_form';
  12. }
  13. static public function build() {
  14. $form = parent::build();
  15. $args = func_get_args();
  16. $project_id = $args[2];
  17. self::$Project = \Drupal\crowdfunding\Model\Project::create($project_id);
  18. drupal_set_title(self::$Project->getTitle());
  19. $form['#prefix'] = t('project by ') . theme('username', array('account' => self::$Project->getAuthor()))
  20. . ' / ' . t('back to ') . l(t('project page'), 'node/' . $project_id);
  21. $pre_selected_option = arg(3);
  22. $reward_options = array();
  23. foreach (self::$Project->getRewardOptions() as $Reward) {
  24. $price = $Reward->getPrice();
  25. $reward_options[$price['amount']] = array(
  26. 'product_id' => $Reward->getIdentifier(),
  27. 'price' => commerce_currency_amount_to_decimal($price['amount'], $price['currency_code']),
  28. 'text' => $Reward->getText()
  29. );
  30. if (!empty($pre_selected_option) && $pre_selected_option == $Reward->getIdentifier()) {
  31. $default_reward_option = $Reward->getIdentifier();
  32. $pledge_default_value = commerce_currency_amount_to_decimal($price['amount'], $price['currency_code']);
  33. }
  34. }
  35. ksort($reward_options);
  36. $sorted_reward_options = array();
  37. $reward = self::$Project->getPledgeWithoutRewardProduct();
  38. $sorted_reward_options[$reward] = t('No thanks, I just want to help the project.');
  39. if (!empty($pre_selected_option) && $pre_selected_option == $reward) {
  40. $default_reward_option = $reward;
  41. }
  42. foreach ($reward_options as $reward) {
  43. $sorted_reward_options[$reward['product_id']] = $reward['price'] . '+';
  44. }
  45. $form['project_nid'] = array(
  46. '#type' => 'hidden',
  47. '#value' => arg(2)
  48. );
  49. $minimum_pledge = commerce_currency_format(1000, commerce_default_currency());
  50. $form['pledge'] = array(
  51. '#type' => 'textfield',
  52. '#title' => t('Enter your pledge amount'),
  53. '#description' => t("It's up to you. Any amount of @minimum or more.", array('@minimum' => $minimum_pledge)),
  54. '#default_value' => !empty($pledge_default_value) ? $pledge_default_value : '',
  55. );
  56. $form['reward'] = array(
  57. '#type' => 'radios',
  58. '#title' => t('Select your reward'),
  59. '#options' => $sorted_reward_options,
  60. '#default_value' => !empty($default_reward_option) ? $default_reward_option : 0,
  61. );
  62. foreach ($reward_options as $reward) {
  63. $form['reward'][$reward['product_id']]['#attributes'] = array(
  64. 'data-product-id' => $reward['product_id'],
  65. 'data-text' => json_encode($reward['text'])
  66. );
  67. }
  68. return $form;
  69. }
  70. public static function validate($form, &$form_state) {
  71. }
  72. public static function submit($form, &$form_state) {
  73. try {
  74. $_SESSION['crowdfunding']['project_nid_current_contribution'] = $form_state['values']['project_nid'];
  75. global $user;
  76. self::createBackingOrder($user->uid, arg(2));
  77. $pledge_amount = self::formatPledgeAmount(
  78. $form_state['values']['pledge']
  79. );
  80. $Reward = \Drupal\crowdfunding\Model\Reward::create($form_state['values']['reward']);
  81. $price = $Reward->getPrice();
  82. $reward_price = $price['amount'];
  83. if ($pledge_amount > $reward_price) {
  84. self::addPledge($form_state['values']['reward'], $pledge_amount);
  85. }
  86. else {
  87. self::addPledge($form_state['values']['reward'], $reward_price);
  88. }
  89. self::save();
  90. self::redirectToCheckout();
  91. } catch (\Exception $e) {
  92. watchdog('fatal_error', 'Error on addPledge: ' . $e->getMessage());
  93. drupal_set_message(t(CROWDFUNDING_DEFAULT_ERROR_MESSAGE), 'error');
  94. return FALSE;
  95. }
  96. }
  97. private static function formatPledgeAmount($amount) {
  98. $pledge_amount = str_replace(',', '.', $amount);
  99. $dots = [];
  100. $lastPos = 0;
  101. while (($lastPos = strpos($pledge_amount, '.', $lastPos)) !== FALSE) {
  102. $dots[] = $lastPos;
  103. $lastPos = $lastPos + strlen('.');
  104. }
  105. if (count($dots) === 0) {
  106. $pledge_amount = number_format($pledge_amount, 2, '.', '');
  107. }
  108. else {
  109. for ($i = 0; $i < count($dots) - 1; $i++) {
  110. $pledge_amount = substr($pledge_amount, 0, ($dots[$i] - $i))
  111. . substr($pledge_amount, $dots[$i] - $i + 1);
  112. }
  113. };
  114. return $pledge_amount * 100;
  115. }
  116. private static function createBackingOrder($uid, $project_id, $status = 'checkout_checkout') {
  117. self::$order = commerce_order_new($uid, $status);
  118. self::$order_wrapper = entity_metadata_wrapper('commerce_order', self::$order);
  119. self::$order_wrapper->field_crowdfunding_project_ref = node_load($project_id);
  120. }
  121. public static function addPledge($product_id, $price = NULL) {
  122. $product = commerce_product_load($product_id);
  123. $line_item = commerce_product_line_item_new($product, 1, self::$order->order_id, array(), 'crowdfunding_pledge');
  124. $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
  125. $line_item_wrapper->field_pledged_amount->amount = $price;
  126. $line_item_wrapper->commerce_unit_price->amount = $price;
  127. $line_item_wrapper->commerce_total->amount = $price;
  128. $line_item_wrapper->save();
  129. self::$order_wrapper->commerce_line_items[] = $line_item;
  130. }
  131. public static function save() {
  132. return self::$order_wrapper->save();
  133. }
  134. public static function redirectToCheckout() {
  135. drupal_goto('checkout/' . self::$order->order_id . '/checkout');
  136. }
  137. }