Example #1
0
 /**
  * Синхронизация подписчиков с мейлтанком
  * @param $isSync boolean false - только сравнить, true - синхронизировать
  */
 public static function syncFromMailtank($isSync = false)
 {
     $subscriberCount = 0;
     try {
         $page = 1;
         $res = self::getPage($page);
         $totalPages = $res['pages_total'];
         while (true) {
             // Обрабатываем подписчиков
             foreach ($res['objects'] as $subscriber) {
                 $subscriberCount++;
                 $mailtankId = $subscriber['id'];
                 $email = $subscriber['email'];
                 $mailtank2email = Mailtank2Email::find()->where(['email' => $email])->asArray()->one();
                 if (!$mailtank2email) {
                     // У нас нет такого email
                     $obj = Mailtank2Email::find()->where(['mailtankId' => $mailtankId])->asArray()->one();
                     if (!$obj) {
                         // Если у нас нет такого mailtankId, то это новый подписчик
                         Console::outputColored("- Subscriber <%y" . $email . "%n> exists only in the mailtank", false);
                         if ($isSync) {
                             if (self::createInnerSubscriber($email, $mailtankId)) {
                                 Console::outputColored("...%g created%n", false);
                             } else {
                                 Console::outputColored("...%r not created%n", false);
                             }
                         }
                         Console::output();
                     } else {
                         // Если у нас есть такой mailtankId, то прописываем ему email с мейлтанка
                         Console::outputColored("- Found inner subscriber mailtankId=<%y" . $mailtankId . "%n> but other email=<%y" . $obj['email'] . "%n>", false);
                         if ($isSync) {
                             $obj['email'] = $email;
                             if ($obj->save()) {
                                 Console::outputColored("...%g changed to <" . $email . ">%n", false);
                             } else {
                                 Console::outputColored("...%r not changed%n", false);
                             }
                         }
                         Console::output();
                     }
                 } else {
                     // У нас есть такой email
                     // Если совпадает mailtankId, то корректный пользователь и ничего делать не надо
                     if ($mailtank2email['mailtankId'] == $mailtankId) {
                         continue;
                     }
                     Console::outputColored("- Same emails <%y" . $email . "%n> belong to different subscribers in the mailtank. Inner id=<%y" . $mailtank2email['mailtankId'] . "%n>, mailtank id=<%y" . $mailtankId . "%n>");
                     if ($isSync) {
                         // Если не совпадает mailtankId, ищем подписчика по mailtankId с мейлтанка
                         $obj = Mailtank2Email::find()->where(['mailtankId' => $mailtankId])->asArray()->one();
                         if ($obj) {
                             // Если нашли, то удаляем его, а предыдущему меняем mailtankId
                             if ($obj->delete()) {
                                 Console::outputColored("  %gInner subscriber mailtankId <" . $mailtankId . "> succesfully delete%n");
                             } else {
                                 Console::outputColored("  %rWrong delete mailtank2email with mailtankId=<" . $mailtankId . ">%n");
                                 die;
                             }
                         }
                         $mailtank2email['mailtankId'] = $mailtankId;
                         if ($mailtank2email->save()) {
                             Console::outputColored("  %gFor email <" . $email . "> changed MailtankId to <" . $mailtankId . ">%n");
                         } else {
                             Console::outputColored("  %rFor email <" . $email . "> didn't change MailtankId to <" . $mailtankId . ">%n");
                         }
                     }
                 }
             }
             if ($page >= $totalPages) {
                 break;
             }
             $page++;
             $res = self::getPage($page);
         }
     } catch (MailtankException $e) {
         if ($e->getCode() == 404) {
             return true;
         }
         throw $e;
     }
 }