On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Опишу некоторый свой опыт переноса данных с joomla 1.0.13. В моем случае надо было перенести базу новостей, пользователей, ссылок и файлового хранилища (сделан на Remository).
    Данные в джумле хранились у меня в windows-1251, в MODx же я решил хранить данные в UTF.
    Написал такие скрипты:

    Здесь я старался вставить новости с таким же ID который был в joomla чтобы потом сделать правило в htaccess по которому можно было бы попадать по старым ссылкам из интернета в те же самые новости.
    // перенос новостей
    $a=array();
    $i=0;
    mysql_select_db(’joomla’,$OnConnectServer);

    $query="SELECT * from jos_content order by id";
    $res = mysql_query($query);
    while ($row=mysql_fetch_array($res)){
    $a[$i][’id’]=$row[’id’];
    $a[$i][’pagetitle’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’title’]));
    $a[$i][’introtext’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’introtext’]));
    $a[$i][’content’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’fulltext’]));
    $a[$i][’createdon’]=strtotime($row[’created’]);
    $i++;
    }

    mysql_select_db(’modx’,$OnConnectServer);

    foreach ($a as $v){
    // проверяем - нет ли еще такого ид
    $query="SELECT * from modx_site_content where id=’$v[id]’";
    $res = mysql_query($query);
    if (mysql_num_rows($res) != 0){
    continue;
    }

    $query="INSERT INTO modx_site_content
    (id, type, contentType, pagetitle, published, parent, isfolder, introtext, content, richtext, template, menuindex, searchable, cacheable, createdby, createdon, editedby, editedon, deleted, deletedon, deletedby, publishedon, publishedby, donthit, haskeywords, hasmetatags, privateweb, privatemgr, content_dispo, hidemenu) VALUES
    ($v[id],’document’,’text/html’,’$v[pagetitle]’,1,26,0,’$v[introtext]’,’$v[content]’,1,4,7,1,0,1,$v[createdon],1,$v[createdon],0,0,0,$v[createdon],1,0,0,0,0,0,0,0)";
    mysql_query($query);

    $query="insert into modx_site_tmplvar_contentvalues (tmplvarid,contentid,value) VALUES (1,$v[id],’news’)";
    mysql_query($query);
    }


    // перенос линков
    $a=array();
    $i=0;
    mysql_select_db(’joomla’,$OnConnectServer);

    $query="SELECT * from jos_weblinks order by id";
    $res = mysql_query($query);
    while ($row=mysql_fetch_array($res)){
    $a[$i][’pagetitle’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’title’]));
    $a[$i][’url’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’url’]));
    $a[$i][’longtitle’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’description’]));
    $i++;
    }

    mysql_select_db(’modx’,$OnConnectServer);

    foreach ($a as $v){
    $query="INSERT INTO modx_site_content
    (type, contentType, content, pagetitle, longtitle,published, parent, isfolder, richtext, template, menuindex, searchable, cacheable, createdby, editedby, deleted, deletedon, deletedby, publishedby, donthit, haskeywords, hasmetatags, privateweb, privatemgr, content_dispo, hidemenu) VALUES
    (’reference’,’text/html’,’$v[url]’,’$v[pagetitle]’,’$v[longtitle]’,1,5,0,1,4,7,1,1,1,1,0,0,0,1,0,0,0,0,0,0,1)";
    mysql_query($query);
    }


    Дальше про перенос пользователей.
    Собственно там вся фишка в том, что joomla формирует хэш пароля так: md5(password+salt)
    где salt - случайная "соль". Эта "соль" записывается в поле password просто через двоеточие от самого хэша - результата.
    А MODx просто делает MD5 от введенного пользователем пароля при регистрации.
    И чтобы перенести пользователей я добавил в modx в таблицу web_users поле salt куда перенес "соль" из joomla и немного поправил webloginpe.class.php (я использую WebLoginPE 1.3.0) чтобы и старые пользователи и новые (созданные уже в modx) могли заходить.
    // check user password - local authentication
    if ($this->User[’password’] != md5($this->Password)and($this->User[’password’] != md5($this->Password.$this->User[’salt’])))

    /// перенос пользователей
    $a=array();
    $i=0;
    mysql_select_db(’joomla’,$OnConnectServer);

    $query="SELECT * from jos_users where username!=’admin’ and username!=’webmaster’ order by id";
    $res = mysql_query($query);
    while ($row=mysql_fetch_array($res)){
    $a[$i][’username’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’username’]));
    $a[$i][’email’]=mysql_real_escape_string($row[’email’]);
    $a[$i][’fullname’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’name’]));
    $a[$i][’lastlogin’]=strtotime($row[’lastvisitDate’]);

    $password_temp=explode(’:’,$row[’password’]);
    if (!isset($password_temp[1])) $password_temp[1]=’’;
    $a[$i][’password’]=$password_temp[0];
    $a[$i][’salt’]=$password_temp[1];

    $i++;
    }

    mysql_select_db(’modx’,$OnConnectServer);

    foreach ($a as $v){
    $query="INSERT INTO modx_web_users (`username`,`password`,`salt`) VALUES (’$v[username]’,’$v[password]’,’$v[salt]’)";
    mysql_query($query);

    $internalKey=mysql_insert_id();

    $query="INSERT INTO modx_web_user_attributes (fullname,internalKey,email,photo,lastlogin) VALUES (’$v[fullname]’,’$internalKey’,’$v[email]’,’http://site.ru/assets/snippets/webloginpe/userimages/default_user.jpg’,’$v[lastlogin]’)";
    mysql_query($query);

    $query="INSERT INTO modx_web_groups (webgroup,webuser) VALUES (1,’$internalKey’)";
    mysql_query($query);

    }
    • получилось ли перенести- и оставить те же ссылки как на джумле? интересно бы посмотреть на сайт
      • К сожалению, ссылки оставить полностью не получилось. Хотя на самом деле я не сильно старался. На джумле у меня было без ЧПУ. Можно было заморочиться и написать хитрые реврайт правила в htaccess, но было просто лень =)
        Сделал sitemap и сайт довольно быстро переиндексировался заново.
        • Использовал данный код для своих нужд, это кстати единственный рецепт по данному запросу в рунете.
          Процесс переноса я более подробно расписал в своей статье, о том как осуществить Переход с Joomla на MODx http://www.compline-ufa.ru/perehod-s-joomla-na-modx
          Но все равно потом много еще руками чего подправлять, к примеру те же самые URLы, проиндексированные в яндексе, для сохранения (их у меня было около сотни самых важных) я доделал в ручную, но все равно процесс автоматического переноса скриптом уменьшает обьем работы.

          если у кого либо будут вопросы по переносу, могу помочь, но не очень оперативно, так как на данный момент времени очень загружен работой. Все равно стучите пишите)
            http://www.compline-ufa.ru профессиональный ремонт ноутбуков