| gabriele  francescotto
                                                                                                                             | Tuesday 27 November 2007 8:31:17 am 
                                                                 Hi Nicholas, 
that example works only for the old Exponential 2.xfor that version, I wrote a simpler PHP script to migrate all the contents to Drupal, that I can copy here.
 But I have to say that, after the migration, I migrated again the contents to Exponential (3.x version); eZ is definitely more powerful and complete than Drupal, there's no comparison. gabriele   
/**
 *
 *
 * this is a script to export data
 * from  Exponential 2 into Drupal's postgres database
 *
 *
 * create a new database (testdata), containing Exponential's and drupal's tables
 NOTE: if your Exponential database is set up with the character encoding (LATIN9),
you need to migrate the contents to the UTF-8/Unicode encoding. More information can be found in PostgreSQL documentation.
 * CREATE DATABASE testdata ENCODING='UTF8';
 * pg_dump --encoding=UTF8 Exponential > Exponential.sql
 * pg_dump drupal > drupal.sql
 * psql testdata < drupal.sql
 * psql testdata < Exponential.sql
 *
 * practice command to extract Exponential's table list (tables to remove from the live database):
   psql -U drupaluser -W  -c "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'" drupal_database > tables.txt
 * run these queries:
 * drop table indexes_ez_drupal; // needed only if you made other migration tests before
*/
set_time_limit( 0 );
$sql = "
CREATE TABLE indexes_ez_drupal ( ez_id int4 NOT NULL, drupal_id int4 NOT NULL );
CREATE TABLE ez_cat ( ez_art int4 NOT NULL, ez_cat int4 NOT NULL, drupal_cat int4 NOT NULL );
CREATE TABLE ez_countries ( ez_art int4 NOT NULL, ez_country int4 NOT NULL, drupal_cat int4 NOT NULL );
ALTER TABLE node ALTER COLUMN title  TYPE varchar(255);
ALTER TABLE node_revisions ALTER COLUMN title  TYPE varchar(255);
";
/**************************************
* MAIN SETTINGS
**************************************/
$number_of_articles=30000;      // maximum number of articles parsed; the script can demand a lot of time to process all the articles
$import_abstract=true;          // not used
$import_body=true;              // not used
// it is possible to run the script with just an article, in order to
// to test the software or to analyse particular cases
$catch_exceptions=false;        // [true|false] true if you want to use the script with a single article, false to ignore this feature
$exception_article =94912;      // ez article ID
// these 2 variables can be useful in case the script stops
// for some reason
$starting_article=0;            // it must be the ID of firt article to process; the previous ones will be ignored
$remove_prev_imported = true;   // [true|false] true to reset the previous imported data, false to save them
$argv = $GLOBALS["HTTP_SERVER_VARS"]["argv"];
include_once( "classes/INIFile.php" );
include_once( "classes/eztemplate.php" );
include_once( "classes/ezhttptool.php" );
require_once('ezaddress/classes/ezcountry.php');
include_once( "ezarticle/classes/ezarticlecategory.php" );
include_once( "ezarticle/classes/ezarticlerenderer.php" );
#include_once( "lib/ezxml/classes/ezxml.php" );
#include_once( "lib/ezxml/classes/ezdomdocument.php" );
#include_once( "lib/ezxml/classes/ezdomnode.php" );
include_once( "ezuser/classes/ezobjectpermission.php" );
include_once( "classes/ezinifile.php" );
include_once( "ezimagecatalogue/classes/ezimage.php" );
$GLOBALS["DEBUG"] = true;
$Override_ParentCategory = 0;
//$ini = new INIFile( "site_custom.ini", false );
//$GLOBALS["INI_site.ini"] =& $ini;
$writePermGroup=-1;
$pathSeparator = '#!/!#';
//$pathSeparator = '-';
if ( $argv[1] != "" )
{
    for ( $i = 1; $i < count( $argv ); $i++ )
    {
        $option = preg_split( "#\=#is", $argv[$i] );
        $argument = $option[0];
        $value = $option[1];
        $replace = false;
        switch ( $argument )
        {
            case "-r":
                $replace = true;
                break;
            case "-s":
                $stripPathElements = $value;
                break;
            case "-sl":
                $stripPathElementsLive = $value;
                break;
            case "-q": print "
";
                return false;
                break;
            case "-p":
                $Override_ParentCategory = $value;
                break;
            case '-l':
            case '--language':
                $Language=$value;
               break;
            case "-f":
                $file = $value;
                break;
            case "--writepermgroup":
                $writePermGroup = $value;
                break;
        }
    }
} else {
        print "
        Please make sure that you run the following queries:
" . $sql . "
        If you just run them, please run again this script with the option '-q'.
";
}
/*#########################################################################################
                                    GLOBAL SETTINGS
#########################################################################################*/
//ARTICLES
/*#######################################################################################*/
$db =& eZDB::globalDatabase();
$category = new eZArticleCategory();
$db->array_query($articles, "select * from ezarticle_article limit $number_of_articles");
print "\n##############\n\nSelecting the ".count($articles)." articles to import in Drupal... please wait\n\n";
print " DONE\n\n";
print "\nLooking for exceptions (articles containing polls or forms)... please wait\n\n";
$db->array_query($articles_forms, "select id, name from ezarticle_article where contents like '%<form%'");
$db->array_query($articles_polls, "select id, name from ezarticle_article where contents like '%<poll%'");
$arr_exceptions = array();
        print "\n       The following articles contain FORMS and will be excluded from the migration: ";
