Создание плагина профиля пользователя 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>