Перейти к контенту

Учимся добавлять установки в профиль юзера


Song

Рекомендуемые сообщения

Очень часто те или иные модификации подделываются под каждого конкретного пользователя. Оно и понятно: у каждого свой взгляд на то, что ему нужно, а что нет.

Поэтому при установке очередного мода, стоит позаботиться о будущем выключении этой функции, если она кому-то не понравится.

Для добавления установки в профиль нужно сделать 5 этапов:

 

1) БД. Добавить поле в таблицу пользователей

2) functions.php. Прочитать значение добавленного поля.

3) Userсp.php, usercp_functions.php - обеспечить работу с полем

4) lang_ucp.php, skin_ucp.php - добавить визуальность.

5) Добавить функциональность в форум. Другими словами говоря, скажем форуму что делать при выборе одного параметра, а что при другом.

 

 

Добавлено в [mergetime]1096001006[/mergetime]

1.

Для универсальности будем рассматривать добавление вопросов в профиль типа "Да/Нет".

Например, "Показывать быстрый ответ всегда открытым?" Да/Нет.

Для такого вопроса подойдёт поле TINYINT. А т.к. ответ очень прост - Да (1), Нет (0), то число разрядов в значении будет одно.

Чтобы создать поле пройдите в админку вашего форума, SQL Managment -> MySQL ToolBox, проскролируйте вниз открывшиеся таблицы, и в поле ниже введите запрос:

ALTER TABLE ibf_members ADD название TINYINT(1) NOT NULL default значение_по_умолчанию

 

Примечания:

1) Если у вас другой префикс таблиц (не стандартный ibf), то соответственно измените название таблицы

2) значение по умолчанию определяет какой параметр будет обозначен для имеющихся пользователей, а также для всех вновь зарегистрировавшихся. Поэтому, если вы например, добавляете непопулярную фичу, которая нужна ограниченному количеству юзеров, то поставьте default 0 (Нет). Тогда у всех она будет выключена, но все желающие смогут включить её у себя в профиле.

3) Название для поле выбирайте, таким чтобы из него следовала добавляемая фича. К вышеуказанному примеру подойдёт поле quick_reply. В названии можно использовать латинские буквы и знак подчёркивания.

 

 

Добавлено в [mergetime]1096001376[/mergetime]

2.

После того как поле добавлено, нужно чтобы форум знал о его существовании. Теперь о нём знает MySQL, однако сам форум - нет.

Для этого откройте файл functions.php

