В данной статье будет рассказано, как связать между собой osCommerce 2.2 и Drupal.

Что имеется в виду под интеграцией?
Под интеграцией Drupal и osCommerce 2.2 имеется в виду общая авторизация пользователей и синхронизация их учетной и профильной информации.
Интеграция Drupal и osCommerce 2.2 - это общая база пользователей и общая авторизация, т.е. входя под своим логином/паролем на Drupal, Вы авторизуетесь и в магазине osCommerce 2.2, также и наоборот.
Главная идея в том, что не нужно два раза регистрироваться (отдельно в Drupal и отдельно в магазине) и входить два раза (сначала в Drupal, затем в магазин), а также два раза менять свои пользовательские данные.

Требования к версиям:
Drupal версии 5 или 6.
osCommerce 2.2.

Скачать Drupal можно на официальном сайте: http://drupal.org/download
Скачать osCommerce 2.2 можно на официальном сайте http://www.oscommerce.com/solutions/downloads

Настройка состоит из двух частей:
Настройки osCommerce 2.2
Настройка Drupal

Настройки osCommerce 2.2

1. Скачайте архив osc_api - http://kypi.ru/vam/drupal/osc_api.zip
2. Перепишите следующие файлы из архива в магазин:
/oscommerce_api.php
/oscommerce_api_subs.php
/includes/modules/osc_api.php
/includes/modules/osc_api_common.zip
3. Теперь нужно внести изменения в скрипты osCommerce (Вы можете взять вот здесь http://kypi.ru/vam/drupal/osc_patched.zip уже испроавленные файлы, но учтите, это исправленные оригинальные файлы osC 2.2 rc2, если Вы вносили в свой магазин какие-то изменения, лучше вручную внести исправления в файлы, список исправлений ниже):
Открывайте файл /account.php, ищите сверху:
if (!tep_session_is_registered('customer_id')) {
$navigation->set_snapshot();
tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
}
добавляйте после:
osc_api_update_external('view', OSC_SYNC_TO_OSC, (int)$customer_id, (int)$customer_id, "", "", "");

Открывайте файл /account_edit.php, ищите:
if (ACCOUNT_DOB == 'true') $sql_data_array['customers_dob'] = tep_date_raw($dob);
добавляйте после:
$name = $firstname.' '.$lastname;
osc_api_update_external('update', OSC_SYNC_TO_EXTERNAL, (int)$customer_id, (int)$customer_id, $name, $email_address, '', $sql_data_array);

Открывайте файл /account_password.php, ищите:
tep_db_query("update " . TABLE_CUSTOMERS_INFO . " set customers_info_date_account_last_modified = now() where customers_info_id = '" . (int)$customer_id . "'");
добавляйте после:
osc_api_update_external('update', OSC_SYNC_TO_EXTERNAL, (int)$customer_id, (int)$customer_id, '', '', $password_new);

Открывайте файл /create_account.php, ищите:
$name = $firstname . ' ' . $lastname;
добавляйте после:
osc_api_register((int)$customer_id, (int)$customer_id, $name, $email_address, $password, $sql_data_array);

Открывайте файл /login.php, ищите:
$password = tep_db_prepare_input($HTTP_POST_VARS['password']);
добавляйте после:
//$username = tep_db_prepare_input($_POST['username']);
$username = $email_address;

global $oscommerce_config, $oscommerce_user;
if (!osc_api_get_user(0, $username, $email_address, $password)) {
$login_external = osc_api_auth_external($username, $email_address, $password);
if ($login_external) {
$login_external = osc_api_register_external('', $email_address, $password);
}
}
elseif (!tep_validate_password($password, $oscommerce_user['password'])) {
$login_external = osc_api_auth_external($username, $email_address, $password);
if ($login_external) {
if (_osc_api_settings())
$login_external = oscommerce_api_update_user($oscommerce_user['customer_id'], '', $password, '');
}
}
else {
$login_external = false;
}

Ищите:
$cart->restore_contents();

добавляйте после:
$username = $customer_first_name.' '.$customer_first_name;
osc_api_login((int)$customer_id, $username, $email_address, $password);

Открывайте файл /logoff.php, ищите:
$cart->reset();
добавляйте после:
osc_api_logout();

Открывайте файл /includes/functions/database.php, ищите:
function tep_db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link') {
меняйте на:
function tep_db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link', $use_pconnect = USE_PCONNECT, $new_link = false) {

ищите:
if ($$link) mysql_select_db($database);

return $$link;
}