foreach ($articles_forms as $form)
{
        print "
        " . $form[id] .": " . $form[name];
        array_push($arr_exceptions, $form[id]);
}
        print "\n\nThe following articles contain POLLS and will be excluded from the migration: ";
foreach ($articles_polls as $poll)
{
        print "
        " . $poll[id] .": " . $poll[name];
        array_push($arr_exceptions, $poll[id]);
}
print "\n";
/*  INIZIALIZZAZIONE NECESSARIA, DA EFFETTUARE DOPO OGNI TEST
delete from node;
delete from node_revisions;
delete from sequence;
delete sequence node_revisions_vid_seq;
###################################################*/
if ($remove_prev_imported) {
//$db->query('create table indexes_ez_drupal ( ez_id int4 NOT NULL, drupal_id int4 NOT NULL )');
$db->query('delete from indexes_ez_drupal');
$db->query('delete from localizernode');
$db->query('delete from node where nid>20');
$db->query('delete from term_data where tid>16');
$db->query('delete from term_node where nid>16');
$db->query('delete from term_hierarchy where tid>16');
$db->query('delete from ez_cat');
$db->query('delete from ez_countries');
$db->query('delete from node_revisions where nid>20');
}
function utf8_to_html ($data)
    {
    return preg_replace("/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e", '_utf8_to_html("\\1")', $data);
    }
function _utf8_to_html ($data)
    {
    $ret = 0;
    foreach((preg_split('//',strrev(chr((ord($data{0}) % 252 % 248 % 240 % 224 % 192) + 128) . substr($data, 1)))) as $k => $v)
        $ret += (ord($v) % 128) * pow(64, $k);
    return "&#$ret;";
    }
$body = '';
$title = '';
$pub_date = '';
$mod_date = '';
$images = array();
$author_id = '';
$external_url = '';
$keywords = '';
$country = ''; // category
$allow_comments = false;
$language = 'english';
$ispublished = true;
   print "
  > Importing articles: ";
