我创建了一个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变量中的数组。但示例代码无法将其保存到数据库中。有人知道怎么做这个吗?
答案 0 :(得分:1)
您似乎正在截取表单创建并将字段添加到表单中。
在保存表单时,您没有提及正在运行的任何代码/函数来捕获表单。也许你期望Joomla能够神奇地捕获你的新现场数据并保存它?如果是这样,那么不幸的是它不会这样。你需要做一些额外的工作。
从文档中查看此页面并注意'function onUserAfterSave'部分。 http://docs.joomla.org/Creating_a_profile_plugin
答案 1 :(得分:1)
它不保存的原因是因为您将数组元素传递给sql查询。您需要更改此形式。通过序列化数据或将其转换为json或其他东西。此时,它将保存在db。
中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;
}
此时您需要创建一种获取信息的方法。我知道这个帖子已经过时了,但我只想发布任何可能偶然发现这个问题的新成员的原因。