меняйте на:
//if ($$link) mysql_select_db($database);
if ($$link){
@mysql_select_db($database);
//@mysql_query("SET NAMES 'cp1251'");
if (defined('DB_CHARACTER_SET')) {
$db_character_set = DB_CHARACTER_SET;
if (preg_match('~^\w+$~', $db_character_set) === 1)
@mysql_query("SET NAMES '$db_character_set' COLLATE '". $db_character_set ."_general_ci'");
}
}

Открывайте файл /admin/includes/functions/database.php, ищите:
function tep_db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link') {
меняйте на:
function tep_db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link', $use_pconnect = USE_PCONNECT, $new_link = false) {

ищите:
if ($$link) mysql_select_db($database);

return $$link;
}

меняйте на:
//if ($$link) mysql_select_db($database);
if ($$link){
@mysql_select_db($database);
//@mysql_query("SET NAMES 'cp1251'");
if (defined('DB_CHARACTER_SET')) {
$db_character_set = DB_CHARACTER_SET;
if (preg_match('~^\w+$~', $db_character_set) === 1)
@mysql_query("SET NAMES '$db_character_set' COLLATE '". $db_character_set ."_general_ci'");
}
}

Открывайте файл /includes/application_top.php, ищите:
// include the who's online functions
require(DIR_WS_FUNCTIONS . 'whos_online.php');
tep_update_whos_online();
добавляйте до:
require_once(DIR_WS_MODULES .'osc_api.php');
_osc_api_config_settings();
osc_api_authenticate_user();

ищите:
require(DIR_WS_FUNCTIONS . 'password_funcs.php');

меняйте на:
require_once(DIR_WS_FUNCTIONS . 'password_funcs.php');

ищите:
require(DIR_WS_FUNCTIONS . 'validations.php');

меняйте на:
require_once(DIR_WS_FUNCTIONS . 'validations.php');

Открывайте файл /admin/includes/application_top.php, ищите:
require(DIR_WS_FUNCTIONS . 'validations.php');
добавляйте после:
require_once(DIR_FS_CATALOG_MODULES .'osc_api.php');
_osc_api_config_settings();
osc_api_authenticate_user();

Открывайте файл /includes/configure.php, ищите:
define('DIR_FS_DOWNLOAD_PUBLIC', DIR_FS_CATALOG . 'pub/');
добавляйте после:
define('DIR_FS_FORUM_ROOT', '');
define('DIR_FS_SITE_ROOT', '');
define('OSC_COOKIE_NAME', 'OSCCookie');
define('OSC_COOKIE_DOMAIN', '');
define('OSC_COOKIE_PATH', '/');

ищите:
define('USE_PCONNECT', 'false');

добавляйте после:
define('DB_CHARACTER_SET', 'cp1251');

ищите:
define('DIR_WS_ICONS', DIR_WS_IMAGES . 'icons/');

меняйте на:
define('DIR_WS_ICONS', DIR_FS_CATALOG . DIR_WS_IMAGES . 'icons/');

ищите:
define('DIR_WS_INCLUDES', 'includes/');

меняйте на:
define('DIR_WS_INCLUDES', DIR_FS_CATALOG .'includes/');

Строку с константой DIR_FS_CATALOG поднимите выше и поставьте после DIR_WS_HTTPS_CATALOG, т.е. прмерно так (только у Вас будут свои пути):
define('DIR_WS_HTTPS_CATALOG', '/shop1/');
define('DIR_FS_CATALOG', 'Z:/home/vgb.net.ru/www/shop1/');

