osCommerce Online Merchant v2.3.4

osCommerce Online Merchant v2.3.4 is a general maintenance release focusing on improving core features and introduces a new Content Modules feature.

This release is based on v2.3.3.4, not on v2.3.3. It is therefore important to review the v2.3.3.1 to v2.3.3.4 release notes when upgrading from v2.3.3.

Changelog Changes from v2.3.3.4

The following changes have been applied:

Title Description Bug Severity Developer
jQuery UI (2+ files) Update jQuery UI from 1.8.22 to 1.10.4. Low Harald
jQuery (2+ files) Update jQuery from 1.8.0 to 1.11.1. Low Harald
Flot (jQuery Library) (1+ files) Update Flot (jQuery Library) from 0.6 to 0.8.3. Low Harald
PhotosetGrid and ColorBox (3+ files) Replace bxGallery and FancyBox with PhotosetGrid and Colorbox. Low Harald
Administration Tool Boxes (1 file) Fix height of Administration Tool boxes. Low Harald
Improve $PHP_SELF (11 files) Improve $PHP_SELF to work in subdirectories. Low Harald
Session Lifetime (5 files + SQL) Change database session lifetime to match file session lifetime. Low Harald
Block Orders With No Shipping (2 files + SQL) Block orders when no shipping modules are available for the destination. Low Harald
Product Attributes Administration (1 file) Remove double query in product attributes administration. Low Gary
Remove Free Shipping Check On Non-Related Page (1 file) Remove check on non-existing $free_shipping variable. Low Harald
Checkout Confirmation MessageStack (1 file) Add message stack output to the checkout confirmation page. Low Harald
CA Public Certificate Bundle (1 file) Add the CA public certificate bundle for curl to use on secure connections. Low Harald
Modules Administration (1 file) Detect when modules have been removed without using the Administration Tool. Low Scott
HTTPS Administration Tool (22 files + Config) Force HTTPS on the Administration Tool if SSL is enabled. Low Harald
Content Modules (6+ files) Introduce Content Modules for the Login, My Account, and Checkout Success pages. Low Harald
Version Update (1 file) Update version to v2.3.4.
Administration Dashboard Latest News and Add-Ons (4+ files) Update the Administration Tool Dashboard Latest News and Latest Add-Ons modules. Low Gary
Administration Tool Orders Box (3 files) Please Orders in own Administration Tool menu. Low Harald
Payment Acceptance Box (2+ files) Introduce a new payment acceptance box. Low Harald
PayPal Modules (23 files) Update the following modules:

PayPal Express Checkout
PayPal Payments Standard
PayPal Payments Pro (Direct Payment)
PayPal Express Checkout (Payflow Edition)
PayPal Payments Pro (Payflow Edition)

Introduce the following modules:

PayPal Payments Pro (Hosted Solution)
Log In with PayPal
Low Harald
Sage Pay Modules (12 files) Update the following modules:

Sage Pay Direct
Sage Pay Form
Sage Pay Server

Introduce the following modules:

Sage Pay Cards Management Page content module
Low Harald
Authorize.net Modules (7 files) Update the following modules:

Authorize.net Server Integration Method (SIM)
Authorize.net Advanced Integration Method (AIM)

Introduce the following modules:

Authorize.net Direct Post Method (DPM)
Low Harald
Stripe Modules (5 files) Introduce the following modules:

Stripe.js payment module
Stripe Cards Management Page content module
Low Harald
Braintree Modules (5+ files) Introduce the following modules:

Braintree payment module
Braintree Cards Management Page content module
Low Harald
WorldPay Modules (3 files) Update the WorldPay Hosted Payment Pages payment module. Low Harald

New Modules

The following modules have been added:

Administration Tool Boxes Description
Content Modules Administration page to install and configure Content Modules.
Orders Orders now has its own box, taken out of the Customers box.
Catalog Boxes Description
Payment Acceptance Shows payment logos that are accepted on the store.
Content Modules Description
Set Password (account) Replace the My Account Change Password link to My Account Set Password if the account was created without a password (eg, through Log In with PayPal).
Sage Pay Cards Management Page (account) Add a cards management page to My Account to allow customers to manage their stored payment cards.
Stripe Cards Management Page (account) Add a cards management page to My Account to allow customers to manage their stored payment cards.
Braintree Cards Management Page (account) Add a cards management page to My Account to allow customers to manage their stored payment cards.
Downloads (checkout_success) Show download links on the checkout success page if the order status allows downloads.
Product Notifications (checkout_success) Show product notifications on the checkout success page.
Redirect Old Order (checkout_success) Redirect to the My Account page if the checkout success page is called after 60 minutes from the customers last order.
Thank You (checkout_success) Show the thank you text on the checkout success page.
Create Account Link (login) Show the create account link on the login page for new customers to use.
Login Form (login) Show the login form on the login page.
Log In with PayPal (login) Allow customers to be authenticated with their PayPal account.
Payment Modules
PayPal Payments Pro (Hosted Solution)
Authorize.net Direct Post Method (DPM)
Stripe.js
Braintree

Updated Modules

The following modules have been updated:

Administration Tool Dashboard Modules
Latest News
Latest Add-Ons
Payment Modules
PayPal Express Checkout
PayPal Payments Standard
PayPal Payments Pro (Direct Payment)
PayPal Express Checkout (Payflow Edition)
PayPal Payments Pro (Payflow Edition)
Sage Pay Direct
Sage Pay Form
Sage Pay Server
Authorize.net Server Integration Method (SIM)
Authorize.net Advanced Integration Method (AIM)
WorldPay Hosted Payment Pages

External Library Updates

The following external libraries have been updated:

Title Description
jQuery 1.8.0 to 1.11.1.
jQuery UI 1.8.22 to 1.10.4.
Flot (jQuery) 0.6 to 0.8.3.
bxGallery -> PhotosetGrid bxGallery has been replaced by PhotosetGrid.
FancyBox -> Colorbox FancyBox has been replaced by Colorbox.

API Changes

The following API changes have been applied:

Title Description
$PHP_SELF The value of $PHP_SELF is now set by parsing the requested url through parse_url() and using the 'path' value returned. This value is no longer parsed through basename() to allow pages to be linked to in subdirectories (eg, ext/).
Session Lifetime The database based session lifetime now matches the file based session life time for a consistent behaviour. Old sessions are now cleaned up automatically by PHP's session garbage collection settings.
Cookie Based Sessions The GET and POST session values are ignored when force cookie based sessions is enabled.
SHIPPING_ALLOW_UNDEFINED_ZONES New configuration parameter to control if orders can be made to destinations without defined shipping rates. (False by default)
Content Modules New functions have been added to the template class to manage the new Content Modules implementation.
Admin Config Parameters The following parameters have been added to admin/includes/configure.php:

HTTPS_SERVER
ENABLE_SSL
HTTP_COOKIE_DOMAIN
HTTPS_COOKIE_DOMAIN
HTTP_COOKIE_PATH
HTTPS_COOKIE_PATH
DIR_WS_HTTPS_ADMIN
Empty Customer Passwords If the Set Password account content module is enabled, customer accounts created automatically through PayPal Express Checkout (guest orders) and Log In with PayPal are created with empty passwords. The Set Password account content module detects such accounts and replaces the My Account -> Change Password link to a Set Password link. It is not possible to log in locally with an empty password.

Language Definitions

The following language definitions have been modified:

Definitions Status
[admin english.php]
BOX_CUSTOMERS_ORDERS
BOX_HEADING_ORDERS
BOX_ORDERS_ORDERS

Deleted
New
New
[admin] modules/boxes/modules_content.php
MODULES_ADMIN_MENU_MODULES_CONTENT

New
[admin] modules/dashboard/d_latest_addons.php
MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_ICON_SITE

New
[admin] modules/dashboard/d_latest_news.php
MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_NEWS
MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_GOOGLE_PLUS

New
New
[admin] modules_content.php
HEADING_TITLE
TABLE_HEADING_MODULES
TABLE_HEADING_GROUP
TABLE_HEADING_SORT_ORDER
TABLE_HEADING_ACTION
TEXT_INFO_VERSION
TEXT_INFO_ONLINE_STATUS
TEXT_INFO_API_VERSION
TEXT_MODULE_DIRECTORY

New
New
New
New
New
New
New
New
New
checkout_shipping.php
ERROR_NO_SHIPPING_AVAILABLE_TO_SHIPPING_ADDRESS

New
checkout_success.php
TEXT_SUCCESS
TEXT_NOTIFY_PRODUCTS
TEXT_SEE_ORDERS
TEXT_CONTACT_STORE_OWNER
TEXT_THANKS_FOR_SHOPPING
TABLE_HEADING_DOWNLOAD_DATE
TABLE_HEADING_DOWNLOAD_COUNT
HEADING_DOWNLOAD
FOOTER_DOWNLOAD

Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
login.php
HEADING_NEW_CUSTOMER
TEXT_NEW_CUSTOMER
TEXT_NEW_CUSTOMER_INTRODUCTION
HEADING_RETURNING_CUSTOMER
TEXT_RETURNING_CUSTOMER
TEXT_PASSWORD_FORGOTTEN
TEXT_LOGIN_ERROR
TEXT_VISITORS_CART

Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
modules/boxes/bm_card_acceptance.php
MODULE_BOXES_CARD_ACCEPTANCE_TITLE
MODULE_BOXES_CARD_ACCEPTANCE_DESCRIPTION
MODULE_BOXES_CARD_ACCEPTANCE_SHOWN_CARDS
MODULE_BOXES_CARD_ACCEPTANCE_NEW_CARDS
MODULE_BOXES_CARD_ACCEPTANCE_DRAG_HERE
MODULE_BOXES_CARD_ACCEPTANCE_BOX_TITLE

New
New
New
New
New
New
modules/content/account/cm_account_braintree_cards.php
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_TITLE
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_DESCRIPTION
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_ERROR_MAIN_MODULE
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_LINK_TITLE
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_NAVBAR_TITLE_1
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_NAVBAR_TITLE_2
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_HEADING_TITLE
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_TEXT_DESCRIPTION
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_SAVED_CARDS_TITLE
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_TEXT_NO_CARDS
MODULE_CONTENT_ACCOUNT_BRAINTREE_CARDS_SUCCESS_DELETED

New
New
New
New
New
New
New
New
New
New
New
modules/content/account/cm_account_sage_pay_cards.php
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_TITLE
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_DESCRIPTION
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_ERROR_MAIN_MODULE
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_LINK_TITLE
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_NAVBAR_TITLE_1
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_NAVBAR_TITLE_2
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_HEADING_TITLE
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_TEXT_DESCRIPTION
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_SAVED_CARDS_TITLE
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_TEXT_NO_CARDS
MODULE_CONTENT_ACCOUNT_SAGE_PAY_CARDS_SUCCESS_DELETED

New
New
New
New
New
New
New
New
New
New
New
modules/content/account/cm_account_set_password.php
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_TITLE
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_DESCRIPTION
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_SET_PASSWORD_LINK_TITLE
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_NAVBAR_TITLE_1
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_NAVBAR_TITLE_2
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_HEADING_TITLE
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_SET_PASSWORD_TITLE
MODULE_CONTENT_ACCOUNT_SET_PASSWORD_SUCCESS_PASSWORD_SET

New
New
New
New
New
New
New
New
modules/content/account/cm_account_stripe_cards.php
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_TITLE
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_DESCRIPTION
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_ERROR_MAIN_MODULE
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_LINK_TITLE
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_NAVBAR_TITLE_1
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_NAVBAR_TITLE_2
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_HEADING_TITLE
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_TEXT_DESCRIPTION
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_SAVED_CARDS_TITLE
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_TEXT_NO_CARDS
MODULE_CONTENT_ACCOUNT_STRIPE_CARDS_SUCCESS_DELETED

New
New
New
New
New
New
New
New
New
New
New
modules/content/checkout_success/cm_cs_downloads.php
MODULE_CONTENT_CHECKOUT_SUCCESS_DOWNLOADS_TITLE
MODULE_CONTENT_CHECKOUT_SUCCESS_DOWNLOADS_DESCRIPTION
TABLE_HEADING_DOWNLOAD_DATE
TABLE_HEADING_DOWNLOAD_COUNT
HEADING_DOWNLOAD
FOOTER_DOWNLOAD

New
New
New
New
New
New
modules/content/checkout_success/cm_cs_product_notifications.php
MODULE_CONTENT_CHECKOUT_SUCCESS_PRODUCT_NOTIFICATIONS_TITLE
MODULE_CONTENT_CHECKOUT_SUCCESS_PRODUCT_NOTIFICATIONS_DESCRIPTION
MODULE_CONTENT_CHECKOUT_SUCCESS_PRODUCT_NOTIFICATIONS_TEXT_NOTIFY_PRODUCTS

New
New
New
modules/content/checkout_success/cm_cs_redirect_old_order.php
MODULE_CONTENT_CHECKOUT_SUCCESS_REDIRECT_OLD_ORDER_TITLE
MODULE_CONTENT_CHECKOUT_SUCCESS_REDIRECT_OLD_ORDER_DESCRIPTION

New
New
modules/content/checkout_success/cm_cs_thank_you.php
MODULE_CONTENT_CHECKOUT_SUCCESS_THANK_YOU_TITLE
MODULE_CONTENT_CHECKOUT_SUCCESS_THANK_YOU_DESCRIPTION
MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_SUCCESS
MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_SEE_ORDERS
MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_CONTACT_STORE_OWNER
MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_THANKS_FOR_SHOPPING

New
New
New
New
New
New
modules/content/login/cm_create_account_link.php
MODULE_CONTENT_CREATE_ACCOUNT_LINK_TITLE
MODULE_CONTENT_CREATE_ACCOUNT_LINK_DESCRIPTION
MODULE_CONTENT_LOGIN_HEADING_NEW_CUSTOMER
MODULE_CONTENT_LOGIN_TEXT_NEW_CUSTOMER
MODULE_CONTENT_LOGIN_TEXT_NEW_CUSTOMER_INTRODUCTION

