--- 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',
);