Многосайтовость на разных доменах, перенос контента


У было заказчика 3 раздельных интернет-магазина (с разными админками) на обыном виртуальном хостинге.
Задача: объединить 3 сайта с одной админкой (на одной лицензии):
  • требовалось настроить многосайтовость на разных доменах
  • перенести контент с двух сайтов на 1 общий
  • накатить новый шаблон для интернет-мазина
Инструкция
1. развернуть резерные копии, перенаправить домены на них.
Важно! проверить, чтобы сайты были доступны под другими резервными доменными именами
2. настроить, чтобы были одинаковые версии php у всех сайтов
3. в админке добавить сайты с путями
3. мне не понадобится для нового сайта ничего, кроме папки upload, поэтому я все удалила (есть резервная копия). Папку upload я переместила в папку uploadt
4. создать файлик в корне symlink.php
<html>
<head><title>Создание ссылок на папки bitrix, local и upload</title></head>
<body>
<?
error_reporting(E_ALL & ~E_NOTICE);
@ini_set("display_errors",1);

if ($_POST['path'])
   $path = rtrim($_POST['path'],"/\\");
else
   $path = '../site1/www';

if ($_POST['create'])
{
   if (preg_match("#^/#",$path))
      $full_path = $path;
   else
      $full_path = realpath($_SERVER['DOCUMENT_ROOT'].'/'.$path);

   if (file_exists($_SERVER['DOCUMENT_ROOT']."/bitrix"))
      $strError = "В текущей папке уже существует папка bitrix";
   elseif (is_dir($full_path))
   {
      if (is_dir($full_path."/bitrix"))
      {
         if (symlink($path."/bitrix",$_SERVER['DOCUMENT_ROOT']."/bitrix"))
         {
            if (symlink($path."/upload",$_SERVER['DOCUMENT_ROOT']."/upload"))
             {
               if (symlink($path."/local",$_SERVER['DOCUMENT_ROOT']."/local"))
                  echo "Символические ссылки удачно созданы";
               else
               $strError = 'Не удалось создать ссылку на папку local, обратитесь к администратору сервера';
              }
           else
           $strError = 'Не удалось создать ссылку на папку upload, обратитесь к администратору сервера';
          }
          else
          $strError = 'Не удалось создать ссылку на папку bitrix, обратитесь к администратору сервера';           
      }
      else
         $strError = 'Указанный путь не содержит папку bitrix';
   }
   else
      $strError = 'Неверно указан путь или ошибка прав доступа';
   
   if ($strError)
      echo ''.$strError.'
Исходный путь: '.$full_path;
}
?>
<form method=post>
Путь к папке, содержащей папки bitrix, local и upload: <input name=path  value="<?=htmlspecialchars($path)?>"><br>
<input type=submit value='Создать' name=create>
</form>
</body> 
</html>
5. его запустить, указать путь к сайту, где битрикс
6. добавить сайт в админ-панели битрикс, авторизоваться
7. запустить мастер устновки решения

перенос каталога
1. у разделов добавила в новом инфоблоке пользовательское свойство UF_OLD_ID типа строка
2. скрипт, который распечатывает все разделы, как массив. Запускаю на старой версии сайта.
        function PrintArray($arResult){
      $i= count($arResult);   
         echo "array(<br>";
         $j = 0;
         foreach ($arResult as $key1=>$arItem) {
            $j++;
            
            $arTemp = array();
            if(is_array($arItem)){
               foreach ($arItem as $key => $value) {
                  if(is_array($value)){

                  }
                  else{
                     $arTemp[] =  '      "'.$key.'" => "'.$value.'"';
                  }      
               }
               $str = implode(',<br>', $arTemp);
               $str = "   '".$key1."'=>array(<br>".$str."<br>   )";
            }
            else{
               $str = "   '".$key1."'=>'".$arItem."'";
            }
            $str .= ($i!=$j)?',<br>':'<br>' ;
            echo $str;
      }
      echo ");";
   }

      function GetSections($iblockId){
      $arResult = array();
      if(CModule::IncludeModule('iblock')){
         $arFilter = array('IBLOCK_ID' => $iblockId); 
         $arSelect = array("ID","CODE","NAME","ACTIVE","DESCRIPTION","DESCRIPTION_TYPE","PICTURE","IBLOCK_SECTION_ID","SORT");
         
         $rsSect = CIBlockSection::GetList(array("depth_level"=>"asc"),$arFilter,false,$arSelect,array("nTopCount"=>100));      
         while ($arSect = $rsSect->Fetch()){
               
               if($arSect["PICTURE"]){
                  $file = CFile::GetFileArray($arSect["PICTURE"]);   
                  $arSect["PICTURE"] = "/uploadt".$file["SRC"];
               }
               $arSect["UF_OLD_ID"] = $arSect["ID"];
               unset($arSect["ID"]);
             $arResult[] = $arSect;
         }
      }
      return $arResult;
   }