New
New
New
New
New
modules/content/login/cm_login_form.php
MODULE_CONTENT_LOGIN_FORM_TITLE
MODULE_CONTENT_LOGIN_FORM_DESCRIPTION
MODULE_CONTENT_LOGIN_HEADING_RETURNING_CUSTOMER
MODULE_CONTENT_LOGIN_TEXT_RETURNING_CUSTOMER
MODULE_CONTENT_LOGIN_TEXT_PASSWORD_FORGOTTEN
MODULE_CONTENT_LOGIN_TEXT_LOGIN_ERROR

New
New
New
New
New
New
modules/content/login/cm_paypal_login.php
MODULE_CONTENT_PAYPAL_LOGIN_TITLE
MODULE_CONTENT_PAYPAL_LOGIN_DESCRIPTION
MODULE_CONTENT_PAYPAL_LOGIN_TEMPLATE_TITLE
MODULE_CONTENT_PAYPAL_LOGIN_TEMPLATE_CONTENT
MODULE_CONTENT_PAYPAL_LOGIN_TEMPLATE_SANDBOX
MODULE_CONTENT_PAYPAL_LOGIN_ERROR_ADMIN_CURL
MODULE_CONTENT_PAYPAL_LOGIN_ERROR_ADMIN_CONFIGURATION
MODULE_CONTENT_PAYPAL_LOGIN_LANGUAGE_LOCALE
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_GROUP_personal
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_GROUP_address
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_GROUP_account
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_GROUP_checkout
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_full_name
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_date_of_birth
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_age_range
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_gender
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_email_address
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_street_address
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_city
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_state
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_country
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_zip_code
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_phone
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_account_status
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_account_type
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_account_creation_date
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_time_zone
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_locale
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_language
MODULE_CONTENT_PAYPAL_LOGIN_ATTR_seamless_checkout
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_LINK_TITLE
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_TITLE
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_TIME
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_SUCCESS
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_FAILED
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_CONNECTION_ERROR
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_URLS_LINK_TITLE
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_URLS_TITLE
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_URLS_RETURN_TEXT
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_URLS_PRIVACY_TEXT
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_URLS_TERMS_TEXT
MODULE_CONTENT_PAYPAL_LOGIN_DIALOG_URLS_BUTTON_CLOSE

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/authorizenet_cc_aim.php
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_ADMIN_CURL
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_OWNER
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_OWNER_FIRSTNAME
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_OWNER_LASTNAME
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_CVC
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_CCV
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_A
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_B
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_E
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_G
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_N
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_P
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_R
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_S
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_U
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_W
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_X
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_Y
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_AVS_Z
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CVV2_M
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CVV2_N
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CVV2_P
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CVV2_S
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CVV2_U
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_0
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_1
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_2
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_3
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_4
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_5
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_6
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_7
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_8
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_9
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_A
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_CAVV_B
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_CVC
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_CCV
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_MERCHANT_ACCOUNT
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_CURRENCY
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_AUTHORIZENET_CC_AIM_DIALOG_CONNECTION_ERROR

New
New
Deleted
New
New
Deleted
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
Deleted
New
New
New
New
New
New
New
New
New
New
New
modules/payment/authorizenet_cc_dpm.php
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_TITLE
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_PUBLIC_TITLE
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_DESCRIPTION
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_CREDIT_CARD_OWNER_FIRSTNAME
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_CREDIT_CARD_OWNER_LASTNAME
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_CREDIT_CARD_NUMBER
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_CREDIT_CARD_EXPIRES
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_CREDIT_CARD_CCV
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_RETURN_BUTTON
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_A
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_B
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_E
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_G
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_N
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_P
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_R
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_S
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_U
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_W
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_X
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_Y
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_AVS_Z
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CVV2_M
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CVV2_N
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CVV2_P
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CVV2_S
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CVV2_U
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_0
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_1
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_2
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_3
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_4
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_5
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_6
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_7
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_8
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_9
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_A
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_TEXT_CAVV_B
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_ERROR_TITLE
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_ERROR_VERIFICATION
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_ERROR_DECLINED
MODULE_PAYMENT_AUTHORIZENET_CC_DPM_ERROR_GENERAL

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/authorizenet_cc_sim.php
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_RETURN_BUTTON
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_A
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_B
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_E
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_G
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_N
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_P
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_R
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_S
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_U
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_W
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_X
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_Y
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_AVS_Z
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CVV2_M
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CVV2_N
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CVV2_P
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CVV2_S
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CVV2_U
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_0
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_1
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_2
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_3
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_4
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_5
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_6
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_7
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_8
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_9
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_A
MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_CAVV_B

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/braintree_cc.php
MODULE_PAYMENT_BRAINTREE_CC_TEXT_TITLE
MODULE_PAYMENT_BRAINTREE_CC_TEXT_PUBLIC_TITLE
MODULE_PAYMENT_BRAINTREE_CC_TEXT_DESCRIPTION
MODULE_PAYMENT_BRAINTREE_CC_ERROR_ADMIN_PHP
MODULE_PAYMENT_BRAINTREE_CC_ERROR_ADMIN_PHP_EXTENSIONS
MODULE_PAYMENT_BRAINTREE_CC_ERROR_ADMIN_MERCHANT_ACCOUNTS
MODULE_PAYMENT_BRAINTREE_CC_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_NEW
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_LAST_4
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_OWNER
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_NUMBER
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_EXPIRY
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_CVV
MODULE_PAYMENT_BRAINTREE_CC_CREDITCARD_SAVE
MODULE_PAYMENT_BRAINTREE_CC_CURRENCY_CHARGE
MODULE_PAYMENT_BRAINTREE_CC_ERROR_TITLE
MODULE_PAYMENT_BRAINTREE_CC_ERROR_GENERAL
MODULE_PAYMENT_BRAINTREE_CC_ERROR_CARDOWNER
MODULE_PAYMENT_BRAINTREE_CC_ERROR_CARDNUMBER
MODULE_PAYMENT_BRAINTREE_CC_ERROR_CARDEXPIRES
MODULE_PAYMENT_BRAINTREE_CC_ERROR_CARDCVV

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/paypal_express.php
MODULE_PAYMENT_PAYPAL_EXPRESS_ERROR_ADMIN_CURL
MODULE_PAYMENT_PAYPAL_EXPRESS_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_PAYPAL_EXPRESS_DIALOG_CONNECTION_ERROR
MODULE_PAYMENT_PAYPAL_EXPRESS_ERROR_NO_SHIPPING_AVAILABLE_TO_SHIPPING_ADDRESS
MODULE_PAYMENT_PAYPAL_EXPRESS_WARNING_LOCAL_LOGIN_REQUIRED
MODULE_PAYMENT_PAYPAL_EXPRESS_NOTICE_CHECKOUT_CONFIRMATION

New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/paypal_pro_dp.php
MODULE_PAYMENT_PAYPAL_PRO_DP_ERROR_EXPRESS_MODULE
MODULE_PAYMENT_PAYPAL_PRO_DP_ERROR_ADMIN_CURL
MODULE_PAYMENT_PAYPAL_PRO_DP_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_PAYPAL_PRO_DP_DIALOG_CONNECTION_ERROR

New
New
New
New
New
New
New
New
New
New
New
modules/payment/paypal_pro_hs.php
MODULE_PAYMENT_PAYPAL_PRO_HS_TEXT_TITLE
MODULE_PAYMENT_PAYPAL_PRO_HS_TEXT_PUBLIC_TITLE
MODULE_PAYMENT_PAYPAL_PRO_HS_TEXT_DESCRIPTION
MODULE_PAYMENT_PAYPAL_PRO_HS_ERROR_ADMIN_CURL
MODULE_PAYMENT_PAYPAL_PRO_HS_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_PAYPAL_PRO_HS_TEXT_PAYPAL_RETURN_BUTTON
MODULE_PAYMENT_PAYPAL_PRO_HS_TEXT_INVALID_TRANSACTION
MODULE_PAYMENT_PAYPAL_PRO_HS_ERROR_TITLE
MODULE_PAYMENT_PAYPAL_PRO_HS_ERROR_GENERAL
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_PAYPAL_PRO_HS_DIALOG_CONNECTION_ERROR

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/paypal_pro_payflow_dp.php
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_EXPRESS_MODULE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ADMIN_CURL
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_TYPE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM_INFO
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER_INFO
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_DIALOG_CONNECTION_ERROR

New
New
New
Deleted
Deleted
Deleted
Deleted
Deleted
Deleted
New
New
New
New
New
New
New
New
modules/payment/paypal_pro_payflow_ec.php
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_DIRECT_MODULE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_ADMIN_CURL
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_BUTTON
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_EMAIL_PASSWORD
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_DIALOG_CONNECTION_ERROR
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_NO_SHIPPING_AVAILABLE_TO_SHIPPING_ADDRESS
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_WARNING_LOCAL_LOGIN_REQUIRED
MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_NOTICE_CHECKOUT_CONFIRMATION

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/paypal_standard.php
MODULE_PAYMENT_PAYPAL_STANDARD_ERROR_ADMIN_CURL
MODULE_PAYMENT_PAYPAL_STANDARD_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_PAYPAL_RETURN_BUTTON
MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_INVALID_TRANSACTION
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_PAYPAL_STANDARD_DIALOG_CONNECTION_ERROR

New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/sage_pay_direct.php
MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_ADMIN_CURL
MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_NEW
MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_SAVE
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_SAGE_PAY_DIRECT_DIALOG_CONNECTION_ERROR

New
New
New
New
New
New
New
New
New
New
New
New
modules/payment/sage_pay_form.php
MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_ADMIN_MCRYPT
MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_ADMIN_CONFIGURATION

New
New
modules/payment/sage_pay_server.php
MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_ADMIN_CURL
MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_SAGE_PAY_SERVER_DIALOG_CONNECTION_ERROR

New
New
New
New
New
New
New
New
New
New
modules/payment/stripe.php
MODULE_PAYMENT_STRIPE_TEXT_TITLE
MODULE_PAYMENT_STRIPE_TEXT_PUBLIC_TITLE
MODULE_PAYMENT_STRIPE_TEXT_DESCRIPTION
MODULE_PAYMENT_STRIPE_ERROR_ADMIN_CURL
MODULE_PAYMENT_STRIPE_ERROR_ADMIN_CONFIGURATION
MODULE_PAYMENT_STRIPE_CREDITCARD_NEW
MODULE_PAYMENT_STRIPE_CREDITCARD_OWNER
MODULE_PAYMENT_STRIPE_CREDITCARD_NUMBER
MODULE_PAYMENT_STRIPE_CREDITCARD_EXPIRY
MODULE_PAYMENT_STRIPE_CREDITCARD_CVC
MODULE_PAYMENT_STRIPE_CREDITCARD_SAVE
MODULE_PAYMENT_STRIPE_ERROR_TITLE
MODULE_PAYMENT_STRIPE_ERROR_GENERAL
MODULE_PAYMENT_STRIPE_ERROR_CARDSTORED
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_LINK_TITLE
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_TITLE
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_GENERAL_TEXT
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_BUTTON_CLOSE
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_TIME
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_SUCCESS
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_FAILED
MODULE_PAYMENT_STRIPE_DIALOG_CONNECTION_ERROR

New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New

Modified Files

Files that have been modified in this release include:

