1

我创建了一个 Joomla 1.7 插件来向用户配置文件添加一些自定义字段。作为基础,我从 Joomla 中包含的配置文件插件开始作为示例。

我添加了一个复选框字段,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<form>
    <fields name="profile">
        <fieldset name="profile" label="PLG_USER_WISPROFILE_SLIDER_LABEL">
            <field name="speltak1" type="checkboxes" label="PLG_USER_WISPROFILE_SPELTAK_LABEL"
                description="PLG_USER_WISPROFILE_SPELTAK_DESC">
                <option value="Bevers">PLG_USER_WISPROFILE_OPTION_BEVERS</option>
                <option value="Welpen Ochtend Horde">PLG_USER_WISPROFILE_OPTION_WELPENOCHTEND
                </option>
                <option value="Welpen Middag Horde">PLG_USER_WISPROFILE_OPTION_WELPENMIDDAG
                </option>
                <option value="Scouts Verkenners">PLG_USER_WISPROFILE_OPTION_SCOUTSVERKENNERS
                </option>
                <option value="Scouts Verkensters">PLG_USER_WISPROFILE_OPTION_SCOUTSVERKENSTERS
                </option>
                <option value="Explorers">PLG_USER_WISPROFILE_OPTION_EXPLORERS</option>
                <option value="Klimstam">PLG_USER_WISPROFILE_OPTION_KLIMSTAM</option>
            </field>
        </fieldset>
    </fields>
</form>

这将在注册和编辑用户配置文件期间正确地将字段添加到表单中。但是当我尝试保存配置文件时,数据库中没有存储任何内容。复选框字段被转换为 $data 变量中的数组。但是示例代码无法将其保存到数据库中。有人知道怎么做这个吗?

4

2 回答 2

1

看起来您正在正确拦截表单创建并将您的字段添加到表单中。

您没有提及您正在运行以在保存表单时捕获表单的任何代码/功能。也许您期待 Joomla 神奇地捕捉您的新现场数据并保存?如果是这样,那么不幸的是它不能那样工作。你需要做一些额外的工作。

从文档中查看此页面并注意“function onUserAfterSave”部分。 http://docs.joomla.org/Creating_a_profile_plugin

于 2011-12-09T03:04:27.763 回答
1

它不保存的原因是因为您将数组元素传递给 sql 查询。你需要改变它的形式。通过序列化数据或将其转换为 json 或其他方式。此时,它将保存在数据库中。

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

    if ($userId && $result && isset($data['gw2atpprofile']) && (count($data['gw2atpprofile']))){
        try {
            $db = &JFactory::getDbo();
            $db->setQuery('DELETE FROM #__user_profiles WHERE user_id = '.$userId.' AND profile_key LIKE \'gw2atpprofile.%\'');
            if (!$db->query()) {
                throw new Exception($db->getErrorMsg());
            }

            $tuples = array();
            $order    = 1;
            foreach ($data['gw2atpprofile'] as $k => $v) {
                if (is_array($v)){
                    $v = serialize($v);
                }
                $tuples[] = '('.$userId.', '.$db->quote('gw2atpprofile.'.$k).', '.$db->quote($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;
}

此时,您将需要创建一种方法来获取信息。我知道这个帖子很旧,但我只是想为任何可能偶然发现这个问题的新成员发布一个理由。

于 2015-09-26T01:27:44.020 回答