Решено Перенос дополнительных полей пользователей с vBulletin на Xenforo

Статус
В этой теме нельзя размещать новые ответы.

Duero

Проверенные
Сообщения
84
Реакции
16
Баллы
11,010
Процесс перехода с vB на Xenforo в принципе понятен и работает исправно. Вариантов 2 vB 3.8.* -> Xen 1.5.*-> Xen 2.* или vB 3.8.* -> Xen 2.*
В первом случае удастся так же перенести галерею и личные альбомы пользователей. Во втором случае это невозможно.

Но в любом случае у меня не удается ни так ни так перенести дополнительные поля пользователей (Custom Fields).

Доп поля в Xenforo в принципе не создаются. И информация из доп полей воблы рассовывается по имеющимся полям. Не понимаю почему так происходит.

Ниже код таблиц с полями пользователей

REPLACE INTO `userfield` (`userid`, `temp`, `field1`, `field2`, `field3`, `field4`, `field6`) VALUES
(4, NULL, 'Isuzu Vehicross', NULL, 'Маасква', NULL, ''),
(18, NULL, 'Jeep Grand Cherokee Limited 4.7', '2005', 'Moscow', 'Lex', ''),
REPLACE INTO `xf_user_field` (`field_id`, `display_group`, `display_order`, `field_type`, `field_choices`, `match_type`, `match_params`, `max_length`, `required`, `show_registration`, `user_editable`, `viewable_profile`, `viewable_message`, `display_template`, `moderator_editable`) VALUES
(_binary 0x61696D, 'contact', 10, _binary 0x74657874626F78, _binary '', _binary 0x7265676578, _binary 0x7B227265676578223A225E5B612D7A412D5A302D39402E205D2B24227D, 80, 0, 0, 'yes', 1, 0, '', 0),
(_binary 0x66616365626F6F6B, 'contact', 70, _binary 0x74657874626F78, _binary '', _binary 0x76616C696461746F72, _binary 0x7B2276616C696461746F72223A2246616365626F6F6B227D, 0, 0, 0, 'yes', 1, 0, '', 0),
(_binary 0x6669656C6431, 'personal', 1, _binary 0x7465787461726561, _binary 0x5B5D, _binary 0x6E6F6E65, _binary 0x5B5D, 0, 0, 1, 'yes', 1, 1, '', 0),
(_binary 0x6669656C6432, 'personal', 1, _binary 0x7465787461726561, _binary 0x5B5D, _binary 0x6E6F6E65, _binary 0x5B5D, 0, 0, 1, 'yes', 1, 1, '', 0),
(_binary 0x6669656C6433, 'personal', 1, _binary 0x74657874626F78, _binary 0x5B5D, _binary 0x6E6F6E65, _binary 0x5B5D, 0, 0, 1, 'yes', 1, 1, '', 1),
(_binary 0x6669656C6434, 'personal', 1, _binary 0x74657874626F78, _binary 0x5B5D, _binary 0x6E6F6E65, _binary 0x5B5D, 0, 0, 1, 'yes', 1, 1, '', 1),
(_binary 0x6669656C6436, 'personal', 1, _binary 0x74657874626F78, _binary 0x5B5D, _binary 0x6E6F6E65, _binary 0x5B5D, 0, 0, 1, 'yes', 1, 1, '', 1),
(_binary 0x696371, 'contact', 30, _binary 0x74657874626F78, _binary '', _binary 0x6E756D626572, _binary '', 0, 0, 0, 'yes', 1, 0, '', 0),
(_binary 0x736B797065, 'contact', 50, _binary 0x74657874626F78, _binary '', _binary 0x7265676578, _binary 0x7B227265676578223A225E5B612D7A412D5A302D392D5F2E2C403A5D2B24227D, 30, 0, 0, 'yes', 1, 0, '', 0),
(_binary 0x74776974746572, 'contact', 80, _binary 0x74657874626F78, _binary '', _binary 0x76616C696461746F72, _binary 0x7B2276616C696461746F72223A2254776974746572227D, 0, 0, 0, 'yes', 1, 0, '', 0),
(_binary 0x7961686F6F, 'contact', 40, _binary 0x74657874626F78, _binary '', _binary 0x6E6F6E65, _binary '', 0, 0, 0, 'yes', 1, 0, '', 0);
REPLACE INTO `xf_user_field_value` (`user_id`, `field_id`, `field_value`) VALUES
(4, _binary 0x61696D, ''),
(4, _binary 0x696371, '466392180'),
(4, _binary 0x736B797065, ''),
(4, _binary 0x7961686F6F, ''),
(18, _binary 0x61696D, ''),
(18, _binary 0x696371, '921804'),
(18, _binary 0x736B797065, ''),
(18, _binary 0x7961686F6F, ''),
 

