Дополнительное поле в профиле и в списке пользователей с сортировкой

Автор Jerry, 15 июня 2008, 16:18:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Jerry

В данном примере будет показано, как добавить любое поле в профиль, а затем в список пользователей (mlist) с возможностью сортировки по нему.
Мы рассмотрим поле ранга (rank) которое будет выставляться в профиле после поля "Подпись над аватаром".

Создайте в таблице {prefix}members вашей БД поле rank.

В Profile.php после
if (!empty($modSettings['titlesEnable']) && (allowedTo('profile_title_any') || (allowedTo('profile_title_own') && $context['user']['is_owner'])))
$profile_strings[] = 'usertitle';

добавьте
if ($context['user']['is_owner'] || $context['user']['is_admin']) //можно менять права, чтобы редактировал только админ или хозяин профиля.
$profile_strings[] = 'rank';



Потом в массив $context['member'] после
'birth_date' => empty($user_profile[$memID]['birthdate']) || $user_profile[$memID]['birthdate'] === '0001-01-01' ? '0000-00-00' : (substr($user_profile[$memID]['birthdate'], 0, 4) === '0004' ? '0000' . substr($user_profile[$memID]['birthdate'], 4) : $user_profile[$memID]['birthdate']),
добавьте
'rank' => !isset($user_profile[$memID]['rank']) || $user_profile[$memID]['rank'] == '' ? '' : $user_profile[$memID]['rank'],

а после
'is_owner' => $_REQUEST['userID'] == $ID_MEMBER,
добавьте это:
'rank' => !isset($_POST['rank']) || $_POST['rank'] == '' ? '' : stripslashes($_POST['rank']),
//Привязывает то, что передано через POST к $context['member']['rank']


В Profile.russian-utf8.php (или какой у вас языковой файл) добавляем в любое место строчку:
$txt['MyRankText']='Ранг';

А теперь в файле Profile.Template.php добавляем отображение нашего поля профиля и редактирование:

После
   if (!empty($modSettings['titlesEnable']) && $context['member']['title'] != '')
{
echo '
<tr>
<td><b>', $txt['title1'], ': </b></td>
<td>', $context['member']['title'], '</td>
</tr>';
}


добавляем такое:
   if ($context['member']['rank'] != '') // проверка, не пустое ли поле (стоит ли отображать).
{
echo '
<tr>
<td><b>', $txt['MyRankText'], ': </b></td>
<td>', $context['member']['rank'], '</td>
</tr>';
}

А после

