Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Import/Data/Thread.php
<?php

namespace XF\Import\Data;

use function
intval, is_string;

class
Thread extends AbstractEmulatedData
{
    use
HasDeletionLogTrait;

   
/**
     * @var ThreadReplyBan[]
     */
   
protected $replyBans = [];

   
/**
     * @var Poll
     */
   
protected $poll;
    protected
$pollOldId;

    protected
$watchers = [];

    protected
$columnMap = [
       
'first_post_likes' => 'first_post_reaction_score'
   
];

    public function
getImportType()
    {
        return
'thread';
    }

    public function
getEntityShortName()
    {
        return
'XF:Thread';
    }

    public function
set($field, $value, array $options = [])
    {
       
$result = parent::set($field, $value, $options);

        if (
$field == 'first_post_likes' && $value >= 1)
        {
           
$this->set('first_post_reactions', [1 => intval($value)]);
        }

        return
$result;
    }

    public function
setCustomFields(array $customFields)
    {
        foreach (
$customFields AS &$fieldValue)
        {
            if (
is_string($fieldValue))
            {
               
$fieldValue = $this->convertToUtf8($fieldValue);
            }
        }

       
$this->custom_fields = $customFields;
    }

    public function
addReplyBan($oldId, ThreadReplyBan $ban)
    {
       
$this->replyBans[$oldId] = $ban;
    }

    public function
addPoll($oldId, Poll $poll)
    {
       
$this->pollOldId = $oldId;
       
$this->poll = $poll;

       
$this->discussion_type = 'poll';
    }

    public function
addThreadWatcher($userId, $emailSubscribe)
    {
       
$this->watchers[$userId] = $emailSubscribe;
    }

    protected function
preSave($oldId)
    {
       
$this->forceNotEmpty('username', $oldId);
       
$this->forceNotEmpty('title', $oldId);

        if (!
$this->discussion_type)
        {
           
$this->discussion_type = \XF\ThreadType\AbstractHandler::BASIC_THREAD_TYPE;
           
$this->type_data = [];
        }
    }

    protected function
postSave($oldId, $newId)
    {
       
$this->insertStateRecord($this->discussion_state, $this->post_date);

        if (
$this->custom_fields)
        {
           
$this->insertCustomFieldValues('xf_thread_field_value', 'thread_id', $newId, $this->custom_fields);
        }

        if (
$this->replyBans)
        {
            foreach (
$this->replyBans AS $oldReplyBanId => $replyBan)
            {
               
$replyBan->thread_id = $newId;
               
$replyBan->log(false);
               
$replyBan->checkExisting(false);
               
$replyBan->useTransaction(false);

               
$replyBan->save($oldReplyBanId);
            }
        }

       
$this->handleDiscussionTypeData($this->discussion_type, $oldId, $newId);

        if (
$this->watchers)
        {
           
/** @var \XF\Import\DataHelper\Thread $threadHelper */
           
$threadHelper = $this->dataManager->helper('XF:Thread');
           
$threadHelper->importThreadWatchBulk($newId, $this->watchers);
        }
    }

    protected function
handleDiscussionTypeData(string $discussionType, $oldId, $newId)
    {
        if (
$discussionType == 'poll' && $this->poll)
        {
           
$this->poll->content_type = 'thread';
           
$this->poll->content_id = $newId;

           
$this->poll->save($this->pollOldId);
        }

        if (
$discussionType == 'question')
        {
           
$this->db()->insert(
               
'xf_thread_question',
                [
                   
'thread_id' => $newId,
                   
'solution_post_id' => 0,
                   
'solution_user_id' => 0
               
],
               
false,
               
false,
               
'IGNORE'
           
);
           
// because of post mapping, we need to import the solution data after posts
       
}
    }
}