7

Joomla2.5.9インストール用のユーザープロファイルプラグインの直接クローンを作成しました。

古い1.6チュートリアルと同様に、プラグインとファイルの名前を「profiletest」に変更しました

フォームに新しい入力を追加しました。すべてがバックエンドで機能し、新しいエントリがフロントエンドの登録フォームに期待どおりに表示されます。#__user_profilesただし、登録すると、テーブルが更新されることはありません。

ここにはたくさんのコードがありますが、これはユーザープロファイルプラグイン(/ plugins / user / profile /)のコピーです。次に、profiletest.phponUserAfterSave関数を示します。

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ステートメントに入らないため、DBに何も挿入されません。

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

基本的に、この条件は失敗します。$data['profiletest']

プラグインで変更したのは「profile」から「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)

これはおそらくonUserAfterSave機能に影響します。

編集ここに機能がありますonContentPrepareForm

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating a valid form.
    $name = $form->getName();
    if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration')))
    {
        return true;
    }

    // Add the registration fields to the form.
    JForm::addFormPath(dirname(__FILE__) . '/profiles');
    $form->loadFile('profile', false);

    $fields = array(
        'address1',
        'address2',
        'city',
        'region',
        'country',
        'postal_code',
        'phone',
        'website',
        'favoritebook',
        'aboutme',
        'dob',
        'tos',
    );

    $tosarticle = $this->params->get('register_tos_article');
    $tosenabled = $this->params->get('register-require_tos', 0);

    // We need to be in the registration form, field needs to be enabled and we need an article ID
    if ($name != 'com_users.registration' || !$tosenabled || !$tosarticle)
    {
        // We only want the TOS in the registration form
        $form->removeField('tos', 'profiletest');
    }
    else
    {
        // Push the TOS article ID into the TOS field.
        $form->setFieldAttribute('tos', 'article', $tosarticle, 'profiletest');
    }

    foreach ($fields as $field)
    {
        // Case using the users manager in admin
        if ($name == 'com_users.user')
        {
            // Remove the field if it is disabled in registration and profile
            if ($this->params->get('register-require_' . $field, 1) == 0
                && $this->params->get('profile-require_' . $field, 1) == 0)
            {
                $form->removeField($field, 'profiletest');
            }
        }
        // Case registration
        elseif ($name == 'com_users.registration')
        {
            // Toggle whether the field is required.
            if ($this->params->get('register-require_' . $field, 1) > 0)
            {
                $form->setFieldAttribute($field, 'required', ($this->params->get('register-require_' . $field) == 2) ? 'required' : '', 'profiletest');
            }
            else
            {
                $form->removeField($field, 'profiletest');
            }
        }
        // Case profile in site or admin
        elseif ($name == 'com_users.profile' || $name == 'com_admin.profile')
        {
            // Toggle whether the field is required.
            if ($this->params->get('profile-require_' . $field, 1) > 0)
            {
                $form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profiletest');
            }
            else
            {
                $form->removeField($field, 'profiletest');
            }
        }
    }

    return true;
}

私は何が間違っているのですか?

var_dump($data); exit();すぐ内側を編集onUserAfterSave

array(20) { ["isRoot"]=> NULL ["id"]=> int(1291) ["name"]=> string(4) "test" ["username"]=> string(4) "test" ["email"]=> string(22) "test@test.com" ["password"]=> string(65) "5757d7ea6f205f0ee9102e41f66939b4:7dTHzEolpDFKa9P2wmZ4SYSjJSedWFXe" ["password_clear"]=> string(4) "test" ["usertype"]=> NULL ["block"]=> NULL ["sendEmail"]=> int(0) ["registerDate"]=> string(19) "2013-03-05 17:00:40" ["lastvisitDate"]=> NULL ["activation"]=> NULL ["params"]=> string(2) "{}" ["groups"]=> array(1) { [0]=> string(1) "2" } ["guest"]=> int(1) ["lastResetTime"]=> NULL ["resetCount"]=> NULL ["aid"]=> int(0) ["password2"]=> string(4) "test" }
4

4 に答える 4

3

したがって、ここでの重要な機能は、実際には含まれていない機能ですonContentPrepareForm。これは、ユーザーが入力するフォームを作成する関数です。この中のフィールド名を更新していないため、含めたコードのチェックは失敗します。

プラグインをオンにして登録ページに移動すると、プロファイルプラグインのすべてのフィールドが表示されます。いずれかのフィールドを検査する場合(アドレス1を使用しましょう)、次のような名前にする必要がありますjform[profile][address1]。私たちはこれを望んでjform[profiletype][address1]おり、そうすればあなたのコードは機能します。

ただし、その前に、コードについて少し説明します。変数には、$data送信されたフォームからのすべての情報が含まれている必要があります。jformこれは、Joomlaが登録フォームに使用する標準のコントロールであるため、名前の先頭にあるすべてのものと一致します。

$data次に、いくつかの個別のアイテムと配列が含まれますprofile。その名前を更新するには、にあったファイルを見つけて、名前をからにplugins/user/profile/profiles/profile.xml変更します。これで、送信されると配列要素が含まれ、残りのクエリが実行されます。fieldsprofileprofiletype$dataprofiletype

于 2013-03-04T23:24:43.497 に答える
1

まず、JDumpまたは var_dump() 配列$data->profiletestを使用して、データがあることを確認します。そうでない場合は、メソッドを分析する必要があると思いますonContentPrepareForm。そうでない場合は、UserID が有効な結果を引き込んでいることを確認してください。if ステートメントを「失敗」させるには、2 つのうちの 1 つが無効な結果を与えている必要があります。その投稿を完了したら、結果をここに戻してください:)

于 2013-03-04T13:55:04.360 に答える
0

$data['profiletest'] が失敗するため

profile から profiletest への名前の変更が xml に登録されていません

まだ変更していない場合は、次の変更を行ってください。

plugins\user\profile\profiles\profile.xml 内

変化する<fields name="profile"> to <fields name="profiletest">

また、user\profile\profile.xml に

変化する<filename plugin="profile">profile.php</filename>

<filename plugin="profile">profiletest.php</filename>
于 2013-03-08T13:58:54.167 に答える
0

ここに問題があると思います: 'profiletest.%' 引用符内に php 連結演算子を入れるべきではありません。それは文字列の一部として扱われます。個人的には、通常、クエリを記述する前に % を連結します。しかし $db->quote('profiletest.'.$k).' あなたが後で持っているものは、あなたが望むものの線に沿っています。

于 2013-02-22T19:07:58.363 に答える