Открывайте файл /admin/includes/configure.php, ищите:
define('DIR_FS_BACKUP', DIR_FS_ADMIN . 'backups/');
добавляйте после:
define('DIR_FS_FORUM_ROOT', '');
define('DIR_FS_SITE_ROOT', '');
define('OSC_COOKIE_NAME', 'OSCCookie');
define('OSC_COOKIE_DOMAIN', '');
define('OSC_COOKIE_PATH', '/');

ищите:
define('USE_PCONNECT', 'false');

добавляйте после:
define('DB_CHARACTER_SET', 'cp1251');

Открывайте файл /admin/administrators.php, ищите:
require('includes/functions/password_funcs.php');
меняйте на:
require_once('includes/functions/password_funcs.php');

ищите:
case 'save':
require('includes/functions/password_funcs.php');
меняйте на:
case 'save':
require_once('includes/functions/password_funcs.php');

Открывайте файл /admin/customers.php, ищите:
case 'update':
$customers_id = tep_db_prepare_input($HTTP_GET_VARS['cID']);
добавляйте после:
osc_api_update_external('view', OSC_SYNC_TO_OSC, (int)$customers_id, (int)$customers_id, "", "", "");

ищите:
if (ACCOUNT_DOB == 'true') $sql_data_array['customers_dob'] = tep_date_raw($customers_dob);
добавляйте после:
$name = $customers_firstname.' '.$customers_lastname;
osc_api_update_external('update', OSC_SYNC_TO_EXTERNAL, (int)$customers_id, (int)$customers_id, $name, $customers_email_address, '', $sql_data_array);

ищите:
case 'deleteconfirm':
$customers_id = tep_db_prepare_input($HTTP_GET_VARS['cID']);

добавляйте после:
osc_api_delete((int)$customers_id, (int)$customers_id, $_POST['delete_reviews']);

Открывайте файл /admin/login.php, ищите:
require('includes/functions/password_funcs.php');
меняйте на:
require_once('includes/functions/password_funcs.php');

ищите:
case 'process':
$username = tep_db_prepare_input($HTTP_POST_VARS['username']);
$password = tep_db_prepare_input($HTTP_POST_VARS['password']);
добавляйте после:
$login_catalog = false;
if (strlen($username) >= ENTRY_EMAIL_ADDRESS_MIN_LENGTH && tep_validate_email($username)) {
$email_address = $username;
}
else {
$email_address = '';
}

ищите:
tep_session_register('admin');
добавляйте после:
if (!empty($email_address)) {
if (!osc_api_get_user(0, '', $email_address, $password)) {
$data = array();
$login_firstname = $email_address;
$data['firstname'] = $login_firstname;
$data['lastname'] = 'shop admin';
$login_catalog = osc_api_register_external('', $email_address, $password, $data);
if ($login_catalog) {
osc_api_get_user(0, '', $email_address, $password);
}
}
else {
$login_catalog = true;
}
}

if ($login_catalog) {
osc_api_login($oscommerce_user['customer_id'], '', $email_address, $password);
}


На этом настройка osCommerce 2.2 закончена, переходим к настройке Drupal.

Настройка Drupal

Предположим, что у нас есть сайт на Drupal - http://site.ru
Предположим, что у нас есть магазин на osCommerce 2.2 - http://site.ru/shop

Всё дальнейшие действия будут описываться исходя из данного предположения.

Теперь условия, которые должны быть выполнены обязательно, что б всё работало правильно:
1. Drupal и osCommerce 2.2 должны быть устновлены в одном домене (например site.ru и site.ru/shop).
2. При установке Drupal и магазина должны быть указаны одинаковые email адрес и пароль для входа в админку друпала и магазина.
3. Drupal и osCommerce 2.2 могут быть установлены в разные базы данных, не обязательно всё ставить в одну базу.

Итак, допустим, Вы установили Drupal и магазин.