if ($context['signature_enabled'])
{
echo '
<tr>
<td width="40%" valign="top">
<b>', $txt[85], ':</b>
<div class="smalltext">', $txt[606], '</div><br />
<br />';



Вот это:

if ($context['user']['is_admin'])
echo '
<tr>
<td width="40%"><b>' . $txt['MyRankText'] . ': </b></td>
<td><input type="text" name="rank" size="50" value="' . $context['member']['rank'] . '" /></td>
</tr>';


А теперь нужно сделать отображение этого поля в списке пользователей (mlist) и возможность сортировки по этому полю:



В Memberlist.template.php после
<td class="windowbg2">', $member['icq']['link'], '</td>
(или после того столбца, после которого нужен новый слолбец) добавьте столбец
<td class="windowbg" align="center">', $member['rank'], '</td>,

выставив нужный вам class (windowbg или windowbg2, повлияет на цвет столбца) и align (выравнивание).

А в файле Memberlist после:
'ICQ' => array(
'label' => $txt[513],
'width' => '25'


(или после нужного вам, по аналогии с Memberlist.template.php)
добавьте:

'rank' => array(
'label' => $txt['MyRankText']


А теперь нужна сортировка, иначе при попытке сортировать будет ошибка:
После
    'ICQ' => array(
'down' => 'LENGTH(mem.ICQ) > 0 DESC, ISNULL(mem.ICQ) OR mem.ICQ = 0 ASC, mem.ICQ ASC',
'up' => 'LENGTH(mem.ICQ) > 0 ASC, ISNULL(mem.ICQ) OR mem.ICQ = 0 DESC, mem.ICQ DESC'
),



добавим

      'rank' => array(
'down' => 'ISNULL(mem.rank) ASC, mem.rank ASC',
'up' => 'ISNULL(mem.rank) DESC, mem.rank DESC'
),

//mem - всевдоним имени вашей таблицы [prefix]members, а rank после "mem." - поле в БД соответственно. Rank перед "=> array" не является полем БД, просто название. Для легкости они названы одинаково.
//DESC и ASC можно менять для изменения направления сортировки, если очень нужно.

А для строчки "Ранг" в списке пользователей, нужно добавить ту же самую строчку
$txt['MyRankText']='Ранг';
но уже в файл Modifications.russian-utf8.php (или какой у вас языковой файл). (можно конечно и первую тогда убрать, т.к. modifications подгружается везде, но это я не проверял).

Если нужно, отображение над аватаром сделать можно:

В любое место, где вам нужно, например после
      // Show the member's primary group (like 'Administrator') if they have one.
if (isset($message['member']['group']) && $message['member']['group'] != '')
echo '
', $message['member']['group'], '<br />';

Можно добавить наше поле:
      if (isset($message['member']['rank']) && $message['member']['rank'] != '')
echo '
', $message['member']['rank'], '<br />';


А перед $message['member']['title2'] можно добавить нашу строчку MyRankText, но для ранга это не нужно (по этому не рассматривается). В другом случае добавьте, разделив запятой.


//P.S. У меня был другой случай, по этому если у вас вышла ошибка, пишите сюда. Скажу, что не так.
//По аналогии с этим мануалом можно добавлять любые поля в любое место профиля, а также список пользователей mlist. И вообще, в SMF можно менять всё как нужно, чтобы получить что угодно.

hover

а как добавить в список пользователей существующее дополнительное поле? Рылся в базе данных, хотел проделать манипуляции по аналогии от  момента добавления поля в список, но не могу найти где прописаны дополнительные поля в БД.

Arcady11

решение: http://www.simplemachines.ru/index.php?topic=10477.0

Ставим мод и то, что не установилось, доделываем руками

п.с. для SMF 2.0 RC3


Dr_Zhalnin

Цитата: Arcady11 от 01 июня 2010, 12:59:41
решение: http://www.simplemachines.ru/index.php?topic=10477.0

Ставим мод и то, что не установилось, доделываем руками

п.с. для SMF 2.0 RC3
А есть ли мод для 1.1.11??
Мне нужны дополнительные поля в списке....как туда их втулить я так и не понял....ну и заодно что бы и в профиле было....
SsangYong Club Украина http://ssangyong-club.org<br />SsangYong club Ukrainian

Bugo


Dr_Zhalnin

Цитата: Bugo от 05 августа 2010, 13:19:54
Посмотрите эти моды
http://custom.simplemachines.org/mods/index.php?mod=1301
http://custom.simplemachines.org/mods/index.php?mod=1474
и попробуйте сделать по аналогии.

А чтобы в профиле было => http://custom.simplemachines.org/mods/index.php?mod=319
В профиле я уже сделал...просто  как сделать что бы в списке появились некоторые поля профиля.....
Попробую сделать по аналогии но как перенести??Что бы дважды не заполнять...
SsangYong Club Украина http://ssangyong-club.org<br />SsangYong club Ukrainian

Arcady11

А как сделать, чтобы сортировка по полям профиля была и в результатах поиска пользователей? Сделал дополнительные поля профиля с помощью мода в списке пользователей и сортировку, а нужно ещё сортировку, когда получили результат по поиску по дополнительному профилю пользователя.

И ещё, как вариант, можно ли сделать многоуровневую сортировку, когда сортируем по полю №1, потом результат сортируем по полю №2 и так далее?