PrintArray(GetSections($catalogIblId)); 
3.На стороне нового сайта добавляем секции (копируем массив)
CModule::IncludeModule('iblock');
function AddSections($iblockId, $arSections){
      $arNewSection = array();
      $bs = new CIBlockSection;
      foreach ($arSections as $arSect) {
         if($arSect["IBLOCK_SECTION_ID"]>0){
            $arSect["IBLOCK_SECTION_ID"] = isset($arNewSection[$arSect["IBLOCK_SECTION_ID"]]) ? $arNewSection[$arSect["IBLOCK_SECTION_ID"]] : "";
         } 
         $arSect["IBLOCK_ID"] = $iblockId;
         if($arSect["PICTURE"]){
            $arSect["PICTURE"] = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$arSect["PICTURE"]);
         }         
         $id = $bs->Add($arSect);
         if($id>0){
            $arNewSection [$arSect["UF_OLD_ID"]] = $id;
         }
         else{
             echo $bs->LAST_ERROR;
         }
      }         
}
$arSections = array( //сюда копируем масссив, который сформировали
   '0'=>array(
      "CODE" => "stoly",
      "NAME" => "Столы",
      "ACTIVE" => "Y",
      "DESCRIPTION" => "",
      "DESCRIPTION_TYPE" => "html",
      "PICTURE" => "/uploadt/upload/iblock/729/7290b73fc4da58255d018a2a70c98674.jpg",
      "IBLOCK_SECTION_ID" => "",
      "SORT" => "4",
      "DEPTH_LEVEL" => "1",
      "UF_OLD_ID" => "70"
   ), 
   //.... тут еще много элементов
);
AddSections(128,$arSections);   
4. сравнить свойства в инфоблоках (можно использовать скрипты или модули) для товаров и торг предложений (у меня была небольшая разница, я делала вручную). Удалить лишние, добавить нужные. Для товаров добавить свойство ID_OLD (старый ID), для торг предложений 2 свойства ID_OLD, CML2_LINK_OLD (старый ID, старая привязка к товару)
5. экспортировать/импортировать товары, торг.предложения через стандартный экспорт/импорт инфоблоков. (IDшники, привязку к элементам записать в новые свойства). При загрузке указать путь для картинок /uploadt
6. на стороне нового сайта выполняем
CModule::IncludeModule('iblock');
function AddOffers($iblockId,$iblockOffersId){

      $arSelect = Array("ID", "IBLOCK_ID", "PROPERTY_CML2_LINK_OLD");
      $arFilter = Array("IBLOCK_ID"=>$iblockOffersId,"PROPERTY_CML2_LINK"=>false,"!PROPERTY_CML2_LINK_OLD"=>false);
      $res = CIBlockElement::GetList(Array("id"=>"asc"), $arFilter, false, Array("nPageSize"=>1000), $arSelect);
      $arOffers = array();
      $arIdsOld = array();
      while($arElement = $res->Fetch()){      
         if($arElement[ "PROPERTY_CML2_LINK_OLD_VALUE"]){
            $arOffers [$arElement[ "PROPERTY_CML2_LINK_OLD_VALUE"]][] = $arElement["ID"];   
            $arIdsOld[$arElement[ "PROPERTY_CML2_LINK_OLD_VALUE"]] = $arElement[ "PROPERTY_CML2_LINK_OLD_VALUE"];
         }               
      }

      echo "<pre>";
      print_r($arOffers);
      if(!empty($arIdsOld)){
         $arSelect = Array("ID","PROPERTY_ID_OLD");
         $arFilter = Array("IBLOCK_ID"=>$iblockId,"PROPERTY_ID_OLD"=>$arIdsOld);
         $res = CIBlockElement::GetList(Array("id"=>"asc"), $arFilter, false, Array("nPageSize"=>1000), $arSelect);
         while ($arElement = $res->Fetch()) {
            $idOld = $arElement["PROPERTY_ID_OLD_VALUE"];
            if(isset($arOffers[$idOld])){
               foreach ($arOffers[$idOld] as $idOfferNew) {
                  CIBlockElement::SetPropertyValuesEx( $idOfferNew, false, array("CML2_LINK" =>$arElement["ID"]));
               }
               
            } 
            print_r($arElement);   
         }
      }
      echo "</pre>";
   }
AddOffers(128,130); //128 = $iblockId,130 = $iblockOffersId


добавляем информацию по каталогу