if ($remove_prev_imported) $process_article = true; else $process_article=false;
foreach ($articles as $number => $art) {
  if (!$remove_prev_imported) {
        if($starting_article==$art[id]) $process_article=true;
  }
if ($process_article)
 if (!in_array($art[id], $arr_exceptions)) {
  if ($number < $number_of_articles) {
        $article =  new eZArticle ($art[id]);
        $article_id = $article->id();
        print "Processing Article : " . $article->name() . "  ID=" . $article->id();
        $rendered = new eZArticleRenderer ($article);
        $title = str_replace("\\", "", $article->name());
        $teaser = $rendered->renderIntro();
        $body_page = $rendered->renderPage();
        $body = $body_page[1];
        // images related to the selected article
        if (count($images)>0) {
                foreach ($images as $k=>$image) {
                        $img = $image['Image'];
                        $img_language = $article->language();
                        $img_caption = $img->caption();
                        $img_html_caption = $img->fullHTMLCaption( $img_language );
                        $img_path = "http://www.oneworldsee.org".$img->filePath();
                        $img_category = $img->categoryDefinition();
                        $img_name = $img->name();
                        if ($k==0) {
                                $teaser = "<div class=\"ezimage\"><img alt=\"".$img_name."\" src=\"".$img_path."\"/><div class=\"caption\">".$img_caption."</div></div>".$teaser;
                        } else {
                                $body = "<div class=\"ezimage\"><img alt=\"".$img_name."\" src=\"".$img_path."\" /><div class=\"caption\">".$img_caption."</div></div>".$body;
                        }
                }
        }
        $keywords = $article->keywords();
        $allCountries = eZCountry::getFlatList( false );
        $title = str_replace("'", "\'", $title);
        $title = str_replace(""", "\"",$title);
        $title = str_replace("&", "&",$title);
        $title = str_replace(">", ">",$title);
        $title = str_replace("ââ", "\"",$title);
        $title = str_replace("â", "\'",$title);
        $title = str_replace("â", "\'",$title);
        $title = utf8_to_html($title);
$teaser = stripslashes(str_replace("\\", "", $teaser));
        $teaser = str_replace("'", "\'", $teaser);
        $teaser = str_replace("<br />", "
",$teaser);
        $teaser = str_replace(""", "\"",$teaser);
        $teaser = str_replace(">", ">",$teaser);
        $teaser = str_replace("&", "&",$teaser);
        $teaser = str_replace("ââ", "\"",$teaser);
        $teaser = str_replace("â", "\'",$teaser);
        $teaser = str_replace("â", "\'",$teaser);
        $teaser = utf8_to_html($teaser);
        $body = str_replace("\\", "", $body);
        $body = str_replace("'", "\'", $body);
        $body = str_replace("<br />", "
", $body);
        $body = str_replace(""", "\'", $body);
        $body = str_replace(">", ">", $body);
        $body = str_replace("&", "&", $body);
        $body = str_replace("ââ", "\"", $body);
        $body = str_replace("â", "\'", $body);
        $body = str_replace("â", "\'", $body);
        $body = utf8_to_html($body);
        $pub_date = $article->Published;
        $mod_date = $article->Modified;
        $images = $article->images();
        $author = $article->author();
        // USERS MAP: creates authors if they don't exist
        // manage groups and roles... TODO
        // INITIALIZE DRUPAL USERS, FROM Exponential AUTHORS
        $user_id = $author->id();
        if ($user_id == '') $user_id=1;
        // find last drupal's userid
        $db->array_query($users, "SELECT last_value FROM users_uid_seq");
        $userid = $users[0]['last_value'];
        // catch ez's author and create a drupal user, includind the password
        if ($author->id()) {
                $db->array_query($authors_passwords, "SELECT password FROM ezuser_user WHERE id=". $author->id() );
                $author_password = $authors_passwords[0]['password'];
        } else $author_password=md5('owpass');
        $db->array_query($drupal_users, "SELECT name FROM users WHERE name='" . $author->login() . "'") ;
        if ( count($drupal_users)>0 ) {
                print "";
        } else { // insert a new author in drupal
                $db->query("INSERT INTO users ( name, signature, pass, mail, status, language )
                                VALUES ('".$author->login()."', '".$author->firstName().
                                " ".$author->lastName()."', '".$author_password."', '".
                                $author->email()."', 1, '".$short_language."' )");
        }
        if ($article->ispublished()==1) $ispublished=1; else $ispublished=0;
        $db->array_query($node_nid_seq, "SELECT last_value from node_nid_seq");
        $next_node_nid_seq= $node_nid_seq[0]['last_value'] + 1;
        $db->query("INSERT INTO node (vid, type, title, uid, status,
                        created,  changed, comment, promote, moderate, sticky)
                        VALUES ($next_node_nid_seq, 'story',
                        '$title', $userid , $ispublished, $mod_date, $pub_date, 2, 0, 0, 0)");
        $intro = $teaser . $link;
        // TODO revisions
        $sql_revision = "INSERT INTO node_revisions ( nid,vid,uid,title,body,teaser,log,timestamp,format) VALUES ($next_node_nid_seq, $next_node_nid_seq, $userid, '$title', '$body', '$intro', 'imported from OW Exponential', $pub_date, 1)";
        $db->query($sql_revision);
        $db->query("INSERT INTO indexes_ez_drupal (ez_id, drupal_id) values ($article_id, $next_node_nid_seq)");
        // MANAGE EXTERNAL LINKS, ALTERNATIVE TO THE BODY
        $external_link = $article->linkobject();
        if ($article->haslinkurl()) {
                $link_name =str_replace("'", "\'", $external_link->name() );
                $link = '<br /><a class="external_link" target="_blank" href="' . str_replace("'", "\'", $external_link->url()) . '">' . $link_name . '</a>';
        }
                else
                $link = '';
        //take Drupal node_id
        $db->array_query($nextval_arr, "SELECT last_value from node_nid_seq");
        $nextval = $nextval_arr[0]['last_value'];
        // LOOK FOR THE ISOCODE : IsoCode TODO: shows always english
        $language = $article->language();
        $locale = new eZLocale($Language);
        $language_object = new eZLocale($article->language());
        $short_language = substr($language_object->IsoCode, 0, 2);
        $db->query("INSERT into localizernode (nid, locale, pid) values ($nextval, '".$short_language."', $nextval)");
        $categories = $article->categories(true);
        $countries = $article->countries(); // categories
        foreach ($categories as $category) {
          if ( substr($category->pathstring(), 0 , 22 ) == "/0/2373#2373/2481#2481" ) {
            $db->array_query($check, "select ez_cat from ez_cat where ez_cat=" .$category->id() );
            $categ_exists = false;
        // if the category doesn't exist, create a new one
            if ( count($check)==0 ) {
                        print " categ ez: ".$category->id() ."   ";
                $category_name = str_replace("'", "\'", $category->name());
                $category_name = str_replace("â", "\'", $category_name);
                $category_name = str_replace("â", "\'", $category_name);
                $category_name = str_replace("≷", "<", $category_name);
                $category_name = str_replace(">", ">", $category_name);
                $category_desc = str_replace("'", "\'", $category->description());
                $category_desc = str_replace(">", ">", $category_desc);
                $category_desc = str_replace("≷", "<", $category_desc);
                $category_desc = str_replace("â", "\'", $category_desc);
                $category_desc = str_replace("â", "\'", $category_desc);
        // if the category doesn't exist, check if there are drupal categories with the same name
                $db->array_query($check_name, "SELECT tid FROM term_data WHERE name='". $category_name ."'");
                if ( count($check_name)>0 ) {
                        $categ_exists=true;
                        // new drupal's term id
                        $drupal_cat = $check_name[0]['tid'];
                        $db->query("INSERT INTO ez_cat (ez_art, ez_cat, drupal_cat)
                                VALUES (".$article->id().", ".$category->id(). ", " . $drupal_cat . ")");
                        $db->array_query($check_country_name_node, "SELECT tid FROM term_node WHERE nid ='".$next_node_nid_seq."' AND tid='". $drupal_cat ."'");
                                                if (count($check_country_name_node)==0)
                        $db->query("INSERT into term_node values (". $next_node_nid_seq .", ". $drupal_cat . ")");
                }
// taxonomy
 if (!$categ_exists)
                        $db->query("INSERT into term_data ( vid, name, description) values (3, '" . $category_name . "', '" . $category_desc . "' )");
                $db->array_query($nextval_arr_term, "SELECT last_value from term_data_tid_seq");
                // new drupal's term id
                $drupal_cat = $nextval_arr_term[0]['last_value'];
                if (!$categ_exists)
                        $db->query("INSERT into term_hierarchy ( tid, parent) values ($drupal_cat , 0)");
                $db->query("INSERT into ez_cat (ez_art, ez_cat, drupal_cat) values (".$article->id().", ".$category->id(). ", " . $drupal_cat . ")");
            } else {
            // the category exists: find drupal's category
                $db->array_query($drupal_cat_arr, "SELECT drupal_cat FROM ez_cat WHERE ez_cat=".$category->id());
                $drupal_cat = $drupal_cat_arr[0]['drupal_cat'];
            }
        // insert drupal's node into drupal's category
                if (!$categ_exists) {
                        $db->array_query($check_country_name_node, "SELECT tid FROM term_node WHERE nid ='".$next_node_nid_seq."' AND tid='". $drupal_cat ."'");
                        if (count($check_country_name_node)==0)
                                $db->query("INSERT into term_node values (". $next_node_nid_seq .", ". $drupal_cat . ")");
                }
          }
        } // foreach $categories as $category
// ez countries as drupal taxonomy
        foreach ($countries as $country) {
                foreach ($allCountries as $c) {
                        if ($c->id()==$country) $cc = $c;
                }
                $db->array_query($check, "SELECT ez_country from ez_countries where ez_country=" . $country);
                $country_exists = false;
                if ( count($check)==0 ) {
                        $db->array_query($check_country_name, "SELECT tid FROM term_data WHERE name='". $cc->name() ."'");
                        if (count($check_country_name)>0) {
                                $country_exists = true;
                                $country_drupal_id=$check_country_name[0]['tid'];
                                $db->query("INSERT INTO ez_countries (ez_art, ez_country, drupal_cat) values (".$article->id().", ".$country. ", " . $country_drupal_id . ")");
                                $db->array_query($check_country_name_node, "SELECT tid FROM term_node WHERE nid ='".$next_node_nid_seq."' AND tid='". $country_drupal_id ."'");
                                if (count($check_country_name_node)==0)
                                        $db->query("INSERT INTO term_node VALUES (". $next_node_nid_seq .", ". $country_drupal_id . ")");
                        } else {
                                $country_exists = false;
                                $db->query("INSERT into term_data ( vid, name, description) values (2, '" . str_replace("'", "\'", $cc->name()) . "', 'Country' )");
                        $db->array_query($nextval_arr_term, "SELECT last_value from term_data_tid_seq");
                        $drupal_cat = $nextval_arr_term[0]['last_value'];
                        $db->query("INSERT into term_hierarchy ( tid, parent) values ($drupal_cat , 0)");
                        $db->query("INSERT into ez_countries (ez_art, ez_country, drupal_cat) values (".$article->id().", ".$country. ", " . $drupal_cat . ")");
                        $db->query("INSERT INTO term_node VALUES (". $next_node_nid_seq .", ". $drupal_cat . ")");
                        }
                } else {
                // the category exists: find drupal's category
                        $db->array_query($drupal_cat_arr, "SELECT drupal_cat FROM ez_countries WHERE ez_country=".$country);
                        $drupal_cat = $drupal_cat_arr[0]['drupal_cat'];
                // insert drupal's node into drupal's category
                        $db->array_query($check_country_name_node, "SELECT tid FROM term_node WHERE nid ='".$next_node_nid_seq."' AND tid='". $drupal_cat ."'");
                        if (count($check_country_name_node)==0)
                        $db->query("INSERT INTO term_node values (". $next_node_nid_seq .", ". $drupal_cat . ")");
                }
        }
        print "  Successfully processed!
";
  } // if
 } //if
} // for articles
 www.opencontent.itvia Verdi 19, 38100 Trento
 |