Вложения

  • Clip010.jpg
    Clip010.jpg
    65.7 KB · Просмотры: 18
  • Clip011.jpg
    Clip011.jpg
    70.1 KB · Просмотры: 18
Последнее редактирование:
Я так понимаю эта часть в импортере отвечает за доп поля?
Код:
    public function stepUserFields($start, array $options)
    {
        $sDb = $this->_sourceDb;
        $prefix = $this->_prefix;

        /* @var $model XenForo_Model_Import */
        $model = $this->_importModel;

        // fetch all profile fields except 1-4, for which we already have analogues
        $profileFields = $sDb->fetchAll('
            SELECT *
            FROM ' . $prefix . 'profilefield
            WHERE profilefieldid > 4
        ');

        $phrases = $sDb->fetchPairs('
            SELECT varname, text
            FROM ' . $prefix . 'phrase
            WHERE languageid = 0
            AND fieldname = ?
        ', 'cprofilefield');

        $existingFields = XenForo_Model::create('XenForo_Model_UserField')->getUserFields();

        $userFieldLookups = array();
        $total = 0;

        XenForo_Db::beginTransaction($this->_db);

        foreach ($profileFields AS $profileField)
        {
            $title = $this->_convertToUtf8($phrases["field$profileField[profilefieldid]_title"]);
            $description = $this->_convertToUtf8($phrases["field$profileField[profilefieldid]_desc"]);

            $fieldId = $model->getUniqueFieldId(
                str_replace('-', '_', XenForo_Link::getTitleForUrl($title, true)),
                $existingFields,
                25);

            $import = array(
                'field_id' => $fieldId,
                'title' => $title,
                'description' => $description,
                'display_order' => $profileField['displayorder'],
                'max_length' => $profileField['maxlength'],
                'viewable_profile' => !$profileField['hidden'],
            );

            switch ($profileField['type'])
            {
                case 'select':
                case 'radio':
                case 'checkbox':
                    $import['field_type'] = $profileField['type'];
                    $import['field_choices'] = $this->_convertUserFieldChoices($profileField, $userFieldLookups);
                    if (!$import['field_choices'])
                    {
                        continue;
                    }
                    break;

                case 'select_multiple':
                    $import['field_type'] = 'multiselect';
                    $import['field_choices'] = $this->_convertUserFieldChoices($profileField, $userFieldLookups);
                    if (!$import['field_choices'])
                    {
                        continue;
                    }
                    break;

                case 'textarea':
                    $import['field_type'] = 'textarea';
                    break;

                case 'input':
                default:
                    $import['field_type'] = 'textbox';
                    break;
            }

            switch ($profileField['required'])
            {
                case 3: // yes, always
                case 1: // yes, at registration and profile update
                    $import['required'] = 1;
                    $import['show_registration'] = 1;
                    break;

                case 2: // no, but display at registration
                    $import['required'] = 0;
                    $import['show_registration'] = 1;
                    break;

                case 0: // no
                default:
                    $import['required'] = 0;
                    $import['show_registration'] = 0;
                    break;
            }

            switch ($profileField['editable'])
            {
                case 0: // no
                    $import['user_editable'] = 'never';
                    break;

                case 2: // only at registration
                    $import['user_editable'] = 'once';
                    break;

                case 1: // yes
                default:
                    $import['user_editable'] = 'yes';
                    break;
            }

            switch ($profileField['form'])
            {
                case 0: // edit your details
                    $import['display_group'] = 'personal';
                    break;

                case 1: // options: login / privacy
                case 2: // options: messaging
                case 3: // options: thread viewing
                case 4: // options: date / time
                case 5: // options: other
                default:
                    $import['display_group'] = 'preferences';
                    break;
            }

            if ($profileField['regex'])
            {
                $import['match_type'] = 'regex';
                $import['match_regex'] = $this->_convertToUtf8($profileField['regex']);
            }
            else
            {
                $import['match_type'] = 'none';
            }

            if ($imported = $model->importUserField($profileField['profilefieldid'], $import))
            {
                $total++;
            }
        }

        XenForo_Db::commit($this->_db);

        $this->_session->setExtraData('userFieldLookups', $userFieldLookups);

        $this->_session->incrementStepImportTotal($total);

        return true;
    }

    protected function _convertUserFieldChoices(array $profileField, array &$fieldChoiceLookups)
    {
        try
        {
            $choiceData = @unserialize($profileField['data']);
        }
        catch (Exception $e)
        {
            // this is either corrupted data or an invalid char set. The latter isn't something we can automatically detect
            return array();
        }

        if (!is_array($choiceData))
        {
            return array();
        }

        $choices = array();

        foreach ($choiceData AS $key => $choice)
        {
            $choice = $this->_convertToUtf8($choice);

            $choiceId = XenForo_Helper_String::wholeWordTrim($choice, 23, 0, '');

            if ($choiceId != '')
            {
                $choiceId = str_replace('-', '_', XenForo_Link::getTitleForUrl($choiceId, true));

                $i = 1;
                $choiceIdBase = $choiceId;
                while (isset($choices[$choiceId]))
                {
                    $choiceId = $choiceIdBase . '_' . ++$i;
                }
            }
            else
            {
                $choiceId = $key;
            }

            $choices[$choiceId] = $choice;
        }

        $lookUps = array();

        switch ($profileField['type'])
        {
            case 'checkbox':
            case 'select_multiple':
                $multiple = true;
                $i = 1;
                foreach ($choices AS $key => $value)
                {
                    $lookUps[$i] = $key;
                    $i = $i * 2;
                }
                break;

            case 'select':
            case 'radio':
            default:
                $multiple = false;
                foreach ($choices AS $key => $value)
                {
                    $lookUps[$value] = $key;
                }
                break;
        }

        $fieldChoiceLookups[$profileField['profilefieldid']] = array(
            'multiple' => $multiple,
            'choices' => $lookUps
        );

        return $choices;
    }

Может кто помочь в решении этой проблемы?
 
Ну вот, сам и разобрался. Рассказываю. У кого такая же проблема с переносом из vBulletin доп. полей. (свои настройки, стоковых полей в форуме нет.)
Порядок следующий:
Предварительно на свеже установленном форуме 1.5 нужно очистить форум от всего. Узлы и категории, доп поля пользователей, звания и т.д.

В файле импортера (\library\XenForo\Importer\vBulletin.php) надо удалить строку WHERE profilefieldid > 4
что бы импортер не игнорировал первые 4 доп. поля.

Затем если у вас информация из доп. полей попадает не только в нужные поля, но и в "О пользователе, Метоположение, и .т.п.) то нужно закомментировать код:

Код:
        $import['about'] = '';
        if (isset($user['field1']))
        {
            $import['about'] .= $this->_convertToUtf8($user['field1'], true) . "\n\n";
        }
        if (isset($user['field3']))
        {
            $import['about'] .= $this->_convertToUtf8($user['field3'], true) . "\n\n";
        }
        $import['about'] = trim($import['about']);

        if (isset($user['field2']))
        {
            $import['location'] = $this->_convertToUtf8($user['field2'], true);
        }
        if (isset($user['field4']))
        {
            $import['occupation'] = $this->_convertToUtf8($user['field4'], true);
        }

После чего импорт будет проходить нормально.

Надеюсь что кому нибудь помог с подобной проблемой
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу