array( 'description' => t('Access Joomla Import Settings'), 'title' => t('Administer Joomla'), 'restrict access' => TRUE, ), ); } /** * Implements hook_node_delete(). */ function joomla_node_delete($node) { db_delete('joomla_content') ->condition('nid', $node->nid) ->execute(); } /** * Implements hook_menu(). */ function joomla_menu() { $items = array(); $items['admin/content/joomla_import'] = array( 'title' => 'Import from Joomla', 'page callback' => 'drupal_get_form', 'page arguments' => array('joomla_import_form'), 'access arguments' => array('administer joomla'), 'description' => 'Import content, categories and users from a Joomla website', 'type' => MENU_LOCAL_TASK | MENU_NORMAL_ITEM, ); $items['admin/config/content/joomla'] = array( 'title' => 'Joomla to Drupal', 'page callback' => 'drupal_get_form', 'page arguments' => array('joomla_admin_settings'), 'access arguments' => array('administer joomla'), 'description' => 'Migrate Joomla to Drupal.', ); $items['admin/config/content/joomla/settings'] = array( 'title' => 'Settings', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); return $items; } /** * Joomla admin settings. */ function joomla_admin_settings($form, &$form_state) { // only administrators can access this function $weight = -20; $bundle = variable_get('joomla_default_static_nodetype', JOOMLA_DEFAULT_STATIC_NODETYPE); // Generate the form - settings applying to all patterns first $form['joomla_import_settings'] = array( '#type' => 'fieldset', '#weight' => $weight, '#title' => t('Import defaults'), '#collapsible' => FALSE, '#collapsed' => FALSE, '#description' => 'Set the default values for the ' . l('Import from Joomla', 'admin/content/joomla_import') . ' form', ); $form['joomla_import_settings'][] = joomla_import_form_checkboxes(); $weight++; $form['joomla_settings_database'] = array( '#type' => 'fieldset', '#weight' => $weight, '#title' => t('Joomla settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['joomla_settings_database']['joomla_database_host'] = array( '#type' => 'textfield', '#title' => 'Joomla database host name', '#default_value' => variable_get('joomla_database_host', JOOMLA_DATABASE_HOST), '#description' => 'Host name of Joomla database server.' ); $form['joomla_settings_database']['joomla_database_name'] = array( '#type' => 'textfield', '#title' => 'Joomla database name', '#default_value' => variable_get('joomla_database_name', JOOMLA_DATABASE_NAME), '#description' => 'Joomla database name.' ); $form['joomla_settings_database']['joomla_database_user'] = array( '#type' => 'textfield', '#title' => 'Joomla database user name', '#default_value' => variable_get('joomla_database_user', JOOMLA_DATABASE_USER), '#description' => 'User name for Joomla database server.' ); $form['joomla_settings_database']['joomla_database_pass'] = array( '#type' => 'textfield', '#title' => 'Joomla database password', '#default_value' => variable_get('joomla_database_pass', JOOMLA_DATABASE_PASS), '#description' => 'Password for Joomla database server.' ); $form['joomla_settings_database']['advanced'] = array( '#type' => 'fieldset', '#title' => t('Advanced database settings'), '#collapsible' => TRUE, '#collapsed' => TRUE ); $form['joomla_settings_database']['advanced']['joomla_database_port'] = array( '#type' => 'textfield', '#title' => 'Joomla database port number', '#default_value' => variable_get('joomla_database_port', JOOMLA_DATABASE_PORT), '#description' => 'Port number for Joomla database server. The default (3306) is usually fine.' ); $form['joomla_settings_database']['advanced']['joomla_prefix'] = array( '#type' => 'textfield', '#title' => 'Table Prefix of Joomla', '#default_value' => variable_get('joomla_prefix', JOOMLA_PREFIX), '#description' => 'Table Prefix for Joomla tables.' ); $form['joomla_settings_database']['joomla_path'] = array( '#type' => 'textfield', '#title' => 'Path of your Joomla installation', '#default_value' => variable_get('joomla_path', JOOMLA_PATH), '#description' => 'The path name where you install Joomla. Example:
' . '' ); $weight++; $form['joomla_settings_content'] = array( '#type' => 'fieldset', '#weight' => $weight, '#title' => t('Content settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $filter_node_options = array(); foreach (node_type_get_types() as $key => $val) { if (node_access('create', $key)) { $filter_node_options[$key] = $val->name; } } $form['joomla_settings_content']['joomla_default_static_nodetype'] = array( '#type' => 'select', '#title' => t('Default node type for static items'), '#required' => TRUE, '#options' => $filter_node_options, '#default_value' => $bundle, ); $form['joomla_settings_content']['joomla_default_blog_nodetype'] = array( '#type' => 'select', '#title' => t('Default node type for content items'), '#required' => TRUE, '#options' => $filter_node_options, '#default_value' => variable_get('joomla_default_blog_nodetype', JOOMLA_DEFAULT_BLOG_NODETYPE), ); $lang_options = language_list(); $langs['und'] = 'None (undefined)'; foreach ($lang_options as $code => $lang) { $langs[$code] = $lang->name; } $form['joomla_settings_content']['joomla_default_language'] = array( '#type' => 'select', '#title' => t('Language to import your content to'), '#required' => TRUE, '#options' => $langs, '#default_value' => variable_get('joomla_default_language', LANGUAGE_NONE), ); $formats = array(); foreach (filter_formats() as $key => $format) { $formats[$key] = $format->name; } $form['joomla_settings_content']['joomla_input_format'] = array( '#type' => 'select', '#title' => t('Input Format'), '#default_value' => variable_get('joomla_input_format', JOOMLA_INPUT_FORMAT), '#options' => $formats, '#description' => t('The filter format selected below will be applied to all imported content and comments.'), ); $form['joomla_settings_content']['joomla_img_folder'] = array( '#type' => 'textfield', '#title' => 'Image/Picture folder', '#default_value' => variable_get('joomla_img_folder', JOOMLA_IMG_FOLDER), '#description' => "A folder to save any images from Joomla contents. This folder related to Drupal 'files' folder, i.e: if you enter 'images' then all imported images will be save to Drupal 'files/images'." ); if ((bool) db_query_range('SELECT 1 FROM {joomla_categories}', 0, 1)->fetchField()) { db_set_active('joomla'); foreach (field_info_instances('node', $bundle) as $field_name => $field) { $node_fields[$field_name] = $field['label']; } $vocabularies = taxonomy_vocabulary_load_multiple(FALSE); foreach ($vocabularies as $vocabulary) { $form['joomla_settings_content']['joomla_field_' . $vocabulary->machine_name] = array( '#type' => 'select', '#title' => t('Field to store @name associations', array('@name' => $vocabulary->name)), '#options' => $node_fields, '#empty_value' => FALSE, '#default_value' => variable_get('joomla_field_' . $vocabulary->machine_name, JOOMLA_REAL_NAME_FIELD), ); } } $weight++; $form['joomla_settings_user'] = array( '#type' => 'fieldset', '#weight' => $weight, '#title' => t('User settings'), '#collapsible' => TRUE, '#collapsed' => FALSE, ); $user_fields = array(); foreach (field_info_instances('user', 'user') as $field_name => $field) { $user_fields[$field_name] = $field['label']; } $form['joomla_settings_user']['joomla_real_name_field'] = array( '#type' => 'select', '#title' => t('Field to use to import user Real Name to'), '#options' => $user_fields, '#empty_value' => FALSE, '#default_value' => variable_get('joomla_real_name_field', JOOMLA_REAL_NAME_FIELD), ); return system_settings_form($form); } /** * Import form. */ function joomla_import_form($form, &$form_state) { if (!joomla_database_test()) { $form['error'] = array( '#markup' => '

' . t('The joomla database settings are not currently valid. Please set the correct database settings at Joomla to Drupal settings page', array('@url' => url('admin/config/content/joomla'))) . '

', ); return $form; } $form = joomla_import_form_checkboxes($form_state); $form['joomla_update_submit'] = array( '#type' => 'submit', '#value' => t('Import'), ); return $form; } /** * These checkboxes are used on both the admin and import forms. */ function joomla_import_form_checkboxes(&$form_state = NULL) { $form['joomla_import'] = array( '#type' => 'fieldset', '#title' => t('Items to import'), '#collapsible' => FALSE, '#collapsed' => FALSE, ); $form['joomla_import']['joomla_import_content'] = array( '#type' => 'checkbox', '#title' => t('Import content'), '#default_value' => variable_get('joomla_import_content', JOOMLA_IMPORT_CONTENT), ); $form['joomla_import']['joomla_import_categories'] = array( '#type' => 'checkbox', '#title' => t('Import categories'), '#default_value' => variable_get('joomla_import_categories', JOOMLA_IMPORT_CATEGORIES), ); $form['joomla_import']['joomla_import_users'] = array( '#type' => 'checkbox', '#title' => t('Import users'), '#default_value' => variable_get('joomla_import_users', JOOMLA_IMPORT_USERS), ); $form['joomla_import']['joomla_import_comments'] = array( '#type' => 'checkbox', '#title' => t('Import comments'), '#default_value' => variable_get('joomla_import_comments', JOOMLA_IMPORT_COMMENTS), '#description' => t('Check this only if you use JComments in your joomla installation'), ); $form['joomla_update_duplicate'] = array( '#type' => 'checkbox', '#title' => t('Update previously imported items?'), '#description' => t('If selected, any items which have already been imported, and which have been updated on the Joomla website, will be updated.'), '#default_value' => variable_get('joomla_update_duplicate', JOOMLA_UPDATE_DUPLICATE), ); return $form; } /** * Submit import form. */ function joomla_import_form_submit($form, &$form_state) { $joomla_update_duplicate = (bool) $form_state['values']['joomla_update_duplicate']; $jos = array(); $jos['users'] = (bool) $form_state['values']['joomla_import_users']; $jos['comments'] = (bool) $form_state['values']['joomla_import_comments']; $jos['categories'] = (bool) $form_state['values']['joomla_import_categories']; $jos['content'] = (bool) $form_state['values']['joomla_import_content']; $op = !empty($jos) ? array('joomla_batch_save', array($jos, $joomla_update_duplicate)) : NULL; db_set_active(); $batch = array( 'title' => t('Importing'), 'operations' => array($op), 'progress_message' => t('Importing joomla content, please be patient...'), 'finished' => 'joomla_batch_finished', 'file' => drupal_get_path('module', 'joomla') . '/joomla.batch.inc', ); batch_set($batch); } /** * */ function joomla_replace_mos_image($images_source, $text_source) { $joomla_img_folder = variable_get('joomla_img_folder', JOOMLA_IMG_FOLDER); $joomla_path = variable_get('joomla_path', JOOMLA_PATH); $images = array(); $images = explode("\n", $images_source); $image_string = '{mosimage}'; $n=0; $images_items =array(); while (!(strpos($text_source, $image_string) === FALSE)) { $images_items = explode("|", $images[$n]); if (!file_exists('public://' . $joomla_img_folder)) { mkdir('public://' . $joomla_img_folder); } if (dirname($images_items[0])) { if (!file_exists('public://' . $joomla_img_folder . '/' . dirname($images_items[0]))) { mkdir('public://' . $joomla_img_folder . '/' . dirname($images_items[0])); } } copy($joomla_path . '/images/stories/' . $images_items[0], "public://$joomla_img_folder/" . $images_items[0]); $images_replace = '' . $images_items[2] . ''; $text_source = substr_replace($text_source, $images_replace, strpos($text_source, $image_string), 10) ; $n++; } return $text_source; } /** * */ function joomla_replace_image_link($text_source) { //Fixs image string: src="images/ $image_string = 'src="images/'; $images_replace = 'src="' . base_path() . variable_get('file_public_path', conf_path() . '/files/') . variable_get('joomla_img_folder', JOOMLA_IMG_FOLDER) . '/'; $text_result = str_replace('src="images/', "$images_replace", $text_source); return $text_result; } /** * Implements hook_form_alter(). */ function joomla_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'user_login' || $form_id == 'user_login_block') { if (isset($form_state['input']['name'])) { $last_validator = array_pop($form['#validate']); $form['#validate'][] = 'joomla_login_validate'; $form['#validate'][] = $last_validator; } } } /** * */ function joomla_login_validate($form, &$form_state) { joomla_authenticate($form_state['values'], $form_state['uid']); } /** * */ function joomla_authenticate($form_values = array(), &$form_uid) { global $user; if (!empty($user->uid) || $form_uid) { // User has already sucessfully authenticated return; } if (form_get_errors() || empty($form_values['name']) || empty($form_values['pass'])) { return; } $account = user_load_by_name($form_values['name']); // The user doesn't exist if (!$account) { return; } // See if the user has a password record from Joomla import $joomla_user = db_query('SELECT * FROM {joomla_users} WHERE uid = :uid', array(':uid' => $account->uid))->fetch(); if (!$joomla_user) { return; } /** * If the password doesn't contain a colon, it is an unsalted password. * It will have been inserted into the drupal users table during the * import, and to get here the Drupal login must have already failed * against it, so nothing left to do. */ if (strpos($joomla_user->password, ':')) { list($password, $salt) = explode(':', $joomla_user->password, 2); } else { $password = $joomla_user->password; $salt=''; } // Check the supplied password against the md5sum if (md5($form_values['pass'] . $salt) == $password || (!$salt && md5($form_values['pass']) == $password)) { $user = $account; watchdog('joomla', 'Converting password for user @name (Joomla id @juid)', array('@name' => $user->name, '@juid' => $joomla_user->juid)); // Update the users Drupal password user_save($user, array('pass' => $form_values['pass'])); $joomla_user->converted = 1; drupal_write_record('joomla_users', $joomla_user, array('uid')); $form_uid=$user->uid; user_login_finalize($form_values); return $user; } } /** * Initialise settings for communicating with the Joomla database. This * makes it possible to switch between the Drupal and Joomla databases with * db_set_active(). */ function joomla_database_init() { $joomla_db = Database::getConnectionInfo('joomla'); if (empty($joomla_db)) { /** * It's not possible to use a combination of database engines, e.g. * mysql and mysqli, at the same time. So, determine which one is * in use on the Drupal site and use it for the Joomla connection */ $dbs = Database::getConnectionInfo('default'); // same engine for two db: Drupal's limit $engine = $dbs['default']['driver']; $joomla_url = array( 'database' => variable_get('joomla_database_name', JOOMLA_DATABASE_NAME), 'username' => variable_get('joomla_database_user', JOOMLA_DATABASE_USER), 'password' => variable_get('joomla_database_pass', JOOMLA_DATABASE_PASS), 'host' => variable_get('joomla_database_host', JOOMLA_DATABASE_HOST), 'port' => variable_get('joomla_database_port', JOOMLA_DATABASE_PORT), 'prefix' => variable_get('joomla_prefix', JOOMLA_PREFIX), 'driver' => $engine, ); Database::addConnectionInfo('joomla', 'default', $joomla_url); } } /** * Test whether a valid joomla database has been configured. */ function joomla_database_test() { $connection = @mysql_connect(variable_get('joomla_database_host', JOOMLA_DATABASE_HOST) . ':' . variable_get('joomla_database_port', JOOMLA_DATABASE_PORT), variable_get('joomla_database_user', JOOMLA_DATABASE_USER), variable_get('joomla_database_pass', JOOMLA_DATABASE_PASS), TRUE, 2); if (!$connection) { return FALSE; } if (!mysql_select_db(variable_get('joomla_database_name', JOOMLA_DATABASE_NAME))) { return FALSE; } return TRUE; }