Modified Files
account.php
admin/cache.php
admin/categories.php
admin/images/icon_facebook.png
admin/images/icon_twitter.png
admin/includes/application_top.php
admin/includes/boxes/customers.php
admin/includes/classes/split_page_results.php
admin/includes/column_left.php
admin/includes/functions/general.php
admin/includes/functions/html_output.php
admin/includes/functions/sessions.php
admin/includes/header.php
admin/includes/languages/english.php
admin/includes/languages/english/modules/dashboard/d_latest_addons.php
admin/includes/languages/english/modules/dashboard/d_latest_news.php
admin/includes/modules/dashboard/d_latest_addons.php
admin/includes/modules/dashboard/d_latest_news.php
admin/includes/modules/security_check/extended/admin_backup_directory_listing.php
admin/includes/modules/security_check/extended/admin_backup_file.php
admin/includes/modules/security_check/extended/ext_directory_listing.php
admin/includes/template_top.php
admin/invoice.php
admin/modules.php
admin/packingslip.php
admin/products_attributes.php
admin/reviews.php
admin/specials.php
admin/stats_customers.php
admin/stats_products_purchased.php
admin/stats_products_viewed.php
admin/whos_online.php
checkout_confirmation.php
checkout_payment.php
checkout_shipping.php
checkout_success.php
ext/modules/payment/paypal/express.php
ext/modules/payment/paypal/express_payflow.php
ext/modules/payment/paypal/standard_ipn.php
ext/modules/payment/rbsworldpay/hosted_callback.php
ext/modules/payment/sage_pay/checkout.php
ext/modules/payment/sage_pay/errors.php
includes/application_top.php
includes/classes/navigation_history.php
includes/classes/osc_template.php
includes/classes/split_page_results.php
includes/functions/general.php
includes/functions/sessions.php
includes/languages/english/checkout_shipping.php
includes/languages/english/checkout_success.php
includes/languages/english/login.php
includes/languages/english/modules/payment/authorizenet_cc_aim.php
includes/languages/english/modules/payment/authorizenet_cc_sim.php
includes/languages/english/modules/payment/paypal_express.php
includes/languages/english/modules/payment/paypal_pro_dp.php
includes/languages/english/modules/payment/paypal_pro_payflow_dp.php
includes/languages/english/modules/payment/paypal_pro_payflow_ec.php
includes/languages/english/modules/payment/paypal_standard.php
includes/languages/english/modules/payment/rbsworldpay_hosted.php
includes/languages/english/modules/payment/sage_pay_direct.php
includes/languages/english/modules/payment/sage_pay_form.php
includes/languages/english/modules/payment/sage_pay_server.php
includes/modules/boxes/bm_currencies.php
includes/modules/boxes/bm_languages.php
includes/modules/boxes/bm_order_history.php
includes/modules/boxes/bm_product_notifications.php
includes/modules/payment/authorizenet_cc_aim.php
includes/modules/payment/authorizenet_cc_sim.php
includes/modules/payment/paypal_express.php
includes/modules/payment/paypal_pro_dp.php
includes/modules/payment/paypal_pro_payflow_dp.php
includes/modules/payment/paypal_pro_payflow_ec.php
includes/modules/payment/paypal_standard.php
includes/modules/payment/rbsworldpay_hosted.php
includes/modules/payment/sage_pay_direct.php
includes/modules/payment/sage_pay_form.php
includes/modules/payment/sage_pay_server.php
includes/modules/product_listing.php
includes/template_top.php
includes/version.php
login.php
logoff.php
product_info.php
stylesheet.css
New Files
admin/images/icon_google_plus.png
admin/images/icon_oscommerce.png
admin/includes/boxes/modules_content.php
admin/includes/boxes/orders.php
admin/includes/languages/english/modules/boxes/modules_content.php
admin/includes/languages/english/modules_content.php
admin/modules_content.php
ext/modules/content/account/braintree/cards.php
ext/modules/content/account/sage_pay/cards.php
ext/modules/content/account/set_password.php
ext/modules/content/account/stripe/cards.php
ext/modules/payment/authorizenet/authorize.net.crt
ext/modules/payment/paypal/hosted_checkout.php
ext/modules/payment/paypal/images/hss_load.gif
ext/modules/payment/paypal/paypal.com.crt
ext/modules/payment/paypal/pro_hosted_ipn.php
ext/modules/payment/sage_pay/server.php
images/card_acceptance/american_express.png
images/card_acceptance/cirrus.png
images/card_acceptance/cirrus_transparent.png
images/card_acceptance/discover.png
images/card_acceptance/maestro.png
images/card_acceptance/maestro_transparent.png
images/card_acceptance/mastercard.png
images/card_acceptance/mastercard_transparent.png
images/card_acceptance/paypal.png
images/card_acceptance/paypal_horizontal_large.png
images/card_acceptance/paypal_monogram.png
images/card_acceptance/visa.png
includes/cacert.pem
includes/languages/english/modules/boxes/bm_card_acceptance.php
includes/languages/english/modules/content/account/cm_account_braintree_cards.php
includes/languages/english/modules/content/account/cm_account_sage_pay_cards.php
includes/languages/english/modules/content/account/cm_account_set_password.php
includes/languages/english/modules/content/account/cm_account_stripe_cards.php
includes/languages/english/modules/content/checkout_success/cm_cs_downloads.php
includes/languages/english/modules/content/checkout_success/cm_cs_product_notifications.php
includes/languages/english/modules/content/checkout_success/cm_cs_redirect_old_order.php
includes/languages/english/modules/content/checkout_success/cm_cs_thank_you.php
includes/languages/english/modules/content/login/cm_create_account_link.php
includes/languages/english/modules/content/login/cm_login_form.php
includes/languages/english/modules/content/login/cm_paypal_login.php
includes/languages/english/modules/payment/authorizenet_cc_dpm.php
includes/languages/english/modules/payment/braintree_cc.php
includes/languages/english/modules/payment/paypal_pro_hs.php
includes/languages/english/modules/payment/stripe.php
includes/modules/boxes/bm_card_acceptance.php
includes/modules/content/account/cm_account_braintree_cards.php
includes/modules/content/account/cm_account_sage_pay_cards.php
includes/modules/content/account/cm_account_set_password.php
includes/modules/content/account/cm_account_stripe_cards.php
includes/modules/content/checkout_success/cm_cs_downloads.php
includes/modules/content/checkout_success/cm_cs_product_notifications.php
includes/modules/content/checkout_success/cm_cs_redirect_old_order.php
includes/modules/content/checkout_success/cm_cs_thank_you.php
includes/modules/content/checkout_success/templates/product_notifications.php
includes/modules/content/checkout_success/templates/thank_you.php
includes/modules/content/login/cm_create_account_link.php
includes/modules/content/login/cm_login_form.php
includes/modules/content/login/cm_paypal_login.php
includes/modules/content/login/templates/create_account_link.php
includes/modules/content/login/templates/login_form.php
includes/modules/content/login/templates/paypal_login.php
includes/modules/pages/tp_account.php
includes/modules/payment/authorizenet_cc_dpm.php
includes/modules/payment/braintree_cc.php
includes/modules/payment/braintree_cc/*
includes/modules/payment/paypal_pro_hs.php
includes/modules/payment/stripe.php
Deleted Files
admin/ext/modules/payment/paypal/paypal_express.php

File Changes

jQuery UI (2+ files)

This changeset updates the jQuery UI javascript library and theme from v1.8.22 to v1.10.4 and removes a bug fix workaround the earlier version introduced.

Delete the following directories and files:

ext/jquery/ui/i18n
ext/jquery/ui/jquery-ui-1.8.22.min.js
ext/jquery/ui/redmond

Copy the following directories and files to their respective destination:

ext/jquery/ui/i18n
ext/jquery/ui/jquery-ui-1.10.4.min.js
ext/jquery/ui/redmond

In:

admin/includes/template_top.php

around line 21, change from:

<link rel="stylesheet" type="text/css" href="<?php echo tep_catalog_href_link('ext/jquery/ui/redmond/jquery-ui-1.8.22.css'); ?>">

to:

<link rel="stylesheet" type="text/css" href="<?php echo tep_catalog_href_link('ext/jquery/ui/redmond/jquery-ui-1.10.4.min.css'); ?>">

around line 23, change from:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/jquery-ui-1.8.22.min.js'); ?>"></script>

<script type="text/javascript">
// fix jQuery 1.8.0 and jQuery UI 1.8.22 bug with dialog buttons; http://bugs.jqueryui.com/ticket/8484
if ( $.attrFn ) { $.attrFn.text = true; }
</script>

to:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/jquery-ui-1.10.4.min.js'); ?>"></script>

includes/template_top.php

around line 29, change from:

<link rel="stylesheet" type="text/css" href="ext/jquery/ui/redmond/jquery-ui-1.8.22.css" />

to:

<link rel="stylesheet" type="text/css" href="ext/jquery/ui/redmond/jquery-ui-1.10.4.min.css" />

around line 31, change from:

<script type="text/javascript" src="ext/jquery/ui/jquery-ui-1.8.22.min.js"></script>
<script type="text/javascript">
// fix jQuery 1.8.0 and jQuery UI 1.8.22 bug with dialog buttons; http://bugs.jqueryui.com/ticket/8484
if ( $.attrFn ) { $.attrFn.text = true; }
</script>

to:

<script type="text/javascript" src="ext/jquery/ui/jquery-ui-1.10.4.min.js"></script>

View online at GitHub

jQuery (2+ files)

This changeset updates the jQuery javascript library from v1.8.0 to v1.11.1.

Delete the following file:

ext/jquery/jquery-1.8.0.min.js

Copy the following file to its respective destination:

ext/jquery/jquery-1.11.1.min.js

In:

admin/includes/template_top.php

around line 22, change from:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/jquery-1.8.0.min.js'); ?>"></script>

to:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/jquery-1.11.1.min.js'); ?>"></script>

includes/template_top.php

around line 30, change from:

<script type="text/javascript" src="ext/jquery/jquery-1.8.0.min.js"></script>

to:

<script type="text/javascript" src="ext/jquery/jquery-1.11.1.min.js"></script>

View online at GitHub

Flot (jQuery Library) (1+ files)

This changeset updates the Flot jQuery library from v0.6 to v0.8.3.

Delete the following directory:

ext/flot

Copy the following directory to its respective destination:

ext/flot

In:

admin/includes/template_top.php

around line 36, change from:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.js'); ?>"></script>

to:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.min.js'); ?>"></script>
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.time.min.js'); ?>"></script>

View online at GitHub

PhotosetGrid and ColorBox (3+ files)

This changeset replaces the bxGallery and FancyBox jQuery libraries with PhotosetGrid and Colorbox jQuery libraries.

Delete the following directories:

ext/jquery/bxGallery
ext/jquery/fancybox

Copy the following directories to their respective destination:

ext/colorbox
ext/photoset-grid

In:

includes/template_top.php

around line 44, change from:

<script type="text/javascript" src="ext/jquery/bxGallery/jquery.bxGallery.1.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="ext/jquery/fancybox/jquery.fancybox-1.3.4.css" />
<script type="text/javascript" src="ext/jquery/fancybox/jquery.fancybox-1.3.4.pack.js"></script>

to:

<script type="text/javascript" src="ext/photoset-grid/jquery.photoset-grid.min.js"></script>

<link rel="stylesheet" type="text/css" href="ext/colorbox/colorbox.css" />
<script type="text/javascript" src="ext/colorbox/jquery.colorbox-min.js"></script>

product_info.php

around line 69, change from:

<?php
    if (tep_not_null($product_info['products_image'])) {
      $pi_query = tep_db_query("select image, htmlcontent from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_info['products_id'] . "' order by sort_order");

      if (tep_db_num_rows($pi_query) > 0) {
?>

    <div id="piGal" style="float: right;">
      <ul>

<?php
        $pi_counter = 0;
        while ($pi = tep_db_fetch_array($pi_query)) {
          $pi_counter++;

          $pi_entry = '        <li><a href="';

          if (tep_not_null($pi['htmlcontent'])) {
            $pi_entry .= '#piGalimg_' . $pi_counter;
          } else {
            $pi_entry .= tep_href_link(DIR_WS_IMAGES . $pi['image'], '', 'NONSSL', false);
          }

          $pi_entry .= '" target="_blank" rel="fancybox">' . tep_image(DIR_WS_IMAGES . $pi['image']) . '</a>';

          if (tep_not_null($pi['htmlcontent'])) {
            $pi_entry .= '<div style="display: none;"><div id="piGalimg_' . $pi_counter . '">' . $pi['htmlcontent'] . '</div></div>';
          }

          $pi_entry .= '</li>';

          echo $pi_entry;
        }
?>

      </ul>
    </div>

<script type="text/javascript">
$('#piGal ul').bxGallery({
  maxwidth: 300,
  maxheight: 200,
  thumbwidth: <?php echo (($pi_counter > 1) ? '75' : '0'); ?>,
  thumbcontainer: 300,
  load_image: 'ext/jquery/bxGallery/spinner.gif'
});
</script>

<?php
      } else {
?>

    <div id="piGal" style="float: right;">
      <?php echo '<a href="' . tep_href_link(DIR_WS_IMAGES . $product_info['products_image'], '', 'NONSSL', false) . '" target="_blank" rel="fancybox">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), null, null, 'hspace="5" vspace="5"') . '</a>'; ?>
    </div>

<?php
      }
?>

<script type="text/javascript">
$("#piGal a[rel^='fancybox']").fancybox({
  cyclic: true
});
</script>

<?php
    }
?>

to:

<?php
    if (tep_not_null($product_info['products_image'])) {
      $photoset_layout = '1';

      $pi_query = tep_db_query("select image, htmlcontent from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_info['products_id'] . "' order by sort_order");
      $pi_total = tep_db_num_rows($pi_query);

      if ($pi_total > 0) {
        $pi_sub = $pi_total-1;

        while ($pi_sub > 5) {
          $photoset_layout .= 5;
          $pi_sub = $pi_sub-5;
        }

        if ($pi_sub > 0) {
          $photoset_layout .= ($pi_total > 5) ? 5 : $pi_sub;
        }
?>

    <div id="piGal">

<?php
        $pi_counter = 0;
        $pi_html = array();

        while ($pi = tep_db_fetch_array($pi_query)) {
          $pi_counter++;

          if (tep_not_null($pi['htmlcontent'])) {
            $pi_html[] = '<div id="piGalDiv_' . $pi_counter . '">' . $pi['htmlcontent'] . '</div>';
          }

          echo tep_image(DIR_WS_IMAGES . $pi['image'], '', '', '', 'id="piGalImg_' . $pi_counter . '"');
        }
?>

    </div>

<?php
        if ( !empty($pi_html) ) {
          echo '    <div style="display: none;">' . implode('', $pi_html) . '</div>';
        }
      } else {
?>

    <div id="piGal">
      <?php echo tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name'])); ?>
    </div>

<?php
      }
    }
?>

<script type="text/javascript">
$(function() {
  $('#piGal').css({
    'visibility': 'hidden'
  });

  $('#piGal').photosetGrid({
    layout: '<?php echo $photoset_layout; ?>',
    width: '250px',
    highresLinks: true,
    rel: 'pigallery',
    onComplete: function() {
      $('#piGal').css({ 'visibility': 'visible'});

      $('#piGal a').colorbox({
        maxHeight: '90%',
        maxWidth: '90%',
        rel: 'pigallery'
      });

      $('#piGal img').each(function() {
        var imgid = $(this).attr('id').substring(9);

        if ( $('#piGalDiv_' + imgid).length ) {
          $(this).parent().colorbox({ inline: true, href: "#piGalDiv_" + imgid });
        }
      });
    }
  });
});
</script>

stylesheet.css

change the following css definitions from:

#piGal ul {
  list-style-type: none;
}

#piGal img {
  -webkit-box-shadow: 0px 0px 1px #000;
  -moz-box-shadow: 0px 0px 1px #000;
}

#piGal .outer {
  margin-left: -30px;
}

to:

#piGal {
  float: right;
  width: 250px;
}

#piGal img {
  max-width: 250px;
  height: auto;
}

View online at GitHub

Administration Tool Boxes (1 file)

This changeset fixes the height of the Administration Tool boxes to work with the newer jQuery UI javascript library.

admin/includes/column_left.php

around line 74, change from:

autoHeight: false,

to:

heightStyle: 'content',

View online at GitHub

Improve $PHP_SELF (11 files)

This changeset improves the value of $PHP_SELF and keeps the path when the value is used in subdirectories (eg, viewing pages from the ext/ directory).

admin/includes/application_top.php

around line 38, change from:

$PHP_SELF = (((strlen(ini_get('cgi.fix_pathinfo')) > 0) && ((bool)ini_get('cgi.fix_pathinfo') == false)) || !isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) ? basename($HTTP_SERVER_VARS['PHP_SELF']) : basename($HTTP_SERVER_VARS['SCRIPT_NAME']);

to:

$req = parse_url($HTTP_SERVER_VARS['SCRIPT_NAME']);
$PHP_SELF = substr($req['path'], strlen(DIR_WS_ADMIN));

around line 127, change from:

$current_page = basename($PHP_SELF);

to:

$current_page = $PHP_SELF;

admin/includes/classes/split_page_results.php

around line 55, change from:

$display_links = tep_draw_form('pages', basename($PHP_SELF), '', 'get');

to:

$display_links = tep_draw_form('pages', $PHP_SELF, '', 'get');

around line 58, change from:

$display_links .= '<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $page_name . '=' . ($current_page_number - 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_PREV . '</a>&nbsp;&nbsp;';

to:

$display_links .= '<a href="' . tep_href_link($PHP_SELF, $parameters . $page_name . '=' . ($current_page_number - 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_PREV . '</a>&nbsp;&nbsp;';

around line 66, change from:

$display_links .= '&nbsp;&nbsp;<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $page_name . '=' . ($current_page_number + 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_NEXT . '</a>';

to:

$display_links .= '&nbsp;&nbsp;<a href="' . tep_href_link($PHP_SELF, $parameters . $page_name . '=' . ($current_page_number + 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_NEXT . '</a>';

includes/application_top.php

around line 47, change from:

$PHP_SELF = (((strlen(ini_get('cgi.fix_pathinfo')) > 0) && ((bool)ini_get('cgi.fix_pathinfo') == false)) || !isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) ? basename($HTTP_SERVER_VARS['PHP_SELF']) : basename($HTTP_SERVER_VARS['SCRIPT_NAME']);

to:

$req = parse_url($HTTP_SERVER_VARS['SCRIPT_NAME']);
$PHP_SELF = substr($req['path'], ($request_type == 'NONSSL') ? strlen(DIR_WS_HTTP_CATALOG) : strlen(DIR_WS_HTTPS_CATALOG));

around line 317, change from:

$goto = basename($PHP_SELF);

to:

$goto = $PHP_SELF;

around line 367, change from:

tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action', 'notify'))));

to:

tep_redirect(tep_href_link($PHP_SELF, tep_get_all_get_params(array('action', 'notify'))));

around line 377, change from:

tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action', 'notify'))));

to:

tep_redirect(tep_href_link($PHP_SELF, tep_get_all_get_params(array('action', 'notify'))));

around line 389, change from:

tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action'))));

to:

tep_redirect(tep_href_link($PHP_SELF, tep_get_all_get_params(array('action'))));

includes/classes/navigation_history.php

around line 30, change from:

if ( ($this->path[$i]['page'] == basename($PHP_SELF)) ) {

to:

if ($this->path[$i]['page'] == $PHP_SELF) {

around line 61, change from:

$this->path[] = array('page' => basename($PHP_SELF),

to:

$this->path[] = array('page' => $PHP_SELF,

around line 72, change from:

if ($this->path[$last_entry_position]['page'] == basename($PHP_SELF)) {

to:

if ($this->path[$last_entry_position]['page'] == $PHP_SELF) {

around line 86, change from:

$this->snapshot = array('page' => basename($PHP_SELF),

to:

$this->snapshot = array('page' => $PHP_SELF,

includes/classes/split_page_results.php

around line 83, change from:

if ($this->current_page_number > 1) $display_links_string .= '<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $this->page_name . '=' . ($this->current_page_number - 1), $request_type) . '" class="pageResults" title=" ' . PREVNEXT_TITLE_PREVIOUS_PAGE . ' "><u>' . PREVNEXT_BUTTON_PREV . '</u></a>&nbsp;&nbsp;';

to:

if ($this->current_page_number > 1) $display_links_string .= '<a href="' . tep_href_link($PHP_SELF, $parameters . $this->page_name . '=' . ($this->current_page_number - 1), $request_type) . '" class="pageResults" title=" ' . PREVNEXT_TITLE_PREVIOUS_PAGE . ' "><u>' . PREVNEXT_BUTTON_PREV . '</u></a>&nbsp;&nbsp;';

around line 93, change from:

if ($cur_window_num > 1) $display_links_string .= '<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $this->page_name . '=' . (($cur_window_num - 1) * $max_page_links), $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_PREV_SET_OF_NO_PAGE, $max_page_links) . ' ">...</a>';

to:

if ($cur_window_num > 1) $display_links_string .= '<a href="' . tep_href_link($PHP_SELF, $parameters . $this->page_name . '=' . (($cur_window_num - 1) * $max_page_links), $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_PREV_SET_OF_NO_PAGE, $max_page_links) . ' ">...</a>';

around line 100, change from:

$display_links_string .= '&nbsp;<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $this->page_name . '=' . $jump_to_page, $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_PAGE_NO, $jump_to_page) . ' "><u>' . $jump_to_page . '</u></a>&nbsp;';

to:

$display_links_string .= '&nbsp;<a href="' . tep_href_link($PHP_SELF, $parameters . $this->page_name . '=' . $jump_to_page, $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_PAGE_NO, $jump_to_page) . ' "><u>' . $jump_to_page . '</u></a>&nbsp;';

around line 105, change from:

if ($cur_window_num < $max_window_num) $display_links_string .= '<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $this->page_name . '=' . (($cur_window_num) * $max_page_links + 1), $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_NEXT_SET_OF_NO_PAGE, $max_page_links) . ' ">...</a>&nbsp;';

to:

if ($cur_window_num < $max_window_num) $display_links_string .= '<a href="' . tep_href_link($PHP_SELF, $parameters . $this->page_name . '=' . (($cur_window_num) * $max_page_links + 1), $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_NEXT_SET_OF_NO_PAGE, $max_page_links) . ' ">...</a>&nbsp;';

around line 108, change from:

if (($this->current_page_number < $this->number_of_pages) && ($this->number_of_pages != 1)) $display_links_string .= '&nbsp;<a href="' . tep_href_link(basename($PHP_SELF), $parameters . 'page=' . ($this->current_page_number + 1), $request_type) . '" class="pageResults" title=" ' . PREVNEXT_TITLE_NEXT_PAGE . ' "><u>' . PREVNEXT_BUTTON_NEXT . '</u></a>&nbsp;';

to:

if (($this->current_page_number < $this->number_of_pages) && ($this->number_of_pages != 1)) $display_links_string .= '&nbsp;<a href="' . tep_href_link($PHP_SELF, $parameters . 'page=' . ($this->current_page_number + 1), $request_type) . '" class="pageResults" title=" ' . PREVNEXT_TITLE_NEXT_PAGE . ' "><u>' . PREVNEXT_BUTTON_NEXT . '</u></a>&nbsp;';

includes/functions/general.php

around line 896, change from:

$sort_prefix = '<a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('page', 'info', 'sort')) . 'page=1&sort=' . $colnum . ($sortby == $colnum . 'a' ? 'd' : 'a')) . '" title="' . tep_output_string(TEXT_SORT_PRODUCTS . ($sortby == $colnum . 'd' || substr($sortby, 0, 1) != $colnum ? TEXT_ASCENDINGLY : TEXT_DESCENDINGLY) . TEXT_BY . $heading) . '" class="productListing-heading">' ;

to:

$sort_prefix = '<a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('page', 'info', 'sort')) . 'page=1&sort=' . $colnum . ($sortby == $colnum . 'a' ? 'd' : 'a')) . '" title="' . tep_output_string(TEXT_SORT_PRODUCTS . ($sortby == $colnum . 'd' || substr($sortby, 0, 1) != $colnum ? TEXT_ASCENDINGLY : TEXT_DESCENDINGLY) . TEXT_BY . $heading) . '" class="productListing-heading">' ;

includes/modules/boxes/bm_currencies.php

around line 55, change from:

'    ' . tep_draw_form('currencies', tep_href_link(basename($PHP_SELF), '', $request_type, false), 'get') .

to:

'    ' . tep_draw_form('currencies', tep_href_link($PHP_SELF, '', $request_type, false), 'get') .

includes/modules/boxes/bm_languages.php

around line 46, change from:

$languages_string .= ' <a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('language', 'currency')) . 'language=' . $key, $request_type) . '">' . tep_image(DIR_WS_LANGUAGES .  $value['directory'] . '/images/' . $value['image'], $value['name']) . '</a> ';

to:

$languages_string .= ' <a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('language', 'currency')) . 'language=' . $key, $request_type) . '">' . tep_image(DIR_WS_LANGUAGES .  $value['directory'] . '/images/' . $value['image'], $value['name']) . '</a> ';

includes/modules/boxes/bm_order_history.php

around line 51, change from:

'    <td align="right" valign="top"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=cust_order&pid=' . $products['products_id']) . '">' . tep_image(DIR_WS_ICONS . 'cart.gif', ICON_CART) . '</a></td>' .

to:

'    <td align="right" valign="top"><a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('action')) . 'action=cust_order&pid=' . $products['products_id']) . '">' . tep_image(DIR_WS_ICONS . 'cart.gif', ICON_CART) . '</a></td>' .

includes/modules/boxes/bm_product_notifications.php

around line 48, change from:

if ($notification_exists == true) {
  $notif_contents = '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications_remove.gif', IMAGE_BUTTON_REMOVE_NOTIFICATIONS) . '</a></td><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . sprintf(MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY_REMOVE, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>';
} else {
  $notif_contents = '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications.gif', IMAGE_BUTTON_NOTIFICATIONS) . '</a></td><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . sprintf(MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>';
}

to:

if ($notification_exists == true) {
  $notif_contents = '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications_remove.gif', IMAGE_BUTTON_REMOVE_NOTIFICATIONS) . '</a></td><td><a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . sprintf(MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY_REMOVE, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>';
} else {
  $notif_contents = '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications.gif', IMAGE_BUTTON_NOTIFICATIONS) . '</a></td><td><a href="' . tep_href_link($PHP_SELF, tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . sprintf(MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>';
}

includes/modules/product_listing.php

around line 135, change from:

$prod_list_contents .= '        <td align="center">' . tep_draw_button(IMAGE_BUTTON_BUY_NOW, 'cart', tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $listing['products_id'])) . '</td>';

to:

$prod_list_contents .= '        <td align="center">' . tep_draw_button(IMAGE_BUTTON_BUY_NOW, 'cart', tep_href_link($PHP_SELF, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $listing['products_id'])) . '</td>';

View online at GitHub

Session Lifetime (5 files + SQL)

This changeset updates the lifetime of database based sessions to match the lifetime of file based sessions for consistent lifetime behaviour, and now relies on the PHP session garbage collection setting for automatic cleanup of old sessions. The security of sessions has also been improved by not accepting GET/POST session IDs if SESSION_FORCE_COOKIE_USE is enabled.

admin/includes/functions/sessions.php
includes/functions/sessions.php

Do not copy the admin sessions.php file to the catalog side as they differ slightly.

in those two files, around line 19, remove the following lines:

if (!$SESS_LIFE = get_cfg_var('session.gc_maxlifetime')) {
  $SESS_LIFE = 1440;
}

around line 31, change from:

function _sess_read($key) {
  $value_query = tep_db_query("select value from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "' and expiry > '" . time() . "'");
  $value = tep_db_fetch_array($value_query);

  if (isset($value['value'])) {
    return $value['value'];
  }

  return '';
}

to:

function _sess_read($key) {
  $value_query = tep_db_query("select value from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "'");
  $value = tep_db_fetch_array($value_query);

  if (isset($value['value'])) {
    return $value['value'];
  }

  return '';
}

around line 42, change from:

function _sess_write($key, $val) {
  global $SESS_LIFE;

  $expiry = time() + $SESS_LIFE;
  $value = $val;

  $check_query = tep_db_query("select count(*) as total from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "'");
  $check = tep_db_fetch_array($check_query);

  if ($check['total'] > 0) {
    return tep_db_query("update " . TABLE_SESSIONS . " set expiry = '" . tep_db_input($expiry) . "', value = '" . tep_db_input($value) . "' where sesskey = '" . tep_db_input($key) . "'");
  } else {
    return tep_db_query("insert into " . TABLE_SESSIONS . " values ('" . tep_db_input($key) . "', '" . tep_db_input($expiry) . "', '" . tep_db_input($value) . "')");
  }
}

to:

function _sess_write($key, $value) {
  $check_query = tep_db_query("select 1 from " . TABLE_SESSIONS . " where sesskey = '" . tep_db_input($key) . "'");

  if ( tep_db_num_rows($check_query) > 0 ) {
    return tep_db_query("update " . TABLE_SESSIONS . " set expiry = '" . tep_db_input(time()) . "', value = '" . tep_db_input($value) . "' where sesskey = '" . tep_db_input($key) . "'");
  } else {
    return tep_db_query("insert into " . TABLE_SESSIONS . " values ('" . tep_db_input($key) . "', '" . tep_db_input(time()) . "', '" . tep_db_input($value) . "')");
  }
}

around line 62, change from:

function _sess_gc($maxlifetime) {
  tep_db_query("delete from " . TABLE_SESSIONS . " where expiry < '" . time() . "'");

  return true;
}

to:

function _sess_gc($maxlifetime) {
  return tep_db_query("delete from " . TABLE_SESSIONS . " where expiry < '" . (time() - $maxlifetime) . "'");
}

around line 71, change from:

function tep_session_start() {
  global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS;

  $sane_session_id = true;

  if (isset($HTTP_GET_VARS[tep_session_name()])) {
    if (preg_match('/^[a-zA-Z0-9,-]+$/', $HTTP_GET_VARS[tep_session_name()]) == false) {
      unset($HTTP_GET_VARS[tep_session_name()]);

      $sane_session_id = false;
    }
  } elseif (isset($HTTP_POST_VARS[tep_session_name()])) {
    if (preg_match('/^[a-zA-Z0-9,-]+$/', $HTTP_POST_VARS[tep_session_name()]) == false) {
      unset($HTTP_POST_VARS[tep_session_name()]);

      $sane_session_id = false;
    }
  } elseif (isset($HTTP_COOKIE_VARS[tep_session_name()])) {
    if (preg_match('/^[a-zA-Z0-9,-]+$/', $HTTP_COOKIE_VARS[tep_session_name()]) == false) {
      $session_data = session_get_cookie_params();

      setcookie(tep_session_name(), '', time()-42000, $session_data['path'], $session_data['domain']);

      $sane_session_id = false;
    }
  }

  if ($sane_session_id == false) {
    tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
  }

  register_shutdown_function('session_write_close');

  return session_start();
}

to:

function tep_session_start() {
  global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS;

  $sane_session_id = true;

  if ( isset($HTTP_GET_VARS[tep_session_name()]) ) {
    if ( (SESSION_FORCE_COOKIE_USE == 'True') || (preg_match('/^[a-zA-Z0-9,-]+$/', $HTTP_GET_VARS[tep_session_name()]) == false) ) {
      unset($HTTP_GET_VARS[tep_session_name()]);

      $sane_session_id = false;
    }
  }

  if ( isset($HTTP_POST_VARS[tep_session_name()]) ) {
    if ( (SESSION_FORCE_COOKIE_USE == 'True') || (preg_match('/^[a-zA-Z0-9,-]+$/', $HTTP_POST_VARS[tep_session_name()]) == false) ) {
      unset($HTTP_POST_VARS[tep_session_name()]);

      $sane_session_id = false;
    }
  }

  if ( isset($HTTP_COOKIE_VARS[tep_session_name()]) ) {
    if ( preg_match('/^[a-zA-Z0-9,-]+$/', $HTTP_COOKIE_VARS[tep_session_name()]) == false ) {
      $session_data = session_get_cookie_params();

      setcookie(tep_session_name(), '', time()-42000, $session_data['path'], $session_data['domain']);
      unset($HTTP_COOKIE_VARS[tep_session_name()]);

      $sane_session_id = false;
    }
  }

  if ($sane_session_id == false) {
    tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
  }

  register_shutdown_function('session_write_close');

  return session_start();
}

around line 161, change from:

function tep_session_destroy() {
  return session_destroy();
}

to:

function tep_session_destroy() {
  global $HTTP_COOKIE_VARS;

  if ( isset($HTTP_COOKIE_VARS[tep_session_name()]) ) {
    $session_data = session_get_cookie_params();

    setcookie(tep_session_name(), '', time()-42000, $session_data['path'], $session_data['domain']);
    unset($HTTP_COOKIE_VARS[tep_session_name()]);
  }

  return session_destroy();
}

includes/application_top.php

around line 151, change from:

if (isset($HTTP_POST_VARS[tep_session_name()])) {
  tep_session_id($HTTP_POST_VARS[tep_session_name()]);
} elseif ( ($request_type == 'SSL') && isset($HTTP_GET_VARS[tep_session_name()]) ) {
  tep_session_id($HTTP_GET_VARS[tep_session_name()]);
}

to:

if ( SESSION_FORCE_COOKIE_USE == 'False' ) {
  if ( isset($HTTP_GET_VARS[tep_session_name()]) && (!isset($HTTP_COOKIE_VARS[tep_session_name()]) || ($HTTP_COOKIE_VARS[tep_session_name()] != $HTTP_GET_VARS[tep_session_name()])) ) {
    tep_session_id($HTTP_GET_VARS[tep_session_name()]);
  } elseif ( isset($HTTP_POST_VARS[tep_session_name()]) && (!isset($HTTP_COOKIE_VARS[tep_session_name()]) || ($HTTP_COOKIE_VARS[tep_session_name()] != $HTTP_POST_VARS[tep_session_name()])) ) {
    tep_session_id($HTTP_POST_VARS[tep_session_name()]);
  }
}

login.php

around line 15, change from:

// redirect the customer to a friendly cookie-must-be-enabled page if cookies are disabled (or the session has not started)
  if ($session_started == false) {
    tep_redirect(tep_href_link(FILENAME_COOKIE_USAGE));
  }

to:

// redirect the customer to a friendly cookie-must-be-enabled page if cookies are disabled (or the session has not started)
  if ($session_started == false) {
    if ( !isset($HTTP_GET_VARS['cookie_test']) ) {
      $all_get = tep_get_all_get_params();

      tep_redirect(tep_href_link(FILENAME_LOGIN, $all_get . (empty($all_get) ? '' : '&') . 'cookie_test=1', 'SSL'));
    }

    tep_redirect(tep_href_link(FILENAME_COOKIE_USAGE));
  }

logoff.php

around line 19, change from:

tep_session_unregister('customer_id');
tep_session_unregister('customer_default_address_id');
tep_session_unregister('customer_first_name');
tep_session_unregister('customer_country_id');
tep_session_unregister('customer_zone_id');
tep_session_unregister('comments');

to:

tep_session_unregister('customer_id');
tep_session_unregister('customer_default_address_id');
tep_session_unregister('customer_first_name');
tep_session_unregister('customer_country_id');
tep_session_unregister('customer_zone_id');

if ( tep_session_is_registered('sendto') ) {
  tep_session_unregister('sendto');
}

if ( tep_session_is_registered('billto') ) {
  tep_session_unregister('billto');
}

if ( tep_session_is_registered('shipping') ) {
  tep_session_unregister('shipping');
}

if ( tep_session_is_registered('payment') ) {
  tep_session_unregister('payment');
}

if ( tep_session_is_registered('comments') ) {
  tep_session_unregister('comments');
}

Database

Perform the following SQL commands:

alter table sessions modify sesskey varchar(128) not null;

This increases the session ID column to better support session.hash_function and session.hash_bits_per_character PHP ini settings.

View online at GitHub

Block Orders With No Shipping (2 files + SQL)

This changeset allows orders to be blocked when the destination does not match any defined shipping zones and when no shipping rates are available.

checkout_shipping.php

around line 139, change from:

$shipping = false;

tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));

to:

if ( defined('SHIPPING_ALLOW_UNDEFINED_ZONES') && (SHIPPING_ALLOW_UNDEFINED_ZONES == 'False') ) {
  tep_session_unregister('shipping');
} else {
  $shipping = false;

  tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
}

around line 156, change from:

require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_SHIPPING);

to:

require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_SHIPPING);

if ( defined('SHIPPING_ALLOW_UNDEFINED_ZONES') && (SHIPPING_ALLOW_UNDEFINED_ZONES == 'False') && !tep_session_is_registered('shipping') && ($shipping == false) ) {
  $messageStack->add_session('checkout_address', ERROR_NO_SHIPPING_AVAILABLE_TO_SHIPPING_ADDRESS);

  tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL'));
}

includes/languages/english/checkout_shipping.php

add the following language definition:

define('ERROR_NO_SHIPPING_AVAILABLE_TO_SHIPPING_ADDRESS', 'Shipping is currently not available for the selected shipping address. Please select or create a new shipping address to use with your purchase.');

Database

Perform the following SQL commands:

insert into configuration (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Allow Orders Not Matching Defined Shipping Zones ', 'SHIPPING_ALLOW_UNDEFINED_ZONES', 'False', 'Should orders be allowed to shipping addresses not matching defined shipping module shipping zones?', '7', '5', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now());

This adds the following configuration parameter:

Administration Tool -> Configuration -> Shipping/Packaging -> Allow Orders Not Matching Defined Shipping Zones (False by default)

View online at GitHub

Product Attributes Administration (1 file)

This changeset removes a duplicate database query when administrating product attributes.

admin/products_attributes.php

around line 134, change from:

tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$value_id . "'");
tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$value_id . "'");
tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " where products_options_values_id = '" . (int)$value_id . "'");

to:

tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$value_id . "'");
tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " where products_options_values_id = '" . (int)$value_id . "'");

View online at GitHub

Remove Free Shipping Check On Non-Related Page (1 file)

This changeset removes a free shipping check on a non-related page.

checkout_payment.php

around line 176, change from:

} elseif ($free_shipping == false) {

to:

} else {

View online at GitHub

Checkout Confirmation MessageStack (1 file)

This changeset allows messages added to the message stack to be shown on the checkout confirmation page.

checkout_confirmation.php

around line 96, change from:

if (isset($$payment->form_action_url)) {
  $form_action_url = $$payment->form_action_url;
} else {
  $form_action_url = tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');
}

to:

if ($messageStack->size('checkout_confirmation') > 0) {
  echo $messageStack->output('checkout_confirmation');
}

if (isset($$payment->form_action_url)) {
  $form_action_url = $$payment->form_action_url;
} else {
  $form_action_url = tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');
}

View online at GitHub

CA Public Certificate Bundle (1 file)

This changeset adds the CA public certificate bundle which curl can use to verify secure connections.

Copy the following file to its respective directory:

includes/cacert.pem

View online at GitHub

Modules Administration (1 file)

This changeset prevents duplicate module parameters being installed when installed module files were deleted without uninstalling them prior and copying the files back at a later date to install again.

admin/modules.php

around line 48, change from:

if ($action == 'install') {
  $module->install();

  $modules_installed = explode(';', constant($module_key));
  $modules_installed[] = $class . $file_extension;

  tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $modules_installed) . "' where configuration_key = '" . $module_key . "'");
  tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $class));
} elseif ($action == 'remove') {
  $module->remove();

  $modules_installed = explode(';', constant($module_key));
  unset($modules_installed[array_search($class . $file_extension, $modules_installed)]);

  tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $modules_installed) . "' where configuration_key = '" . $module_key . "'");
  tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set));
}

to:

if ($action == 'install') {
  if ($module->check() > 0) { // remove module if already installed
    $module->remove();
  }

  $module->install();

  $modules_installed = explode(';', constant($module_key));

  if (!in_array($class . $file_extension, $modules_installed)) {
    $modules_installed[] = $class . $file_extension;
  }

  tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $modules_installed) . "' where configuration_key = '" . $module_key . "'");
  tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $class));
} elseif ($action == 'remove') {
  $module->remove();

  $modules_installed = explode(';', constant($module_key));

  if (in_array($class . $file_extension, $modules_installed)) {
    unset($modules_installed[array_search($class . $file_extension, $modules_installed)]);
  }

  tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $modules_installed) . "' where configuration_key = '" . $module_key . "'");
  tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set));
}

around line 181, change from:

<td class="dataTableContent" align="right"><?php if (is_numeric($module->sort_order)) echo $module->sort_order; ?></td>

to:

<td class="dataTableContent" align="right"><?php if (in_array($module->code . $file_extension, $modules_installed) && is_numeric($module->sort_order)) echo $module->sort_order; ?></td>

around line 249, change from:

if ($mInfo->status == '1') {

to:

if (in_array($mInfo->code . $file_extension, $modules_installed) && ($mInfo->status > 0)) {

View online at GitHub

HTTPS Administration Tool (22 files + Config)

This changeset forces HTTPS for the Administration Tool if SSL has been enabled.

This changeset also introduces additional configuration parameters that must be added to the admin/includes/configure.php file.

admin/includes/configure.php

add the following configuration parameters with your store values:

define('HTTPS_SERVER', '');
define('ENABLE_SSL', false);
define('HTTP_COOKIE_DOMAIN', '');
define('HTTPS_COOKIE_DOMAIN', '');
define('HTTP_COOKIE_PATH', '');
define('HTTPS_COOKIE_PATH', '');

define('DIR_WS_HTTPS_ADMIN', '/catalog/admin/');
Please reference your catalog configuration file at includes/configure.php to form the admin equivalent values.
Configuration Parameter Description Example
HTTPS_SERVER The HTTPS equivalent of HTTP_SERVER. https://ssl.oscommerce.com
ENABLE_SSL Set to true to enable HTTPS in the Administration Tool. true
HTTP_COOKIE_DOMAIN Limit cookies to this domain - can be left empty.
HTTPS_COOKIE_DOMAIN Limit cookies to this domain - can be left empty.
HTTP_COOKIE_PATH Limit cookies to this path - based on DIR_WS_ADMIN. /catalog/admin/
HTTPS_COOKIE_PATH Limit cookies to this domain - based on DIR_WS_HTTPS_ADMIN. /catalog/admin/
DIR_WS_HTTPS_ADMIN The HTTPS equivalent of DIR_WS_ADMIN. /catalog/admin/

admin/cache.php

around line 87, change from:

<td class="dataTableContent" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_CACHE, 'action=reset&block=' . $cache_blocks[$i]['code'], 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . 'icon_reset.gif', 'Reset', 13, 13) . '</a>'; ?>&nbsp;</td>

to:

<td class="dataTableContent" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_CACHE, 'action=reset&block=' . $cache_blocks[$i]['code']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_reset.gif', 'Reset', 13, 13) . '</a>'; ?>&nbsp;</td>

admin/categories.php

around line 595, change from:

<div><?php echo '<strong>' . TEXT_PRODUCTS_MAIN_IMAGE . ' <small>(' . SMALL_IMAGE_WIDTH . ' x ' . SMALL_IMAGE_HEIGHT . 'px)</small></strong><br />' . (tep_not_null($pInfo->products_image) ? '<a href="' . DIR_WS_CATALOG_IMAGES . $pInfo->products_image . '" target="_blank">' . $pInfo->products_image . '</a> &#124; ' : '') . tep_draw_file_field('products_image'); ?></div>

to:

<div><?php echo '<strong>' . TEXT_PRODUCTS_MAIN_IMAGE . ' <small>(' . SMALL_IMAGE_WIDTH . ' x ' . SMALL_IMAGE_HEIGHT . 'px)</small></strong><br />' . (tep_not_null($pInfo->products_image) ? '<a href="' . HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $pInfo->products_image . '" target="_blank">' . $pInfo->products_image . '</a> &#124; ' : '') . tep_draw_file_field('products_image'); ?></div>

around line 604, change from:

echo '                <li id="piId' . $pi_counter . '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s" style="float: right;"></span><a href="#" onclick="showPiDelConfirm(' . $pi_counter . ');return false;" class="ui-icon ui-icon-trash" style="float: right;"></a><strong>' . TEXT_PRODUCTS_LARGE_IMAGE . '</strong><br />' . tep_draw_file_field('products_image_large_' . $pi['id']) . '<br /><a href="' . DIR_WS_CATALOG_IMAGES . $pi['image'] . '" target="_blank">' . $pi['image'] . '</a><br /><br />' . TEXT_PRODUCTS_LARGE_IMAGE_HTML_CONTENT . '<br />' . tep_draw_textarea_field('products_image_htmlcontent_' . $pi['id'], 'soft', '70', '3', $pi['htmlcontent']) . '</li>';

to:

echo '                <li id="piId' . $pi_counter . '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s" style="float: right;"></span><a href="#" onclick="showPiDelConfirm(' . $pi_counter . ');return false;" class="ui-icon ui-icon-trash" style="float: right;"></a><strong>' . TEXT_PRODUCTS_LARGE_IMAGE . '</strong><br />' . tep_draw_file_field('products_image_large_' . $pi['id']) . '<br /><a href="' . HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $pi['image'] . '" target="_blank">' . $pi['image'] . '</a><br /><br />' . TEXT_PRODUCTS_LARGE_IMAGE_HTML_CONTENT . '<br />' . tep_draw_textarea_field('products_image_htmlcontent_' . $pi['id'], 'soft', '70', '3', $pi['htmlcontent']) . '</li>';

around line 724, change from:

<td class="main"><?php echo tep_image(DIR_WS_CATALOG_IMAGES . $products_image_name, $pInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'align="right" hspace="5" vspace="5"') . $pInfo->products_description; ?></td>

to:

<td class="main"><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $products_image_name, $pInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'align="right" hspace="5" vspace="5"') . $pInfo->products_description; ?></td>

around line 777, change from:

<td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link($back_url, $back_url_params, 'NONSSL')); ?></td>

to:

<td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link($back_url, $back_url_params)); ?></td>

around line 956, change from:

$contents[] = array('text' => '<br />' . tep_image(DIR_WS_CATALOG_IMAGES . $cInfo->categories_image, $cInfo->categories_name) . '<br />' . DIR_WS_CATALOG_IMAGES . '<br /><strong>' . $cInfo->categories_image . '</strong>');

to:

$contents[] = array('text' => '<br />' . tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $cInfo->categories_image, $cInfo->categories_name) . '<br />' . DIR_WS_CATALOG_IMAGES . '<br /><strong>' . $cInfo->categories_image . '</strong>');

admin/includes/application_top.php

around line 37, change from:

// set php_self in the local scope
  $req = parse_url($HTTP_SERVER_VARS['SCRIPT_NAME']);
  $PHP_SELF = substr($req['path'], strlen(DIR_WS_ADMIN));

to:

// set the type of request (secure or not)
  $request_type = (getenv('HTTPS') == 'on') ? 'SSL' : 'NONSSL';

// set php_self in the local scope
  $req = parse_url($HTTP_SERVER_VARS['SCRIPT_NAME']);
  $PHP_SELF = substr($req['path'], ($request_type == 'SSL') ? strlen(DIR_WS_HTTPS_ADMIN) : strlen(DIR_WS_ADMIN));

around line 83, change from:

// set the session name and save path
  tep_session_name('osCAdminID');
  tep_session_save_path(SESSION_WRITE_DIRECTORY);

to:

// set the cookie domain
  $cookie_domain = (($request_type == 'NONSSL') ? HTTP_COOKIE_DOMAIN : HTTPS_COOKIE_DOMAIN);
  $cookie_path = (($request_type == 'NONSSL') ? HTTP_COOKIE_PATH : HTTPS_COOKIE_PATH);

// set the session name and save path
  tep_session_name('osCAdminID');
  tep_session_save_path(SESSION_WRITE_DIRECTORY);

around line 89, change from:

session_set_cookie_params(0, DIR_WS_ADMIN);

to:

session_set_cookie_params(0, $cookie_path, $cookie_domain);

around line 92, change from:

ini_set('session.cookie_path', DIR_WS_ADMIN);

to:

ini_set('session.cookie_path', $cookie_path);
ini_set('session.cookie_domain', $cookie_domain);

admin/includes/classes/split_page_results.php

around line 58, change from:

$display_links .= '<a href="' . tep_href_link($PHP_SELF, $parameters . $page_name . '=' . ($current_page_number - 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_PREV . '</a>&nbsp;&nbsp;';

to:

$display_links .= '<a href="' . tep_href_link($PHP_SELF, $parameters . $page_name . '=' . ($current_page_number - 1)) . '" class="splitPageLink">' . PREVNEXT_BUTTON_PREV . '</a>&nbsp;&nbsp;';

around line 66, change from:

$display_links .= '&nbsp;&nbsp;<a href="' . tep_href_link($PHP_SELF, $parameters . $page_name . '=' . ($current_page_number + 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_NEXT . '</a>';

to:

$display_links .= '&nbsp;&nbsp;<a href="' . tep_href_link($PHP_SELF, $parameters . $page_name . '=' . ($current_page_number + 1)) . '" class="splitPageLink">' . PREVNEXT_BUTTON_NEXT . '</a>';

admin/includes/functions/general.php

around line 27, change from:

function tep_redirect($url) {
  global $logger;

  if ( (strstr($url, "\n") != false) || (strstr($url, "\r") != false) ) {
    tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
  }

  if ( strpos($url, '&amp;') !== false ) {
    $url = str_replace('&amp;', '&', $url);
  }

  header('Location: ' . $url);

  if (STORE_PAGE_PARSE_TIME == 'true') {
    if (!is_object($logger)) $logger = new logger;
    $logger->timer_stop();
  }

  exit;
}

to:

function tep_redirect($url) {
  global $logger;

  if ( (strstr($url, "\n") != false) || (strstr($url, "\r") != false) ) {
    tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'SSL', false));
  }

  if ( strpos($url, '&amp;') !== false ) {
    $url = str_replace('&amp;', '&', $url);
  }

  header('Location: ' . $url);

  if (STORE_PAGE_PARSE_TIME == 'true') {
    if (!is_object($logger)) $logger = new logger;
    $logger->timer_stop();
  }

  exit;
}

around line 270, change from:

function tep_info_image($image, $alt, $width = '', $height = '') {
  if (tep_not_null($image) && (file_exists(DIR_FS_CATALOG_IMAGES . $image)) ) {
    $image = tep_image(DIR_WS_CATALOG_IMAGES . $image, $alt, $width, $height);
  } else {
    $image = TEXT_IMAGE_NONEXISTENT;
  }

  return $image;
}

to:

function tep_info_image($image, $alt, $width = '', $height = '') {
  if (tep_not_null($image) && (file_exists(DIR_FS_CATALOG_IMAGES . $image)) ) {
    $image = tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $image, $alt, $width, $height);
  } else {
    $image = TEXT_IMAGE_NONEXISTENT;
  }

  return $image;
}

admin/includes/functions/html_output.php

around line 15, change from:

function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL') {
  $page = tep_output_string($page);

  if ($page == '') {
    die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine the page link!<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
  }
  if ($connection == 'NONSSL') {
    $link = HTTP_SERVER . DIR_WS_ADMIN;
  } elseif ($connection == 'SSL') {
    if (ENABLE_SSL_CATALOG == 'true') {
      $link = HTTPS_SERVER . DIR_WS_ADMIN;
    } else {
      $link = HTTP_SERVER . DIR_WS_ADMIN;
    }
  } else {
    die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
  }
  if ($parameters == '') {
    $link = $link . $page . '?' . SID;
  } else {
    $link = $link . $page . '?' . tep_output_string($parameters) . '&' . SID;
  }

  while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);

  return $link;
}

to:

function tep_href_link($page = '', $parameters = '', $connection = 'SSL', $add_session_id = true) {
  global $request_type;

  $page = tep_output_string($page);

  if ($page == '') {
    die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine the page link!<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
  }

  if ($connection == 'NONSSL') {
    $link = HTTP_SERVER . DIR_WS_ADMIN;
  } elseif ($connection == 'SSL') {
    if (ENABLE_SSL == true) {
      $link = HTTPS_SERVER . DIR_WS_HTTPS_ADMIN;
    } else {
      $link = HTTP_SERVER . DIR_WS_ADMIN;
    }
  } else {
    die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
  }

  if (tep_not_null($parameters)) {
    $link .= $page . '?' . tep_output_string($parameters);
    $separator = '&';
  } else {
    $link .= $page;
    $separator = '?';
  }

  while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);

// Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined
  if ( ($add_session_id == true) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
    if (tep_not_null($SID)) {
      $_sid = $SID;
    } elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL == true) ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {
      if (HTTP_COOKIE_DOMAIN != HTTPS_COOKIE_DOMAIN) {
        $_sid = tep_session_name() . '=' . tep_session_id();
      }
    }
  }

  if (isset($_sid)) {
    $link .= $separator . tep_output_string($_sid);
  }

  while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

  return $link;
}

admin/includes/functions/sessions.php

around line 91, change from:

if ($sane_session_id == false) {
  tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
}

register_shutdown_function('session_write_close');

to:

if ($sane_session_id == false) {
  tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'SSL', false));
}

register_shutdown_function('session_write_close');

admin/includes/header.php

around line 20, change from:

<td colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, '', 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . 'oscommerce.png', 'osCommerce Online Merchant v' . tep_get_version()) . '</a>'; ?></td>

to:

<td colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image(DIR_WS_IMAGES . 'oscommerce.png', 'osCommerce Online Merchant v' . tep_get_version()) . '</a>'; ?></td>

around line 23, change from:

<td class="headerBarContent">&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, '', 'NONSSL') . '" class="headerLink">' . HEADER_TITLE_ADMINISTRATION . '</a> &nbsp;|&nbsp; <a href="' . tep_catalog_href_link() . '" class="headerLink">' . HEADER_TITLE_ONLINE_CATALOG . '</a> &nbsp;|&nbsp; <a href="http://www.oscommerce.com" class="headerLink">' . HEADER_TITLE_SUPPORT_SITE . '</a>'; ?></td>

to:

<td class="headerBarContent">&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '" class="headerLink">' . HEADER_TITLE_ADMINISTRATION . '</a> &nbsp;|&nbsp; <a href="' . tep_catalog_href_link() . '" class="headerLink">' . HEADER_TITLE_ONLINE_CATALOG . '</a> &nbsp;|&nbsp; <a href="http://www.oscommerce.com" class="headerLink">' . HEADER_TITLE_SUPPORT_SITE . '</a>'; ?></td>

admin/includes/modules/security_check/extended/admin_backup_directory_listing.php

around line 26, change from:

$request = $this->getHttpRequest(tep_href_link('backups/', '', 'NONSSL'));

to:

$request = $this->getHttpRequest(tep_href_link('backups/'));

admin/includes/modules/security_check/extended/admin_backup_file.php

around line 57, change from:

$request = $this->getHttpRequest(tep_href_link('backups/' . $backup_file, '', 'NONSSL'));

to:

$request = $this->getHttpRequest(tep_href_link('backups/' . $backup_file));

admin/includes/modules/security_check/extended/ext_directory_listing.php

around line 26, change from:

$request = $this->getHttpRequest(tep_catalog_href_link('ext/', '', 'NONSSL'));

to:

$request = $this->getHttpRequest(tep_catalog_href_link('ext/'));

admin/includes/template_top.php

around line 19, change from:

<base href="<?php echo HTTP_SERVER . DIR_WS_ADMIN; ?>" />
<!--[if IE]><script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/excanvas.min.js'); ?>"></script><![endif]-->
<link rel="stylesheet" type="text/css" href="<?php echo tep_catalog_href_link('ext/jquery/ui/redmond/jquery-ui-1.10.4.min.css'); ?>">
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/jquery-1.11.1.min.js'); ?>"></script>
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/jquery-ui-1.10.4.min.js'); ?>"></script>

to:

<base href="<?php echo ($request_type == 'SSL') ? HTTPS_SERVER . DIR_WS_HTTPS_ADMIN : HTTP_SERVER . DIR_WS_ADMIN; ?>" />
<!--[if IE]><script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/excanvas.min.js', '', 'SSL'); ?>"></script><![endif]-->
<link rel="stylesheet" type="text/css" href="<?php echo tep_catalog_href_link('ext/jquery/ui/redmond/jquery-ui-1.10.4.min.css', '', 'SSL'); ?>">
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/jquery-1.11.1.min.js', '', 'SSL'); ?>"></script>
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/jquery-ui-1.10.4.min.js', '', 'SSL'); ?>"></script>

around line 28, change from:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/i18n/jquery.ui.datepicker-' . JQUERY_DATEPICKER_I18N_CODE . '.js'); ?>"></script>

to:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/i18n/jquery.ui.datepicker-' . JQUERY_DATEPICKER_I18N_CODE . '.js', '', 'SSL'); ?>"></script>

around line 36, change from:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.min.js'); ?>"></script>
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.time.min.js'); ?>"></script>

to:

<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.min.js', '', 'SSL'); ?>"></script>
<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.time.min.js', '', 'SSL'); ?>"></script>

admin/invoice.php

around line 39, change from:

<td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_CATALOG_IMAGES . 'store_logo.png', STORE_NAME); ?></td>

to:

<td class="pageHeading" align="right"><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'store_logo.png', STORE_NAME); ?></td>

admin/packingslip.php

around line 38, change from:

<td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_CATALOG_IMAGES . 'store_logo.png', STORE_NAME); ?></td>

to:

<td class="pageHeading" align="right"><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'store_logo.png', STORE_NAME); ?></td>

admin/products_attributes.php

around line 207, change from:

<td align="right" colspan="3" class="smallText"><br /><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="right" colspan="3" class="smallText"><br /><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 216, change from:

<td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option&option_id=' . $HTTP_GET_VARS['option_id'] . '&' . $page_info, 'NONSSL'), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option&option_id=' . $HTTP_GET_VARS['option_id'] . '&' . $page_info), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 260, change from:

echo '<form name="option" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_name&' . $page_info, 'NONSSL') . '" method="post">';

to:

echo '<form name="option" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_name&' . $page_info) . '" method="post">';

around line 270, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 277, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info)) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info)); ?>&nbsp;</td>

around line 296, change from:

echo '<form name="options" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_options&' . $page_info, 'NONSSL') . '" method="post"><input type="hidden" name="products_options_id" value="' . $next_id . '">';

to:

echo '<form name="options" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_options&' . $page_info) . '" method="post"><input type="hidden" name="products_options_id" value="' . $next_id . '">';

around line 364, change from:

<td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 373, change from:

<td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_value&value_id=' . $HTTP_GET_VARS['value_id'] . '&' . $page_info, 'NONSSL'), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_value&value_id=' . $HTTP_GET_VARS['value_id'] . '&' . $page_info), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 420, change from:

echo '<form name="values" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_value&' . $page_info, 'NONSSL') . '" method="post">';

to:

echo '<form name="values" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_value&' . $page_info) . '" method="post">';

around line 442, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 450, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info)) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info)); ?>&nbsp;</td>

around line 467, change from:

echo '<form name="values" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_option_values&' . $page_info, 'NONSSL') . '" method="post">';

to:

echo '<form name="values" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_option_values&' . $page_info) . '" method="post">';

around line 600, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 643, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_attribute&attribute_id=' . $HTTP_GET_VARS['attribute_id'] . '&' . $page_info), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_attribute&attribute_id=' . $HTTP_GET_VARS['attribute_id'] . '&' . $page_info), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info)); ?>&nbsp;</td>

around line 653, change from:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL')); ?>&nbsp;</td>

to:

<td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info)) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info)); ?>&nbsp;</td>

admin/reviews.php

around line 161, change from:

<td class="main"><strong><?php echo ENTRY_RATING; ?></strong>&nbsp;<?php echo tep_image(DIR_WS_CATALOG_IMAGES . 'stars_' . $rInfo->reviews_rating . '.gif', sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating)); ?>&nbsp;<small>[<?php echo sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating); ?>]</small></td>

to:

<td class="main"><strong><?php echo ENTRY_RATING; ?></strong>&nbsp;<?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'stars_' . $rInfo->reviews_rating . '.gif', sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating)); ?>&nbsp;<small>[<?php echo sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating); ?>]</small></td>

around line 186, change from:

<td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link($back_url, $back_url_params, 'NONSSL')); ?></td>

to:

<td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link($back_url, $back_url_params)); ?></td>

admin/specials.php

around line 25, change from:

tep_redirect(tep_href_link(FILENAME_SPECIALS, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . 'sID=' . $HTTP_GET_VARS['id'], 'NONSSL'));

to:

tep_redirect(tep_href_link(FILENAME_SPECIALS, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . 'sID=' . $HTTP_GET_VARS['id']));

around line 111, change from:

<tr><form name="new_special" action="<?php echo tep_href_link(FILENAME_SPECIALS, tep_get_all_get_params(array('action', 'info', 'sID')) . 'action=' . $form_action, 'NONSSL'); ?>" method="post"><?php if ($form_action == 'update') echo tep_draw_hidden_field('specials_id', $HTTP_GET_VARS['sID']); ?>

to:

<tr><form name="new_special" action="<?php echo tep_href_link(FILENAME_SPECIALS, tep_get_all_get_params(array('action', 'info', 'sID')) . 'action=' . $form_action); ?>" method="post"><?php if ($form_action == 'update') echo tep_draw_hidden_field('specials_id', $HTTP_GET_VARS['sID']); ?>

around line 179, change from:

echo tep_image(DIR_WS_IMAGES . 'icon_status_green.gif', IMAGE_ICON_STATUS_GREEN, 10, 10) . '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_SPECIALS, 'action=setflag&flag=0&id=' . $specials['specials_id'], 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . 'icon_status_red_light.gif', IMAGE_ICON_STATUS_RED_LIGHT, 10, 10) . '</a>';

to:

echo tep_image(DIR_WS_IMAGES . 'icon_status_green.gif', IMAGE_ICON_STATUS_GREEN, 10, 10) . '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_SPECIALS, 'action=setflag&flag=0&id=' . $specials['specials_id']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_status_red_light.gif', IMAGE_ICON_STATUS_RED_LIGHT, 10, 10) . '</a>';

around line 181, change from:

echo '<a href="' . tep_href_link(FILENAME_SPECIALS, 'action=setflag&flag=1&id=' . $specials['specials_id'], 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . 'icon_status_green_light.gif', IMAGE_ICON_STATUS_GREEN_LIGHT, 10, 10) . '</a>&nbsp;&nbsp;' . tep_image(DIR_WS_IMAGES . 'icon_status_red.gif', IMAGE_ICON_STATUS_RED, 10, 10);

to:

echo '<a href="' . tep_href_link(FILENAME_SPECIALS, 'action=setflag&flag=1&id=' . $specials['specials_id']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_status_green_light.gif', IMAGE_ICON_STATUS_GREEN_LIGHT, 10, 10) . '</a>&nbsp;&nbsp;' . tep_image(DIR_WS_IMAGES . 'icon_status_red.gif', IMAGE_ICON_STATUS_RED, 10, 10);

admin/stats_customers.php

around line 56, change from:

<tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CUSTOMERS, 'search=' . $customers['customers_lastname'], 'NONSSL'); ?>'">

to:

<tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CUSTOMERS, 'search=' . $customers['customers_lastname']); ?>'">

around line 58, change from:

<td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CUSTOMERS, 'search=' . $customers['customers_lastname'], 'NONSSL') . '">' . $customers['customers_firstname'] . ' ' . $customers['customers_lastname'] . '</a>'; ?></td>

to:

<td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CUSTOMERS, 'search=' . $customers['customers_lastname']) . '">' . $customers['customers_firstname'] . ' ' . $customers['customers_lastname'] . '</a>'; ?></td>

admin/stats_products_purchased.php

around line 50, change from:

<tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_PURCHASED . '?page=' . $HTTP_GET_VARS['page'], 'NONSSL'); ?>'">

to:

<tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_PURCHASED . '?page=' . $HTTP_GET_VARS['page']); ?>'">

around line 52, change from:

<td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_PURCHASED . '?page=' . $HTTP_GET_VARS['page'], 'NONSSL') . '">' . $products['products_name'] . '</a>'; ?></td>

to:

<td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_PURCHASED . '?page=' . $HTTP_GET_VARS['page']) . '">' . $products['products_name'] . '</a>'; ?></td>

admin/stats_products_viewed.php

around line 49, change from:

<tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_VIEWED . '?page=' . $HTTP_GET_VARS['page'], 'NONSSL'); ?>'">

to:

<tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_VIEWED . '?page=' . $HTTP_GET_VARS['page']); ?>'">

around line 51, change from:

<td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_VIEWED . '?page=' . $HTTP_GET_VARS['page'], 'NONSSL') . '">' . $products['products_name'] . '</a> (' . $products['name'] . ')'; ?></td>

to:

<td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'action=new_product_preview&read=only&pID=' . $products['products_id'] . '&origin=' . FILENAME_STATS_PRODUCTS_VIEWED . '?page=' . $HTTP_GET_VARS['page']) . '">' . $products['products_name'] . '</a> (' . $products['name'] . ')'; ?></td>

admin/whos_online.php

around line 59, change from:

echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_WHOS_ONLINE, tep_get_all_get_params(array('info', 'action')) . 'info=' . $whos_online['session_id'], 'NONSSL') . '\'">' . "\n";

to:

echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_WHOS_ONLINE, tep_get_all_get_params(array('info', 'action')) . 'info=' . $whos_online['session_id']) . '\'">' . "\n";

View online at GitHub

Content Modules (6+ files)

This changeset introduces a new Content Modules implementation where the content of a page is loaded through modules. This is introduced for the Login, My Account, and Checkout Success pages.

Although it is easy to add support for Content Modules to existing stores, updating the Login, My Account, and Checkout Success pages will be harder and require further source code changes the more customized those pages are. Please consult with your developer, our partners, or our community forum on how to best integrate the Content Modules feature into your existing pages.

Step 1: Content Modules Administration Page

Step 1 adds the content modules administration page to the Administration Tool -> Modules menu.

Copy the following files to their respective destination:

admin/includes/boxes/modules_content.php
admin/includes/languages/english/modules/boxes/modules_content.php
admin/includes/languages/english/modules_content.php
admin/modules_content.php

Please copy the english language definition files to the other language directories you have installed and update the definitions for that specific language.

Step 2: Content Modules

Step 2 adds the actual content modules to your store installation.

Copy the following directories to their respective destination:

ext/modules/content
includes/languages/english/modules/content
includes/modules/content
includes/modules/pages

Please copy the english language definition files to the other language directories you have installed and update the definitions for that specific language.

This adds the following Content Modules which can be installed and configured on the Administration Tool -> Modules -> Content Modules -> Install page:

  • Account
    • Set Password
    • Braintree Cards Management Page
    • Sage Pay Cards Management Page
    • Stripe Cards Management Page
  • Checkout Success
    • Downloads
    • Product Notifications
    • Redirect Old Order
    • Thank You
  • Login
    • Create Account
    • Login
    • Log In with PayPal
The modules that are emphasized are from additional modules included in this release.

Step 3: Template Class

Step 3 adds functions to the template class to call and initialize content modules.

includes/classes/osc_template.php

around line 14, change from:

var $_title;
var $_blocks = array();
var $_grid_container_width = 24;
var $_grid_content_width = 16;
var $_grid_column_width = 4;

to:

var $_title;
var $_blocks = array();
var $_content = array();
var $_grid_container_width = 24;
var $_grid_content_width = 16;
var $_grid_column_width = 4;
var $_data = array();

around line 110, add the following class functions:

function addContent($content, $group) {
  $this->_content[$group][] = $content;
}

function hasContent($group) {
  return (isset($this->_content[$group]) && !empty($this->_content[$group]));
}

function getContent($group) {
  global $language;

  if ( !class_exists('tp_' . $group) && file_exists(DIR_WS_MODULES . 'pages/tp_' . $group . '.php') ) {
    include(DIR_WS_MODULES . 'pages/tp_' . $group . '.php');
  }

  if ( class_exists('tp_' . $group) ) {
    $template_page_class = 'tp_' . $group;
    $template_page = new $template_page_class();
    $template_page->prepare();
  }

  foreach ( $this->getContentModules($group) as $module ) {
    if ( !class_exists($module) ) {
      if ( file_exists(DIR_WS_MODULES . 'content/' . $group . '/' . $module . '.php') ) {
        if ( file_exists(DIR_WS_LANGUAGES . $language . '/modules/content/' . $group . '/' . $module . '.php') ) {
          include(DIR_WS_LANGUAGES . $language . '/modules/content/' . $group . '/' . $module . '.php');
        }

        include(DIR_WS_MODULES . 'content/' . $group . '/' . $module . '.php');
      }
    }

    if ( class_exists($module) ) {
      $mb = new $module();

      if ( $mb->isEnabled() ) {
        $mb->execute();
      }
    }
  }

  if ( class_exists('tp_' . $group) ) {
    $template_page->build();
  }

  if ($this->hasContent($group)) {
    return implode("\n", $this->_content[$group]);
  }
}

function getContentModules($group) {
  $result = array();

  foreach ( explode(';', MODULE_CONTENT_INSTALLED) as $m ) {
    $module = explode('/', $m, 2);

    if ( $module[0] == $group ) {
      $result[] = $module[1];
    }
  }

  return $result;
}

Step 4: Page Updates

Step 4 updates the Login, My Account, and Checkout Success pages to use the installed and configured Content Modules for the page layout.

Login Page

login.php

The code authenticating the customer and presenting the login form and create account link have moved from the login.php page to the Login Form and Create Account Link Content Modules. Due to the source code changes involved and possible customizations applied to your login page, it is recommended to review and compare your login.php page with the v2.3.4 version and apply any customizations in the login process to the Login Form Content Module.

The Login Form Content Module assigns the global $login_customer_id variable with the customer ID when the customer has been successfully authenticated. This value is then detected in the login.php page and continues to log the customer into their session.

The location of the Login Form Content Module files are at:

  • includes/languages/english/modules/content/login/cm_login_form.php (language definitions)
  • includes/modules/content/login/cm_login_form.php (main class which authenticates the customer)
  • includes/modules/content/login/templates/login_form.php (template)

The location of the Create Account Link Content Module files are at:

  • includes/languages/english/modules/content/login/cm_create_account_link.php (language definitions)
  • includes/modules/content/login/cm_create_account_link.php (main class)
  • includes/modules/content/login/templates/create_account_link.php (template)

The login.php file included in v2.3.4 can be found at:

https://github.com/osCommerce/oscommerce2/blob/3eaa3d1d0e9646329a1540bc3b63c192b4306f1c/catalog/login.php

includes/languages/english/login.php

The following language definitions have moved and have been replaced by definitions in the Content Modules.

Old Definition Content Module New Definition
HEADING_NEW_CUSTOMER Create Account Link MODULE_CONTENT_LOGIN_HEADING_NEW_CUSTOMER
TEXT_NEW_CUSTOMER Create Account Link MODULE_CONTENT_LOGIN_TEXT_NEW_CUSTOMER
TEXT_NEW_CUSTOMER_INTRODUCTION Create Account Link MODULE_CONTENT_LOGIN_TEXT_NEW_CUSTOMER_INTRODUCTION
HEADING_RETURNING_CUSTOMER Login Form MODULE_CONTENT_LOGIN_HEADING_RETURNING_CUSTOMER
TEXT_RETURNING_CUSTOMER Login Form MODULE_CONTENT_LOGIN_TEXT_RETURNING_CUSTOMER
TEXT_PASSWORD_FORGOTTEN Login Form MODULE_CONTENT_LOGIN_TEXT_PASSWORD_FORGOTTEN
TEXT_LOGIN_ERROR Login Form MODULE_CONTENT_LOGIN_TEXT_LOGIN_ERROR
My Account Page

account.php

The structured links shown on the My Account page are now generated from an array which Content Modules can manipulate. Content Modules can add new sections to the My Account page, add links to existing sections, and also remove or replace links in special occassions.

The standard links for the My Account page are defined in a Content Module Page class which the My Account Content Modules have access to.

The location of the My Account Content Module Page class is at:

  • includes/modules/pages/tp_account.php

The standard links for the My Account page include:

  • My Account
    • Edit Account
    • Address Book
    • Change Password
  • Orders
    • Order History
  • Notifications
    • Newsletters
    • Product Notifications

This release introduces a My Account Set Password Content Module that automatically replaces the Change Password link to a Set Password link for accounts that have been created without a password (eg, accounts created through Log In with PayPal or when guests purchase an order with PayPal Express Checkout).

The account.php file included in v2.3.4 can be found at:

https://github.com/osCommerce/oscommerce2/blob/3eaa3d1d0e9646329a1540bc3b63c192b4306f1c/catalog/account.php

Checkout Success Page

checkout_success.php

The content of the checkout success page has moved and is now built with the following Content Modules:

  • Thank You
  • Product Notifications
  • Downloads

The checkout success page assigns the global $order_id variable with the order ID of the customers last order which the Checkout Success Content Modules have access to.

The location of the Thank You Content Module files are at:

  • includes/languages/english/modules/content/checkout_success/cm_cs_thank_you.php (language definitions)
  • includes/modules/content/checkout_success/cm_cs_thank_you.php (main class)
  • includes/modules/content/checkout_success/templates/thank_you.php (template)

The location of the Product Notifications Content Module files are at:

  • includes/languages/english/modules/content/checkout_success/cm_cs_product_notifications.php (language definitions)
  • includes/modules/content/checkout_success/cm_cs_product_notifications.php (main class)
  • includes/modules/content/checkout_success/templates/product_notifications.php (template)

The location of the Downloads Content Module files are at:

  • includes/languages/english/modules/content/checkout_success/cm_cs_downloads.php (language definitions)
  • includes/modules/content/checkout_success/cm_cs_downloads.php (main class)

The checkout_success.php file included in v2.3.4 can be found at:

https://github.com/osCommerce/oscommerce2/blob/3eaa3d1d0e9646329a1540bc3b63c192b4306f1c/catalog/checkout_success.php

includes/languages/english/checkout_success.php

The following language definitions have moved and have been replaced by definitions in the Content Modules.

Old Definition Content Module New Definition
TEXT_SUCCESS Thank You MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_SUCCESS
TEXT_SEE_ORDERS Thank You MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_SEE_ORDERS
TEXT_CONTACT_STORE_OWNER Thank You MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_CONTACT_STORE_OWNER
TEXT_THANKS_FOR_SHOPPING Thank You MODULE_CONTENT_CHECKOUT_SUCCESS_TEXT_THANKS_FOR_SHOPPING
TEXT_NOTIFY_PRODUCTS Product Notifications MODULE_CONTENT_CHECKOUT_SUCCESS_PRODUCT_NOTIFICATIONS_TEXT_NOTIFY_PRODUCTS
TABLE_HEADING_DOWNLOAD_DATE Downloads TABLE_HEADING_DOWNLOAD_DATE
TABLE_HEADING_DOWNLOAD_COUNT Downloads TABLE_HEADING_DOWNLOAD_COUNT
HEADING_DOWNLOAD Downloads HEADING_DOWNLOAD
FOOTER_DOWNLOAD Downloads FOOTER_DOWNLOAD

View online at GitHub

Version Update (1 file)

This changeset updates the version file.

includes/version.php

change line 1 from:

2.3.3.4

to:

2.3.4

View online at GitHub

Administration Dashboard Latest News and Add-Ons (4+ files)

This changeset updates the Administration Tool Dashboard Latest News and Latest Add-Ons modules.

Copy the following files and directories to their respective directories:

admin/images/icon_facebook.png
admin/images/icon_google_plus.png
admin/images/icon_oscommerce.png
admin/images/icon_twitter.png
admin/includes/languages/english/modules/dashboard/d_latest_addons.php
admin/includes/languages/english/modules/dashboard/d_latest_news.php
admin/includes/modules/dashboard/d_latest_addons.php
admin/includes/modules/dashboard/d_latest_news.php

Please also copy and update the language definition file to the other languages you have installed.
It is safe to overwrite existing files with the new version.

View online at GitHub

Administration Tool Orders Box (3 files)

This changeset moves the Administration Tool -> Customers -> Orders page into a new Administration Tool -> Orders section.

Copy the following files and directories to their respective directories:

admin/includes/boxes/orders.php

In:

admin/includes/boxes/customers.php

around line 20, remove the following lines:

),
array(
  'code' => FILENAME_ORDERS,
  'title' => BOX_CUSTOMERS_ORDERS,
  'link' => tep_href_link(FILENAME_ORDERS)

admin/includes/languages/english.php

around line 20, change from:

define('BOX_CUSTOMERS_ORDERS', 'Orders');

to:

// orders box text in includes/boxes/orders.php
define('BOX_HEADING_ORDERS', 'Orders');
define('BOX_ORDERS_ORDERS', 'Orders');

View online at GitHub

Payment Acceptance Box (2+ files)

This changeset introduces a new Payment Acceptance box that promotes the payment methods accepted on the store.

Copy the following files and directories to their respective directories:

images/card_acceptance
includes/languages/english/modules/boxes/bm_card_acceptance.php
includes/modules/boxes/bm_card_acceptance.php

Please also copy and update the language definition file to the other languages you have installed.

After this changeset is applied, the module can be installed from the Administration Tool -> Modules -> Boxes -> Install page.

View online at GitHub

PayPal Modules (23 files)

This changeset updates and introduces new PayPal modules.

Payment Modules

PayPal Express Checkout

Copy the following files to their respective directories:

ext/modules/payment/paypal/express.php
ext/modules/payment/paypal/paypal.com.crt
includes/languages/english/modules/payment/paypal_express.php
includes/modules/payment/paypal_express.php

Delete the following file:

admin/ext/modules/payment/paypal/paypal_express.php

PayPal Payments Standard

Copy the following files to their respective directories:

ext/modules/payment/paypal/paypal.com.crt
ext/modules/payment/paypal/standard_ipn.php
includes/languages/english/modules/payment/paypal_standard.php
includes/modules/payment/paypal_standard.php

PayPal Payments Pro (Direct Payment)

Copy the following files to their respective directories:

ext/modules/payment/paypal/paypal.com.crt
includes/languages/english/modules/payment/paypal_pro_dp.php
includes/modules/payment/paypal_pro_dp.php

PayPal Payments Pro (Hosted Solution)

Copy the following files to their respective directories:

ext/modules/payment/paypal/hosted_checkout.php
ext/modules/payment/paypal/images/hss_load.gif
ext/modules/payment/paypal/paypal.com.crt
ext/modules/payment/paypal/pro_hosted_ipn.php
includes/languages/english/modules/payment/paypal_pro_hs.php
includes/modules/payment/paypal_pro_hs.php

PayPal Express Checkout (Payflow Edition)

Copy the following files to their respective directories:

ext/modules/payment/paypal/express_payflow.php
ext/modules/payment/paypal/paypal.com.crt
includes/languages/english/modules/payment/paypal_pro_payflow_ec.php
includes/modules/payment/paypal_pro_payflow_ec.php

PayPal Payments Pro (Payflow Edition)

Copy the following files to their respective directories:

ext/modules/payment/paypal/paypal.com.crt
includes/languages/english/modules/payment/paypal_pro_payflow_dp.php
includes/modules/payment/paypal_pro_payflow_dp.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the modules can be installed from the Administration Tool -> Modules -> Payment -> Install page, or configured from the Administration Tool -> Modules -> Payment page if they were previously installed.

It is important to review the module configuration paramters of modules that were previously installed to make sure new parameters have been configured properly.
It is safe to overwrite existing files with the new version.

Content Modules

Log In with PayPal

Copy the following files to their respective directories:

ext/modules/payment/paypal/paypal.com.crt
includes/languages/english/modules/content/login/cm_paypal_login.php
includes/modules/content/login/cm_paypal_login.php
includes/modules/content/login/templates/paypal_login.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the module can be installed from the Administration Tool -> Modules -> Content -> Install page.

View online at GitHub

Sage Pay Modules (12 files)

This changeset updates and introduces new Sage Pay modules.

Payment Modules

Sage Pay Direct

Copy the following files to their respective directories:

ext/modules/payment/sage_pay/checkout.php
ext/modules/payment/sage_pay/direct_3dauth.php
ext/modules/payment/sage_pay/errors.php
ext/modules/payment/sage_pay/redirect.php
includes/languages/english/modules/payment/sage_pay_direct.php
includes/modules/payment/sage_pay_direct.php

Sage Pay Form

Copy the following files to their respective directories:

ext/modules/payment/sage_pay/errors.php
includes/languages/english/modules/payment/sage_pay_form.php
includes/modules/payment/sage_pay_form.php

Sage Pay Server

Copy the following files to their respective directories:

ext/modules/payment/sage_pay/checkout.php
ext/modules/payment/sage_pay/errors.php
ext/modules/payment/sage_pay/redirect.php
ext/modules/payment/sage_pay/server.php
includes/languages/english/modules/payment/sage_pay_server.php
includes/modules/payment/sage_pay_server.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the modules can be installed from the Administration Tool -> Modules -> Payment -> Install page, or configured from the Administration Tool -> Modules -> Payment page if they were previously installed.

It is important to review the module configuration paramters of modules that were previously installed to make sure new parameters have been configured properly.
It is safe to overwrite existing files with the new version.

Content Modules

Sage Pay Cards Management Page

Copy the following files to their respective directories:

ext/modules/content/account/sage_pay/cards.php
includes/languages/english/modules/content/account/cm_account_sage_pay_cards.php
includes/modules/content/account/cm_account_sage_pay_cards.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the module can be installed from the Administration Tool -> Modules -> Content -> Install page.

View online at GitHub

Authorize.net Modules (7 files)

This changeset updates and introduces new Authorize.net modules.

Payment Modules

Authorize.net Advanced Integration Method (AIM)

Copy the following files to their respective directories:

ext/modules/payment/authorizenet/authorize.net.crt
includes/languages/english/modules/payment/authorizenet_cc_aim.php
includes/modules/payment/authorizenet_cc_aim.php

Authorize.net Server Integration Method (SIM)

Copy the following files to their respective directories:

includes/languages/english/modules/payment/authorizenet_cc_sim.php
includes/modules/payment/authorizenet_cc_sim.php

Authorize.net Direct Post Method (DPM)

Copy the following files to their respective directories:

includes/languages/english/modules/payment/authorizenet_cc_dpm.php
includes/modules/payment/authorizenet_cc_dpm.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the modules can be installed from the Administration Tool -> Modules -> Payment -> Install page, or configured from the Administration Tool -> Modules -> Payment page if they were previously installed.

It is important to review the module configuration paramters of modules that were previously installed to make sure new parameters have been configured properly.
It is safe to overwrite existing files with the new version.

View online at GitHub

Stripe Modules (5 files)

This changeset introduces new Stripe modules.

Payment Modules

Stripe.js

Copy the following files to their respective directories:

includes/languages/english/modules/payment/stripe.php
includes/modules/payment/stripe.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the modules can be installed from the Administration Tool -> Modules -> Payment -> Install page, or configured from the Administration Tool -> Modules -> Payment page if they were previously installed.

Content Modules

Stripe Cards Management Page

Copy the following files to their respective directories:

ext/modules/content/account/stripe/cards.php
includes/languages/english/modules/content/account/cm_account_stripe_cards.php
includes/modules/content/account/cm_account_stripe_cards.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the module can be installed from the Administration Tool -> Modules -> Content -> Install page.

View online at GitHub

Braintree Modules (5+ files)

This changeset introduces new Braintree modules.

Payment Modules

Braintree

Copy the following files and directories to their respective directories:

includes/languages/english/modules/payment/braintree_cc.php
includes/modules/payment/braintree_cc
includes/modules/payment/braintree_cc.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the modules can be installed from the Administration Tool -> Modules -> Payment -> Install page, or configured from the Administration Tool -> Modules -> Payment page if they were previously installed.

Content Modules

Braintree Cards Management Page

Copy the following files to their respective directories:

ext/modules/content/account/braintree/cards.php
includes/languages/english/modules/content/account/cm_account_braintree_cards.php
includes/modules/content/account/cm_account_braintree_cards.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the module can be installed from the Administration Tool -> Modules -> Content -> Install page.

View online at GitHub

WorldPay Modules (3 files)

This changeset updates the WorldPay Hosted Payment Pages module.

Payment Modules

WorldPay Hosted Payment Pages

Copy the following files and directories to their respective directories:

ext/modules/payment/rbsworldpay/hosted_callback.php
includes/languages/english/modules/payment/rbsworldpay_hosted.php
includes/modules/payment/rbsworldpay_hosted.php

Please also copy and update the language definition file to the other languages you have installed.

After the files have been copied, the modules can be installed from the Administration Tool -> Modules -> Payment -> Install page, or configured from the Administration Tool -> Modules -> Payment page if they were previously installed.

It is important to review the module configuration paramters of modules that were previously installed to make sure new parameters have been configured properly.
It is safe to overwrite existing files with the new version.

View online at GitHub

Thank You!

We'd like to thank the community for their feedback on our releases. In addition, we thank the following people who participated in the development of this release.

Bug Reporters
dculley
Gergely
mattjt83
wHiTeHaT
Testers
altoid
ArtcoInc
burt
Gyakutsuki
hax8220
joli1811
tim_ver
Tsimi
wHiTeHaT

Reference

A full list of source code changes can be seen at:

https://github.com/osCommerce/oscommerce2/compare/v2.3.3.4...upgrade234