1. Скачиваем модуль oscommerce для друпал - http://kypi.ru/vam/drupal/osc-vam-drupal.zip
2. Переписываем папку oscommerce из архива в папку друпала /sites/all/modules.
3. Если у Вас 6 версия друпала, убедитесь, что в файле /sites/all/modules/oscommerce/oscommerce.module в константе OSC_DRUPAL_MODULE_VERSION указано 6 (если у Вас друпал 5 версии, поменяйте значение на 5).
4. Теперь нам нужно установить модуль oscommerce в друпале, но перед этим откройте в браузере магазин, зайдите в админку магазина (http://магазин.ру/admin), указав свой email и пароль.
5. Заходите в админку друпала - модули (/admin/build/modules), устанавливайте модуль oscommerce.
6. Заходите в настройки модуля oscommerce (/admin/settings/oscommerce).
7. В опциях osCommerce 2.2 shop root path: и Path to osCommerce 2.2 api file: укажите абсолютный (полный) путь до магазина, например /home/site.ru/www/oscommerce/.
8. В опции Select master registration system укажите Drupal master.
9. Убедитесь, что у Вас открыт в браузере магазин и Вы авторизованы как админ.
10. Нажмийте в друпале, на странице настроек модуля oscommerce кнопку Save configuration.
11. Затем смотрите на странице настроек модуля oscommerce в друпале сверху сообщения, если все сообщения зелёные (Successfully), значит всё нормально, Вы всё установили и всё правильно настроили.
Если выводится ошибка - You are not authenticated in osCommerce 2.2 now.
или похожая в последней строке. Попробуйте вернуться к магазину, нажать выход и зайти ещё раз в магазин под администраторским паролем.
Затем вернитесь на страницу настроек модуля oscommerce в друпале, должно быть зелёное сообщение типа - Successfully authenticated osCommerce 2.2 user: vam@test.ru.

12. В настройках блоков, после установки модуля oscommerce появится блок osCommerce: Hidden authentication.
Если вы прошли успешно тест аутентификации в настройках модуля, включите его.

Для настройки синхронизации общих полей пользовательской информации вам надо создать необходимые поля в настройках модуля Профиль.
Имена полей по умолчанию вы можете посмотреть в настройках модуля oscommerce. Вы можете изменить их, если у вас уже есть поля с другими именами.

13. Как проверить, работает ли интеграция?!

Выйдите из друпала и магазина (logout).
Зарегистрируйте новый логин в друпале /user/register и зайдите под этим логином.

Теперь просто в браузере откройте магазин http://site.ru/shop, если всё сделано правильно, в магазине Вы тоже будете авторизованы, т.е. сверху будет закладка Выход, это значит что Вы вошли в магазин под своим паролем.

14. Затем откройте конфиг файлы магазина osCommerce 2.2, т.е. файлы:
/includes/configure.php
/admin/includes/configure.php

и в константе DIR_FS_SITE_ROOT укажите абсолютный (полный) путь до корневой папки друпала, примерно так (у Вас конечно свой путь будет):
Код
define('DIR_FS_SITE_ROOT','/home/user/public_html/');


В константе OSC_COOKIE_DOMAIN укажите свой домен. Например, если магазин установлен в shop.ru, нужно указать .shop.ru (точка обязательна перед названием), если магазин установлен в shop.domen.ru, нужно писать .shop.domen.ru, если например в domen.ru/shop, нужно писать .domen.ru

На этом всё!

Предупреждения:

Интеграция Drupal и osCommerce 2.2 опробована на нескольких рабочих сайтах Drupal + osCommerce 2.2, т.е. код вполне опробованный и работоспособный.
Однако, нельзя дать никаких гарантий, что на вашем конкретном хостинге и ваших конкретных настройках и действих ваша установка будет работоспособна, а ее работа будет соответствовать вашим ожиданиям.
Вы делаете всё на свой страх и риск, перед любыми манипуляциями делайте резервные копии файлов и базы данных.
Мы рекомендуем вам устанвить модули на тестовой машине и убедиться в их работоспособности, и только потом использовать всё на рабочем сайте.

Все вопросы Вы можете задать на форуме http://oscomm.biz/index.php?showforum=76