Создание плагина профиля пользователя Joomla

Я взял прямой клон плагина профиля пользователя для моей установки Joomla 2.5.9.

я переименовал плагин и файлы соответственно в "profiletest", похожий на старый 1.6 учебник.

я добавил новый ввод в форму, и все работает на бэкэнде, и новая запись отображается, как и ожидалось, в регистрационной форме на передней панели. Однако, когда вы регистрируетесь, я никогда не вижу #__user_profiles таблица усовершенствованный.

здесь много кода, но это копия плагина профиля пользователя (/plugins/user/profile/). Вот profiletest.php onUserAfterSave функция:

function onUserAfterSave($data, $isNew, $result, $error)
{
    $userId = JArrayHelper::getValue($data, 'id', 0, 'int');


    if ($userId && $result && isset($data['profiletest']) && (count($data['profiletest'])))
    {
        try
        {
            //Sanitize the date
            if (!empty($data['profiletest']['dob']))
            {
                $date = new JDate($data['profiletest']['dob']);
                $data['profiletest']['dob'] = $date->format('Y-m-d');
            }

            $db = JFactory::getDbo();
            $db->setQuery(
                'DELETE FROM #__user_profiles WHERE user_id = '.$userId .
                " AND profile_key LIKE 'profiletest.%'"
            );

            if (!$db->query())
            {
                throw new Exception($db->getErrorMsg());
            }

            $tuples = array();
            $order  = 1;

            foreach ($data['profiletest'] as $k => $v)
            {
                $tuples[] = '('.$userId.', '.$db->quote('profiletest.'.$k).', '.$db->quote(json_encode($v)).', '.$order++.')';
            }

            $db->setQuery('INSERT INTO #__user_profiles VALUES '.implode(', ', $tuples));

            if (!$db->query())
            {
                throw new Exception($db->getErrorMsg());
            }

        }
        catch (JException $e)
        {
            $this->_subject->setError($e->getMessage());
            return false;
        }
    }

    return true;
}

он никогда ничего не вставляет в БД, потому что он никогда не входит в этот оператор if:

if ($userId && $result && isset($data['profiletest']) && (count($data['profiletest'])))

в основном это условие не выполняется:$data['profiletest']

кажется довольно простым, так как все, что я изменил в плагине, это "профиль" на "profiletest". Однако, чтобы решить эту проблему, я думаю, вам нужно посмотрите, что моя другая функция называется onContentPrepareData. Хотя опять же он не делает ничего другого, кроме изменения имени. Извините за долгую свалку.

function onContentPrepareData($context, $data)
{
    // Check we are manipulating a valid form.
    if (!in_array($context, array('com_users.profile', 'com_users.user', 'com_users.registration', 'com_admin.profile')))
    {
        return true;
    }

    if (is_object($data))
    {
        $userId = isset($data->id) ? $data->id : 0;
        JLog::add('Do I get into onContentPrepareData?');


        if (!isset($data->profiletest) and $userId > 0)
        {

            // Load the profile data from the database.
            $db = JFactory::getDbo();
            $db->setQuery(
                'SELECT profile_key, profile_value FROM #__user_profiles' .
                ' WHERE user_id = '.(int) $userId." AND profile_key LIKE 'profiletest.%'" .
                ' ORDER BY ordering'
            );
            $results = $db->loadRowList();
            JLog::add('Do I get sql result: '.$results);
            // Check for a database error.
            if ($db->getErrorNum())
            {
                $this->_subject->setError($db->getErrorMsg());
                return false;
            }

            // Merge the profile data.
            $data->profiletest= array();

            foreach ($results as $v)
            {
                $k = str_replace('profiletest.', '', $v[0]);
                $data->profiletest[$k] = json_decode($v[1], true);
                if ($data->profiletest[$k] === null)
                {
                    $data->profiletest[$k] = $v[1];
                }
            }
        }

        if (!JHtml::isRegistered('users.url'))
        {
            JHtml::register('users.url', array(__CLASS__, 'url'));
        }
        if (!JHtml::isRegistered('users.calendar'))
        {
            JHtml::register('users.calendar', array(__CLASS__, 'calendar'));
        }
        if (!JHtml::isRegistered('users.tos'))
        {
            JHtml::register('users.tos', array(__CLASS__, 'tos'));
        }
    }

    return true;
}

опять я замечаю, что никогда не попадаю сюда:

if (!isset($data->profiletest) and $userId > 0)

что, вероятно, влияет на

4 ответов


прежде всего используйте JDump или вложенностями() массив $data->profiletest чтобы проверить ваши данные. Если нет, то я думаю, вам нужно будет пойти проанализировать onContentPrepareForm метод. Если нет, то идите и проверьте, что UserID тянет действительный результат. Один из них должен давать недопустимый результат для "fail" оператора if. После того, как вы сделали это сообщение здесь с результатами:)


таким образом, ключевая функция здесь на самом деле та, которую вы не включаете:onContentPrepareForm. Это функция, которая создает форму, которую пользователь заполняет. Вы не обновили имена полей в этом, поэтому проверки в коде, который вы включили сбой.

если вы перейдете на страницу регистрации с включенным плагином, вы увидите все поля для плагина профиля. Если вы проверяете любое из полей (давайте использовать адрес 1), у него должно быть такое имя: jform[profile][address1]. Мы хотим, чтобы это было jform[profiletype][address1] и тогда ваш код будет работать.

прежде чем перейти к этому, позвольте мне немного объяснить код. The $data переменная должна иметь всю информацию из формы, которая была отправлена. Это соответствует всему, что имеет jform в начале имени, так как это стандартный элемент управления, используемый для регистрационной формы Joomla.

$data будет содержать некоторые отдельные элементы и массив profile. Чтобы обновить имя, найдите файл, который был в plugins/user/profile/profiles/profile.xml, и fields название profile to profiletype. Теперь при подаче $data будет содержать элемент массива profiletype и остальные запросы будут выполняться.


Я думаю, у вас есть проблема здесь: 'profiletest.% 'Вы не должны помещать оператор PHP concatenate внутри цитаты, он рассматривает это как часть строки. Лично я обычно объединяю % перед написанием запроса. Но $db - >quote ('profiletest.'.$k).- то, что ты получишь позже, больше соответствует тому, чего ты хочешь.


Так как $data ['profiletest'] терпит неудачу

изменение имени с профиля на profiletest не было зарегистрировано в xml

пожалуйста, внесите следующие изменения, если у вас нет.

в плагинах\user\profile\Profile\Profile.в XML

изменить <fields name="profile"> to <fields name="profiletest">

также в user\profile\profile.в XML

изменить <filename plugin="profile">profile.php</filename>

to

<filename plugin="profile">profiletest.php</filename>