--- donation.module.orig 2009-07-18 23:58:21.000000000 +0200 +++ donation.module 2009-09-25 15:01:14.423828100 +0200 @@ -34,6 +34,12 @@ define ('DONATION_PAGE_TITLE', define ('DONATION_DEFAULT_PAGE_TITLE', t('Donate')); define ('DONATION_DEFAULT_EMAIL', t('webmaster@localhost')); define ('DONATION_UPDATE_DONATIONS_THERMOMETER', 'donation_update_donations_thermometer'); +define ('DONATION_CONTENT_TYPE', 'donations_content_type'); +define ('DONATION_CONTENT_TYPE_DEFAULT', 'donation_target'); +define ('DONATION_TARGET_TEXT', 'donations_content_type_text'); +define ('DONATION_TARGET_DEFAULT_TEXT', 'Please choose the project you want to support'); +define ('DONATION_GENERIC_TEXT', 'donations_generic_text'); +define ('DONATION_GENERIC_DEFAULT_TEXT', 'Make a generic donation'); /** * Implementation of hook_perm(). @@ -115,6 +121,13 @@ function donation_menu() { 'type' => MENU_CALLBACK, 'access callback' => TRUE, ); + $items['donate/%'] = array( + 'title' => variable_get(DONATION_PAGE_TITLE, DONATION_DEFAULT_PAGE_TITLE), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('donation_form_build', 1), + 'type' => MENU_CALLBACK, + 'access callback' => TRUE, + ); $items['hiddendonations'] = array( 'title' => 'Donations', 'page callback' => 'donation_public_page', @@ -491,16 +504,23 @@ function donation_admin() { print theme('page', $output); } -function donation_public_page() { +function donation_get_list($nid = NULL) { + $html = ''; + $rows = array(); $header = array( array('data' => t('Name'), 'field' => 'name'), array('data' => t('Amount'), 'field' => 'amount'), array('data' => t('Date'), 'field' => 'timestamp', 'sort' => 'desc'), ); - - $sql = 'SELECT d.* FROM {donations} d WHERE d.status = %d'. tablesort_sql($header); - $result = pager_query($sql, DONATION_PAGER, 0, NULL, DONATION_PUBLIC); + + if (!$nid) { + $sql = 'SELECT d.* FROM {donations} d WHERE d.status = %d'. tablesort_sql($header); + $result = pager_query($sql, DONATION_PAGER, 0, NULL, DONATION_PUBLIC); + } else { + $sql = 'SELECT d.* FROM {donations} d WHERE d.status = %d AND d.nid = %d'. tablesort_sql($header); + $result = pager_query($sql, DONATION_PAGER, 0, NULL, DONATION_PUBLIC, $nid); + } while ($donation = db_fetch_object($result)) { if ($donation->uid) { @@ -516,10 +536,17 @@ function donation_public_page() { simple_paypal_format_amount($donation->amount, $donation->currency), t('%time ago', array('%time' => format_interval(time() - $donation->timestamp, 1)))); } + + $html .= theme('table', $header, $rows); + $html .= theme('pager', NULL, DONATION_PAGER, 0); + + return $html; +} +function donation_public_page() { $output = variable_get(DONATION_DONORS_TEXT, DONATION_DONORS_DEFAULT_TEXT); $output .= theme('table', $header, $rows); - $output .= theme('pager', NULL, DONATION_PAGER, 0); + $output .= donation_get_list(); print theme('page', $output); } @@ -531,32 +558,57 @@ function donation_ipn() { // Verify that the request came from Paypal, and not from some intrusion if (!simple_paypal_ipn_verify($_POST)) { // curl verification failed + watchdog('donation', 'curl verification failed'); return; } - if ($_POST['business'] != variable_get(DONATION_EMAIL, DONATION_DEFAULT_EMAIL)) { + $receiver = $_POST['business']; + if ($receiver == '') { + $receiver = $_POST['receiver_email']; + } + + if ($receiver != variable_get(DONATION_EMAIL, DONATION_DEFAULT_EMAIL)) { // Payment is not for the email address configured - return; + watchdog('donation', 'Donation was not considered: Payment is not for the email address configured'); + return; } // Format the fields - $name = check_plain($_POST['first_name'] .' '. $_POST['last_name'] . ($_POST['payer_business_name'] ? ' ('. $_POST['payer_business_name'] .')' : '')); + $name = check_plain($_POST['first_name'] .' '. $_POST['last_name'] . ($_POST['payer_business_name'] ? ' ('. $_POST['payer_business_name'] .')' : '')); $amount = check_plain((float)$_POST['mc_gross'] - (float)$_POST['mc_fee']); + $fee = check_plain($_POST['mc_fee']); $timestamp = check_plain(strtotime($_POST['payment_date'])); $payer_email = check_plain($_POST['payer_email']); $currency = check_plain($_POST['mc_currency']); $uid = check_plain($_POST['custom']); $uid = $uid ? $uid : donation_resolve_uid($mail); + $memo = check_plain($_POST['item_name']); + $nid = 0; + + $pattern = '/\[PROJECT:(.*)\]/'; + preg_match($pattern, $memo, $matches); + if (count($matches) > 0) { + $memo = trim(str_replace($matches[0], '', $zeichenkette)); + $nid = $matches[1]; + } + // Record the donation in the database - db_query("INSERT INTO {donations} (timestamp, uid, name, mail, amount, currency, status) VALUES - (%d, %d, '%s', '%s', '%s', '%s', %d)", + db_query("INSERT INTO {donations} (timestamp, uid, name, mail, amount, fee, currency, status, donor_memo, nid) VALUES + (%d, %d, '%s', '%s', '%s', '%s', '%s', %d, '%s', '%d')", $timestamp, $uid, $name, $payer_email, $amount, + $fee, $currency, - variable_get(DONATION_STATE, DONATION_PUBLIC)); + variable_get(DONATION_STATE, DONATION_PUBLIC), + $memo, + $nid); + $did = db_last_insert_id('donations', 'did'); + $res = db_query('SELECT * FROM {donations} WHERE did=%d', $did); + $donation = db_fetch_object($res); + donation_update_donation_thermometer_amount(); watchdog('donation', 'Donation from @name (@mail) amount of @amount @currency.', array( '@name' => $name, @@ -564,6 +616,8 @@ function donation_ipn() { '@amount' => $amount, '@currency' => $currency, )); + + module_invoke_all('donation_received', $donation); } /** @@ -573,12 +627,34 @@ function donation_form() { return drupal_get_form('donation_form_build'); } -function donation_form_build() { +function donation_form_build($form_data, $nid = null) { global $user; + + $memo_text = variable_get(DONATION_MEMO_TEXT, DONATION_MEMO_DEFAULT_TEXT); + $donation_message = t(variable_get(DONATION_DONATE_MESSAGE, DONATION_DONATE_MESSAGE_DEFAULT_TEXT)); + if ($nid != null) { + $res = db_query('SELECT nid, title FROM {node} WHERE type=\'%s\' AND nid=%d', variable_get(DONATION_CONTENT_TYPE, DONATION_CONTENT_TYPE_DEFAULT), $nid); + if ($node = db_fetch_object($res)) { + $memo_text .= ' [PROJECT:' . $node->nid . ']'; + $donation_message .= '

' . t('Target') . ': ' . $node->title; + } else { + + $nid = null; + } + } + + if ($nid==null) { + $memo = variable_get(DONATION_MEMO_TEXT, DONATION_MEMO_DEFAULT_TEXT); + $targets = array($memo => variable_get(DONATION_GENERIC_TEXT, DONATION_GENERIC_DEFAULT_TEXT)); + $res = db_query('SELECT nid, title FROM {node} WHERE type=\'%s\'', variable_get(DONATION_CONTENT_TYPE, DONATION_CONTENT_TYPE_DEFAULT)); + while ($node = db_fetch_object($res)) { + $targets[$memo . ' [PROJECT:' . $node->nid . ']'] = $node->title; + } + } $form['#action'] = simple_paypal_get_url(); $form['pre'] = array( - '#value' => variable_get(DONATION_DONATE_MESSAGE, DONATION_DONATE_MESSAGE_DEFAULT_TEXT)); + '#value' => $donation_message); $form['business'] = array( '#type' => 'hidden', '#name' => 'business', @@ -587,10 +663,21 @@ function donation_form_build() { '#type' => 'hidden', '#value' => '_xclick', '#name' => 'cmd'); - $form['item_name'] = array( - '#type' => 'hidden', - '#value' => variable_get(DONATION_MEMO_TEXT, DONATION_MEMO_DEFAULT_TEXT), - '#name' => 'item_name'); + + if ((count($targets) > 1) && ($nid == null)){ + $form['item_name'] = array( + '#type' => 'select', + '#name' => 'item_name', + '#options' => $targets, + '#description' => t(variable_get(DONATION_TARGET_TEXT, DONATION_TARGET_DEFAULT_TEXT)) + ); + } else { + $form['item_name'] = array( + '#type' => 'hidden', + '#value' => $memo_text, + '#name' => 'item_name' + ); + } $form['no_shipping'] = array( '#type' => 'hidden', '#value' => 1, @@ -604,16 +691,17 @@ function donation_form_build() { '#title' => t('Currency'), '#options' => simple_paypal_get_currencies(), '#name' => 'currency_code', - '#description' => variable_get(DONATION_CURRENCY_TEXT, DONATION_CURRENCY_DEFAULT_TEXT), + '#description' => t(variable_get(DONATION_CURRENCY_TEXT, DONATION_CURRENCY_DEFAULT_TEXT)), ); $form['amount'] = array( '#type' => 'textfield', '#title' => t('Amount'), - '#description' => variable_get(DONATION_AMOUNT_TEXT, DONATION_AMOUNT_DEFAULT_TEXT), + '#description' => t(variable_get(DONATION_AMOUNT_TEXT, DONATION_AMOUNT_DEFAULT_TEXT)), '#size' => 40, '#required' => TRUE, '#maxlength' => 255, '#name' => 'amount', + '#value' => '10.00', ); $form['notify_url'] = array( '#type' => 'hidden', @@ -627,7 +715,7 @@ function donation_form_build() { ); $form['submit'] = array( '#type' => 'submit', - '#value' => variable_get(DONATION_SUBMIT_TEXT, DONATION_SUBMIT_DEFAULT_TEXT), + '#value' => t(variable_get(DONATION_SUBMIT_TEXT, DONATION_SUBMIT_DEFAULT_TEXT)), '#name' => 'submit', );