From a9d5ea91238679b158feaa5cf7662be7e6eb999d Mon Sep 17 00:00:00 2001 From: Marek Isalski Date: Sun, 20 May 2018 13:39:06 +0100 Subject: [PATCH] cache cart data to speed up page loads --- fulcrm_shoppingcart.module | 103 ++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 13 deletions(-) diff --git a/fulcrm_shoppingcart.module b/fulcrm_shoppingcart.module index f7b7424..2ea0ec2 100644 --- a/fulcrm_shoppingcart.module +++ b/fulcrm_shoppingcart.module @@ -13,6 +13,9 @@ function hook_fulcrm_shoppingcart_alter_person_add( $person ) { function hook_fulcrm_shoppingcart_person_add( $person, $redirect_destination ) { } +function hook_fulcrm_shoppingcart_person_add_guest( $person, $redirect_destination ) { +} + function hook_fulcrm_shoppingcart_pre_add_to_cart( $shoppingcart, $person, $product ) { } @@ -144,12 +147,25 @@ function fulcrm_shoppingcart_theme( $existing, $type, $theme, $path ) { ); } +function fulcrm_shoppingcart_invalidate_cache() { + if ( array_key_exists( 'fulcrm_shoppingcart_id', $_SESSION ) ) { + $cid = 'fulcrm_shoppingcart:shoppingcart:' . $_SESSION[ 'fulcrm_shoppingcart_id' ]; + cache_clear_all( $cid, 'cache' ); + } +} + function fulcrm_shoppingcart_get_session_cart( $create = true ) { global $user; drupal_session_start(); if ( array_key_exists( 'fulcrm_shoppingcart_id', $_SESSION ) ) { + $cid = 'fulcrm_shoppingcart:shoppingcart:' . $_SESSION[ 'fulcrm_shoppingcart_id' ]; + + if ( $cached = cache_get( $cid, 'cache' ) ) { + return $cached->data; + } + $api_data = fulcrm_apiv2_GET( 'shoppingcart/' . $_SESSION[ 'fulcrm_shoppingcart_id' ] . '/', $query = array( 'expand' => implode( ',', array( 'shoppingitems', 'shoppingitems.d', @@ -157,11 +173,15 @@ function fulcrm_shoppingcart_get_session_cart( $create = true ) { 'shoppingitems.product' ) ) ) ); if ( $api_data[ 'success' ] ) { if ( ( $api_data[ 'data' ][ 'completed' ] === null ) && ( $api_data[ 'data' ][ 'abandoned' ] === null ) ) { + cache_set( $cid, $api_data[ 'data' ], $bin = 'cache', $expire = time() + 300 ); return $api_data[ 'data' ]; + } else { + unset( $_SESSION[ 'fulcrm_shoppingcart_id' ] ); } } else { - if ( $api_data[ 'code' ] === 404 ) + if ( $api_data[ 'code' ] === 404 ) { unset( $_SESSION[ 'fulcrm_shoppingcart_id' ] ); + } } } @@ -176,14 +196,22 @@ function fulcrm_shoppingcart_get_session_cart( $create = true ) { $cart_data = array( 'person' => $person_url, 'd' => array( 'fulcrm_testing_data' => 'this is a test' ) ); - $api_data = fulcrm_apiv2_POST( 'shoppingcart/', $cart_data ); + $api_data = fulcrm_apiv2_POST( 'shoppingcart/', $cart_data, $query = array( 'expand' => 'd' ) ); if ( $api_data[ 'success' ] ) { $_SESSION[ 'fulcrm_shoppingcart_id' ] = $api_data[ 'data' ][ 'id' ]; + $cid = 'fulcrm_shoppingcart:shoppingcart:' . $api_data[ 'data' ][ 'id' ]; + cache_set( $cid, $api_data[ 'data' ], $bin = 'cache', $expire = time() + 300 ); return $api_data[ 'data' ]; } } } +function fulcrm_shoppingcart_session_cart_count_items() { + if ( $cart_data = fulcrm_shoppingcart_get_session_cart(false) ) + return count( $cart_data[ 'shoppingitems' ] ); + return 0; +} + function fulcrm_shoppingcart_coupon_url( $transaction_id ) { $hmac = fulcrm_crypto_object_id_hmac( 'transaction', $transaction_id ); return url( 'fulcrm/checkout/coupon/' . $transaction_id . '/' . $hmac ); @@ -220,6 +248,27 @@ function fulcrm_shoppingcart_person_add_form_submit( $form, &$form_state ) { } } +function fulcrm_shoppingcart_person_add_guest_form_submit( $form, &$form_state ) { + $person_d = fulcrm_collection_form_values_to_d( 'person', $form_state[ 'values' ] ); + + $person_data = array( 'd' => $person_d ); + if ( array_key_exists( 'name', $person_d ) ) { + if ( is_array( $person_d[ 'name' ] ) ) + $person_data[ 'name' ] = $person_d[ 'name' ][ 0 ]; + elseif ( is_string( $person_d[ 'name' ] ) ) + $person_data[ 'name' ] = $person_d[ 'name' ]; + } + + $person_data[ 'uuid' ] = fulcrm_uuid_uuid4(); + + $person_data = module_invoke_all( 'fulcrm_shoppingcart_alter_person_add_guest', $person_data ); + + $api_data = fulcrm_apiv2_POST( 'person/', $person_data, $query = array( 'expand' => 'd' ) ); + if ( $api_data[ 'success' ] ) { + module_invoke_all( 'fulcrm_shoppingcart_person_add', $api_data[ 'data' ], array_key_exists( 'destination', $_GET ) ? $_GET[ 'destination' ] : variable_get( 'fulcrm_shoppingcart_proceed_url', url('') ) ); + } +} + function fulcrm_shoppingcart_person_add_form( $form, &$form_state, $collection, $destination ) { $form_state[ 'fulcrm_shoppingcart' ][ 'collection' ] = $collection; $form[ 'title_event' ] = array( '#type' => 'markup', @@ -323,6 +372,7 @@ function fulcrm_shoppingcart_buy_eventbookingtype_form_submit( $form, &$form_sta ); $api_data = fulcrm_apiv2_POST( 'shoppingitem/', $item, $query = array( 'expand' => 'd' ) ); + fulcrm_shoppingcart_invalidate_cache(); if ( $api_data[ 'success' ] ) { $hook_results = module_invoke_all( 'fulcrm_shoppingcart_post_add_to_cart', $cart, $person_data[ 'data' ], $api_data[ 'data' ] ); foreach ( $hook_results as $hook_result ) @@ -344,7 +394,16 @@ function fulcrm_shoppingcart_buy_eventbookingtype_form_submit( $form, &$form_sta function fulcrm_shoppingcart_buy_eventbookingtype_login_form_submit( $form, &$form_state ) { user_login_submit( $form, $form_state ); - $form_state[ 'redirect' ] = fulcrm_shoppingcart_buy_url( $form_state[ 'fulcrm_shoppingcart_redirect_buy_product_id' ] ); + $form_state[ 'redirect' ] = fulcrm_shoppingcart_buy_url( $form_state[ 'fulcrm_shoppingcart' ][ 'redirect_buy_product_id' ] ); +} + +function fulcrm_shoppingcart_buy_eventbookingtype_login_or_add_person_form_submit( $form, &$form_state ) { + if ( $login ) { + user_login_submit( $form, $form_state ); + $form_state[ 'redirect' ] = fulcrm_shoppingcart_buy_url( $form_state[ 'fulcrm_shoppingcart' ][ 'redirect_buy_product_id' ] ); + } elseif ( $add ) { + + } } function fulcrm_shoppingcart_buy_eventbookingtype_form( $form, &$form_state, $person, $eventbookingtype, $product ) { @@ -357,15 +416,19 @@ function fulcrm_shoppingcart_buy_eventbookingtype_form( $form, &$form_state, $pe if ( is_null( $person_id ) ) { switch ( variable_get( 'fulcrm_shoppingcart_experience', 'force' ) ) { case 'guest': - break; case 'user': + if ( user_is_anonymous() ) { + $form = user_login( $form, $form_state ); + $form_state[ 'fulcrm_shoppingcart' ][ 'redirect_buy_product_id' ] = $product[ 'id' ]; + $form[ '#submit' ][] = 'fulcrm_shoppingcart_buy_eventbookingtype_login_or_add_person_form_submit'; + } break; case 'force': if ( user_is_anonymous() ) { - drupal_set_message( t('You need to be logged in to continue shopping.'), 'error' ); + drupal_set_message( t('You need to be logged in to continue shopping.'), 'error' ); // XXX change to be on form $form = user_login( $form, $form_state ); - $form_state[ 'fulcrm_shoppingcart_redirect_buy_product_id' ] = $product[ 'id' ]; - $form['#submit'][] = 'fulcrm_shoppingcart_buy_eventbookingtype_login_form_submit'; + $form_state[ 'fulcrm_shoppingcart' ][ 'redirect_buy_product_id' ] = $product[ 'id' ]; + $form[ '#submit' ][] = 'fulcrm_shoppingcart_buy_eventbookingtype_login_form_submit'; return $form; } else { drupal_set_message( t('Sorry! There was a problem looking up your record, and this means we cannot complete this order.'), 'error' ); @@ -475,6 +538,7 @@ function fulcrm_shoppingcart_buy_generic_product_form_submit( $form, &$form_stat ), ), $query = array( 'expand' => 'd' ) ); + fulcrm_shoppingcart_invalidate_cache(); } $shoppingitem_name = ( $form_state[ 'fulcrm_shoppingcart' ][ 'product' ][ 'name' ] ); @@ -487,6 +551,7 @@ function fulcrm_shoppingcart_buy_generic_product_form_submit( $form, &$form_stat ); $api_data = fulcrm_apiv2_POST( 'shoppingitem/', $item, $query = array( 'expand' => 'd' ) ); + fulcrm_shoppingcart_invalidate_cache(); if ( $api_data[ 'success' ] ) { drupal_set_message( t('Added "%item" to shopping cart.', array( '%item' => $item[ 'd' ][ 'name' ] ) ), 'status' ); $form_state[ 'redirect' ] = 'fulcrm/cart'; @@ -538,10 +603,11 @@ function fulcrm_shoppingcart_buy( $product_id, $hmac ) { return 'error while fetching information about this product!'; } - if ( user_is_logged_in() ) + if ( user_is_logged_in() ) { $person_id = fulcrm_webhook_get_pk_for_entity_type( 'user', $user->uid, 'person' ); - else + } else { $person_id = null; + } if ( $person_id ) { $person_data = fulcrm_apiv2_GET( 'person/' . $person_id . '/', @@ -602,7 +668,7 @@ function fulcrm_shoppingcart_buy( $product_id, $hmac ) { function fulcrm_shoppingcart_remove_shoppingitem_confirm_submit( $form, &$form_state ) { $api_data = fulcrm_apiv2_DELETE( $form_state[ 'fulcrm_shoppingcart' ][ 'shoppingitem' ][ 'url' ] ); - + fulcrm_shoppingcart_invalidate_cache(); if ( $api_data[ 'success' ] ) { drupal_set_message( t('Removed "%item" from cart.', array( '%item' => ( array_key_exists( 'name', $form_state[ 'fulcrm_shoppingcart' ][ 'shoppingitem' ][ 'd' ] ) ? $form_state[ 'fulcrm_shoppingcart' ][ 'shoppingitem' ][ 'd' ][ 'name' ] : $form_state[ 'fulcrm_shoppingcart' ][ 'shoppingitem' ][ 'product' ][ 'name' ] ) ) ), 'status' ); @@ -677,8 +743,10 @@ function fulcrm_shoppingcart_coupon_form_submit( $form, &$form_state ) { $transaction_id = $form_state[ 'fulcrm_shoppingcart' ][ 'transaction_id' ]; $coupon_code = $form_state[ 'values' ][ 'coupon_code' ]; if ( $coupon_code && $transaction_id ) { - $paymentitem_data = fulcrm_apiv2_POST( 'transaction/' . $transaction_id . '/coupon/', array(), array( 'coupon_code' => $coupon_code, - 'expand' => implode( ',', array( 'd' ) ) ) ); + $paymentitem_data = fulcrm_apiv2_POST( 'transaction/' . $transaction_id . '/coupon/', + array(), + array( 'coupon_code' => $coupon_code, + 'expand' => implode( ',', array( 'd' ) ) ) ); if ( $paymentitem_data[ 'success' ] ) { if ( count( $paymentitem_data[ 'data' ] ) ) { @@ -735,6 +803,7 @@ function fulcrm_shoppingcart_checkout() { return $hook_result; $transaction_data = fulcrm_apiv2_POST( $cart[ 'url' ] . 'transaction/', array(), array( 'expand' => implode( ',', array( 'd' ) ) ) ); + fulcrm_shoppingcart_invalidate_cache(); if ( $transaction_data[ 'success' ] ) { $hmac = fulcrm_crypto_object_id_hmac( 'transaction', $transaction_data[ 'data' ][ 'id' ] ); @@ -749,6 +818,7 @@ function fulcrm_shoppingcart_checkout() { 'lineitems', 'paymentitems', ) ) ) ); + fulcrm_shoppingcart_invalidate_cache(); if ( $transaction_data2[ 'success' ] ) { $hook_results = module_invoke_all( 'fulcrm_shoppingcart_post_cart_to_transaction', $transaction_data2[ 'data' ] ); foreach ( $hook_results as $hook_result ) @@ -766,6 +836,7 @@ function fulcrm_shoppingcart_checkout() { function fulcrm_shoppingcart_checkout_success( $transaction_id, $hmac ) { if ( fulcrm_crypto_check_object_id_hmac( 'transaction', $transaction_id, $hmac ) ) { + fulcrm_shoppingcart_invalidate_cache(); $transaction_data = fulcrm_apiv2_GET( 'transaction/' . $transaction_id . '/', $query = array( 'expand' => implode( ',', array( 'd', 'lineitems', @@ -782,6 +853,10 @@ function fulcrm_shoppingcart_checkout_success( $transaction_id, $hmac ) { foreach ( $hook_results as $hook_result ) return $hook_result; drupal_set_message( t('Thank you for your order.'), 'status' ); + } else if ( $transaction_data[ 'data' ][ 'submitted' ] ) { + drupal_set_message( t('Payment has not yet been processed.'), 'warning' ); + } else { + drupal_set_message( t('This transaction has not yet completed.'), 'warning' ); } return theme( 'fulcrm_shoppingcart_transaction_complete', array( 'transaction' => $transaction_data[ 'data' ] ) ); } else { @@ -792,6 +867,7 @@ function fulcrm_shoppingcart_checkout_success( $transaction_id, $hmac ) { function fulcrm_shoppingcart_checkout_failure( $transaction_id, $hmac ) { if ( fulcrm_crypto_check_object_id_hmac( 'transaction', $transaction_id, $hmac ) ) { + fulcrm_shoppingcart_invalidate_cache(); $transaction_data = fulcrm_apiv2_GET( 'transaction/' . $transaction_id . '/', $query = array( 'expand' => implode( ',', array( 'd', 'lineitems', @@ -814,6 +890,7 @@ function fulcrm_shoppingcart_checkout_failure( $transaction_id, $hmac ) { } function fulcrm_shoppingcart_user_logout( $account ) { - if ( array_key_exists( 'fulcrm_shoppingcart_id', $_SESSION ) ) + if ( array_key_exists( 'fulcrm_shoppingcart_id', $_SESSION ) ) { unset( $_SESSION[ 'fulcrm_shoppingcart_id' ] ); + } }