123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- <?php
- /**
- * @file
- * Functions for uc_earlybird module.
- */
- /**
- * Implements hook_line_item().
- */
- function uc_earlybird_uc_line_item() {
- $items[] = array(
- 'id' => 'earlybird',
- 'title' => t('Early bird discount'),
- 'default' => FALSE,
- 'stored' => TRUE,
- 'calculated' => TRUE,
- 'add_list' => TRUE,
- 'display_only' => FALSE,
- );
- return $items;
- }
- /**
- * Implements hook_form_alter().
- *
- * Add the discount form to the node edit form, under product settings.
- *
- * Alter the cart form to show the discount.
- */
- function uc_earlybird_form_alter(&$form, &$form_state, $form_id) {
- if (strpos($form_id, '_node_form') !== FALSE) {
- $product_types = uc_product_types();
- if (in_array($form['#node']->type, $product_types)) {
- $node = $form['#node'];
- $form['base']['earlybird'] = array(
- '#title' => t('Early bird discount'),
- '#type' => 'fieldset',
- '#weight' => $form['base']['dimensions']['#weight'] + 1,
- );
- $form['base']['earlybird']['earlybird_date'] = array(
- '#title' => 'Discounted on or before',
- '#type' => 'date',
- );
- if (isset($node->earlybird)) {
- $form['base']['earlybird']['earlybird_date']['#default_value'] = array(
- 'year' => date('Y', $node->earlybird['date']),
- 'month' => date('n', $node->earlybird['date']),
- 'day' => date('j', $node->earlybird['date']),
- );
- }
- $form['base']['earlybird']['earlybird_discount'] = array(
- '#title' => 'Discount amount',
- '#type' => 'textfield',
- '#size' => 3,
- '#description' => 'Enter in a dollar amount or percentage, e.g., 5% or 10',
- '#default_value' => isset($node->earlybird) ? $node->earlybird['discount'] : NULL,
- );
- }
- }
- if ($form_id == 'uc_cart_view_form') {
- foreach ($form['items'] as $key => &$val) {
- if (is_numeric($key)) {
- if (isset($val['nid'])) {
- $sql = "select * from {uc_earlybird} where nid = :nid";
- $result = db_query($sql, array(':nid' => $val['nid']['#value']));
- if ($earlybird = $result->fetchObject()) {
- if ($earlybird->date >= REQUEST_TIME && intval($earlybird->discount) > 0) {
- $discount = _uc_earlybird_discount_text($earlybird->discount, $val['#entity']->qty);
- $discountText = array(
- t('Early bird: !discount off at checkout', array('!discount' => $discount)),
- );
- $val['desc']['#markup'] .= theme('item_list', array(
- 'items' => $discountText,
- 'title' => NULL,
- 'type' => 'ul',
- 'attributes' => array('class' => 'uc-earlybird-teaser'),
- ));
- }
- }
- }
- }
- }
- }
- }
- /**
- * Implements hook_node_load().
- *
- * Load discount information to the node.
- */
- function uc_earlybird_node_load($nodes, $types) {
- $sql = 'select * from {uc_earlybird} where nid IN (:nids)';
- $result = db_query($sql, array(':nids' => array_keys($nodes)));
- while ($row = $result->fetchAssoc()) {
- $nodes[$row['nid']]->earlybird = $row;
- }
- }
- /**
- * Implements hook_node_insert().
- *
- * Update discount information.
- */
- function uc_earlybird_node_insert($node) {
- uc_earlybird_node_update($node);
- }
- /**
- * Implements hook_node_update().
- */
- function uc_earlybird_node_update($node) {
- if (isset($node->earlybird_discount)) {
- // Insert/update the product's discount.
- extract($node->earlybird_date);
- $date = mktime(23, 59, 59, $month, $day, $year);
- if (strpos($node->earlybird_discount, '%') !== FALSE) {
- $discount = floatval($node->earlybird_discount) . '%';
- }
- else {
- $discount = floatval($node->earlybird_discount);
- }
- if (db_query('select 1 from {uc_earlybird} where nid = :nid', array(':nid' => $node->nid))->fetchField()) {
- // Node already has earlybird data.
- $update = array('nid');
- }
- else {
- $update = array();
- }
- $earlybird->nid = $node->nid;
- $earlybird->date = $date;
- $earlybird->discount = $discount;
- drupal_write_record('uc_earlybird', $earlybird, $update);
- }
- }
- /**
- * Implements hook_add_to_cart().
- *
- * Check time and show notification.
- */
- function uc_earlybird_uc_add_to_cart($nid, $qty, $data) {
- $result = db_query('select node.title, eb.* from {uc_earlybird} eb
- inner join {node} node on node.nid = eb.nid
- where eb.nid = :nid', array(':nid' => $nid));
- if ($earlybird = $result->fetchObject()) {
- if (REQUEST_TIME <= $earlybird->date) {
- if (intval($earlybird->discount) > 0) {
- $discount_text = _uc_earlybird_discount_text($earlybird->discount, $qty);
- drupal_set_message(t('You will receive a discount of %discount when you checkout %title.', array('%title' => $earlybird->title, '%discount' => $discount_text)));
- }
- }
- }
- }
- /**
- * Display discount properly.
- */
- function _uc_earlybird_discount_text($discount, $qty = 1) {
- if (strpos($discount, '%') !== FALSE) {
- }
- else {
- $discount *= $qty;
- $discount = uc_currency_format($discount);
- }
- return $discount;
- }
- /**
- * Calculate early bird discount for a product. Check time.
- */
- function _uc_earlybird_calculate_discount($product) {
- $result = db_query('select * from {uc_earlybird} where nid = :nid', array(':nid' => $product->nid));
- if ($earlybird = $result->fetchObject()) {
- if (REQUEST_TIME <= $earlybird->date) {
- if (strpos($earlybird->discount, '%') !== FALSE) {
- return - (floatval($earlybird->discount) / 100 * $product->price);
- }
- else {
- return - (floatval($earlybird->discount));
- }
- }
- }
- }
- /**
- * Implements hook_order().
- *
- * Adds the line item discount for earlybird discounts.
- */
- function uc_earlybird_uc_order($op, &$arg1, $arg2) {
- if ($op == 'save') {
- $type = 'earlybird';
- foreach ($arg1->line_items as $key => $line_item) {
- if ($line_item['type'] == $type) {
- uc_order_delete_line_item($line_item['line_item_id']);
- }
- }
- db_delete('uc_order_line_items')
- ->condition('order_id', $arg1->order_id)
- ->condition('type', $key)
- ->execute();
- $discount = 0;
- $numDiscounts = 0;
- foreach ($arg1->products as $product) {
- $discount = _uc_earlybird_calculate_discount($product);
- if ($discount < 0) {
- uc_order_line_item_add($arg1->order_id, $type, 'Early bird discount', $discount * $product->qty, NULL, NULL);
- }
- }
- }
- }
|