Найдите там следующий кусок:

     	if ($member_id != 0)
        {
                  
            $DB->query("SELECT moderator.mid as is_mod, moderator.allow_warn, m.id, m.name, m.mgroup, m.password, m.email, m.restrict_post, m.view_sigs, m.view_avs, m.view_pop, m.view_img, m.auto_track,
                              m.mod_posts, m.language, m.skin, m.new_msg, m.show_popup, m.msg_total, m.time_offset, m.posts, m.joined, m.last_post,
                  m.last_visit, m.last_activity, m.dst_in_use, m.view_prefs, m.org_perm_id, m.temp_ban, g.*
                  FROM ibf_members m
                    LEFT JOIN ibf_groups g ON (g.g_id=m.mgroup)
                    LEFT JOIN ibf_moderators moderator ON (moderator.member_id=m.id OR moderator.group_id=m.mgroup )
                  WHERE m.id=$member_id");
            
            if ( $DB->get_num_rows() )
            {
             $this->member = $DB->fetch_row();
            }

 

Он у Вас наверняка будет другой, т.к. это излюбленное место для добавления новых модов. У Вас, скорей всего, в запросе уже будут новые поля, а возможно и сам запрос будет изменён.

Вам нужно добавить запрос нашего нового параметра в этот запрос.

Поэтому добавьте после последнего параметра в запросе и укажите названия поля из п. 1:

      if ($member_id != 0)

        {

                 

            $DB->query("SELECT moderator.mid as is_mod, moderator.allow_warn, m.id, m.name, m.mgroup, m.password, m.email, m.restrict_post, m.view_sigs, m.view_avs, m.view_pop, m.view_img, m.auto_track,

                              m.mod_posts, m.language, m.skin, m.new_msg, m.show_popup, m.msg_total, m.time_offset, m.posts, m.joined, m.last_post,

                  m.last_visit, m.last_activity, m.dst_in_use, m.view_prefs, m.org_perm_id, m.temp_ban, g.*, название_поля_из_п.1

                  FROM ibf_members m

                    LEFT JOIN ibf_groups g ON (g.g_id=m.mgroup)

                    LEFT JOIN ibf_moderators moderator ON (moderator.member_id=m.id OR moderator.group_id=m.mgroup )

                  WHERE m.id=$member_id");

           

            if ( $DB->get_num_rows() )

            {

             $this->member = $DB->fetch_row();

           }

 

Теперь форум будет читать значение этого параметра и посмотреть его можно будет по $ibforums->member['название']

Добавлено в [mergetime]1096002178[/mergetime]

 

 

3. Теперь добавим функциональность к нашему полю.

Откроем файл Usercp.php.

Найдём там кусочек

   // View avatars, signatures and images..
   
   $view_ava  = "<select name='VIEW_AVS' class='forminput'>";
   $view_sig  = "<select name='VIEW_SIGS' class='forminput'>";
   $view_img  = "<select name='VIEW_IMG' class='forminput'>";
   $view_pop  = "<select name='DO_POPUP' class='forminput'>";
   $html_sess = "<select name='HIDE_SESS' class='forminput'>";
   $html_qr   = "<select name='OPEN_QR' class='forminput'>";

В нём и в области ниже определяется html код для контрола, в котором мы будем выбирать "Да" или "Нет".

 

Сюда нужно добавить наш новый пункт. После этого кусочка добавьте

 

$переменная = "<select name='НАЗВАНИЕ_ПУНКТА' class='forminput'>";

название переменной и названия пункта выберите опять же сами, но опять же что-то родственное с добавляемой фичей и используйте их ниже:

 

Чуть ниже перед

   $this->output .= $this->html->settings_end( array ( 'IMG'  => $view_img."</select>",

Добавьте сам html код контрола:

   $переменная .= $this->member['название_поля_из_п.1'] ? "<option value='1' selected='selected'>".$ibforums->lang['yes']."</option>\n<option value='0'>".$ibforums->lang['no']."</option>"
               : "<option value='1'>".$ibforums->lang['yes']."</option>\n<option value='0' selected='selected'>".$ibforums->lang['no']."</option>";

а чуть ниже перед

               	'PPS'  => $post_select,
               )       );

добавьте описание вашей переменой в массив:

       	'НАЗВАНИЕ_ПУНКТА'  => $переменная,

 

Откроем файл usercp_functions.php. Теперь нам нужно сохранять изменённое значение в БД.

Найдём кусочек:

 	if (! preg_match( "/(^|,)".$ibforums->input['topicpage'].",/", $ibforums->vars['topicpage_contents'] ) )
  {
  	$ibforums->input['topicpage'] = '-1';
  }
  
  //+----------------------------------------
  
  $db_string = $DB->compile_db_update_string(  array (

и добавим опредление нашего поля. Добавим ниже:

     'название_поля_из_п.1'  => $ibforums->input['НАЗВАНИЕ_ПУНКТА'],

 

 

Добавлено в [mergetime]1096002903[/mergetime]

4.

Откроем файл lang_ucp.php

и в конец его перед

?>

Добавим описание нашего поля

$lang['название_переменной_описания'] = "описание";

Тоже самое нужно сделать во всех языковых файлах, если их у вас несколько.

Теперь откроем файл skin_ucp.php

Найдём функцию

function settings_end($data) {

Её же можно найти и в админке (AdminCP->Skin&Templates->HTML Templates->Manage HTML на нужном скине -> Expand to Edit справа от User Control Panel Section -> Edit Single спрва от Board Settings End)

там вы увидите блоки примерно следующего содержания:

 

<tr>
  <td width='70%'>{$ibforums->lang['название_переменной_описания']}</td>
  <td align='left'>{$data[НАЗВАНИЕ_ПУНКТА_из_п.3]}</td>
</tr>

 

в админке будет примено тоже самое:

<tr>
  <td>{ibf.lang.название_переменной_описания}</td>
  <td align='left'>{$data[НАЗВАНИЕ_ПУНКТА_из_п.3]}</td>
</tr>

 

Как мы знаем из HTML <tr> .. </tr> - это горизонтальный ряд таблицы, а <td> .. </td> - это клетки внутри него.

В этом случае первый <td> ... </td> выводит описание нашего пункта (например "Показывать быстрый ответ всегда открытым?"), а второй <td> ... </td> выводит тот самый html код контрола с выбором Да/Нет из п. 3.

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

 

 

Добавлено в [mergetime]1096003559[/mergetime]

5. Пятый этап самый лёгкий, но его нельзя здесь пояснить по той простой причине, что я не знаю какую функцию Вы будете добавлять, и что она должна делать. Поэтому ограничюсь общими суждениями.

 

Как вы знаете из п. 1 после добавления поля в таблицу пользователей и обеспечения чтения этого поля в п. 2, вы можете обращаться к этому полю через

$ibforums->member['название_поля_из_п.1']

В нём будет 1, если в профиле у пользователя стоит "Да" напротив этого поля, и 0, если "Нет".

Поэтому теперь, чтобы форум работал так или иначе в зависимости от этого значения, нужно найти в исходнике форума место где, начинает обрабатываться ваша функция и написать там условие

 if ( $ibforums->member['название_поля_из_п.1'] ) // если единица, т.е. "Да"
  {

     обрабатываем
  }

 

К примеру, вчера я добавлял параметр в профиль "Отображать историю сообщений под 'долгим' ответом" (когда нажимаете "Ответить" под формой ответа, Вы видите 10 последних сообщений, которые при своём большом размере нагоняют немалый трафик). Не всем пользователям эта история нужна, поэтому и была сделана установка в профиль.

Поэтому, я в файле Post.php нашёл функцию, которая выводит эту историю:

 function html_topic_summary($topic_id) {
  global $ibforums, $std, $DB;

и ниже добавил

 	if ( !$ibforums->member['show_history'] ) return; // Если !единица, т.е. Если НЕ ЕДИНИЦА (НЕ ДА) - НЕТ, то выходим из функции - return, не обрабатывая её.

show_history - так я назвал своё поле.

Ссылка на комментарий
Поделиться на других сайтах

Спасибо огромное! :D
Ссылка на комментарий
Поделиться на других сайтах

Пожалуйста :D

Теперь можно в модах писать так:

1) Добавляем поле xxx в БД и в профиль (ссылка на эту тему)

2) ...

Ссылка на комментарий
Поделиться на других сайтах

  • 1 год спустя...
  • 4 месяца спустя...
Хм. Спасибо. А где можно изменить параметры полей, уже "зашитых" в карточку регистрации пользователя по-умолчанию. Есть такая задача - сделать, чтобы ники пользователей вводились только буквами и запретить цифры. Не знаю пока как это сделать. Может поможете?
Ссылка на комментарий
Поделиться на других сайтах

Смотря что за поле.

Легче сделать контроль после сабмита формы.

Ссылка на комментарий
Поделиться на других сайтах

Смотря что за поле.

Легче сделать контроль после сабмита формы.

 

понятно что легче. Но нужно сделать это во время отсылки формы. То есть пользователя сразу предупреждают, что логин и отображаемое имя - "ник" не должны содержать цифровых символов. Если он их вводит, регистрация не производится, пользователю указывается на ошибку и просится повторно заполнить форму уже правильно.

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...
пользователя сразу предупреждают, что логин и отображаемое имя - "ник" не должны содержать цифровых символов. Если он их вводит, регистрация не производится, пользователю указывается на ошибку и просится повторно заполнить форму уже правильно.

Элементарно.

<script type="text/javascript">

verify="key=0;"

verify+="for(i=0;i<value.length;i++){if(!isNaN(value.substring(i,(i+1)))){key+=1}};"

verify+="if(key!=0){alert('ник не должны содержать цифровых символов');value=''};"

</script>

<input type="Text" onblur="java script:eval(verify)">

Здесь просто ругнется и затрет ник.

Можно затереть цифры в нике методом value.split(substring(i,(i+1))).join('') в цикле.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.