dimitry Опубликовано 23 Июля 2007 Жалоба Поделиться Опубликовано 23 Июля 2007 Не помешает для версии 1.3 сделать склейку участников через меню интерфейса админцентра.Если рассмотреть код мода для версии 2.1 под названием Merge members http://mods.invisionize.com/db/index.php/f/6902 то я думаю все-таки можно подогнать этот код под IPB 1.3 Для 2.1Open: ./sources/acp_loaders/acp_pages_content.php Find: 8 => array ( 'Manage Validating' , 'section=content&act=mem&code=mod' ), Add below: 15 => array ( 'Merge Members' , 'section=content&act=mem&code=merge' ), Для 1.3 Open: ./sources/Admin/admin_pages.php Find: 8 => array ( 'Подтверждение рег-ций', 'act=mem&code=mod' ), Add below: 15 => array ( 'Объединение аккаунтов' , 'act=mem&code=merge' ), Для 2.1 Open: ./sources/action_admin/member.php Find: default: $this->ipsclass->admin->cp_permission_check( $this->perm_main.'|'.$this->perm_child.':' ); $this->search_form(); break; Add above: case 'merge': $this->merge_member(); break; case 'domerge': $this->do_merge_member(); break; Для 1.3 Open: ./sources/Admin/ad_member.php Find: default: $this->search_form(); break;Add above: case 'merge': $this->merge_member(); break; case 'domerge': $this->do_merge_member(); break; Там же: Для 2.1 Find: } ?> Add above: /*-------------------------------------------------------------------------*/ // Merge Members /*-------------------------------------------------------------------------*/ function merge_member() { $this->ipsclass->admin->page_title = "Merge Members"; $this->ipsclass->admin->page_detail = "Merge allows you to join two member accounts into one single account. The source account will be combined into the destination account.<br />Announcements, attachments, calendar events, private messages, topics, posts, post count, buddylist and ignorelist will be combined. The combined member will still have the same permissions that the destination member had to begin with. Any access masks or moderator ability that the source member had will not be transferred.<br /><font color='red'><b>Warning: This process can not be reversed.</b></font>"; //----------------------------------------- // Make sure we're a root admin, or else! //----------------------------------------- if( $this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'] ) { $this->ipsclass->admin->error( "Sorry, this function is for the root admin group only" ); } //----------------------------------------- // Start form //----------------------------------------- $this->ipsclass->html .= $this->ipsclass->adskin->start_form( array( 1 => array( 'code' , 'domerge' ), 2 => array( 'act' , 'mem' ), 4 => array( 'section', $this->ipsclass->section_code ) ) ); $this->ipsclass->html .= $this->ipsclass->adskin->start_table( 'Merge Members' ); $this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "<b>Source Username</b>", $this->ipsclass->adskin->form_input( 'sname', $_POST['sname'] ? $_POST['sname'] : '' ) ) ); $this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "<b>Destination Username</b>", $this->ipsclass->adskin->form_input( 'dname', $_POST['dname'] ? $_POST['dname'] : '' ) ) ); $this->ipsclass->html .= $this->ipsclass->adskin->end_form( 'Continue' ); $this->ipsclass->html .= $this->ipsclass->adskin->end_table(); $this->ipsclass->admin->output(); } Для 1.3 эта функция будет выглядеть как-то так: /*-------------------------------------------------------------------------*/ // Merge Members /*-------------------------------------------------------------------------*/ function merge_member() { $ADMIN->page_title = "Merge Members"; $ADMIN->page_detail = "Merge allows you to join two member accounts into one single account. The source account will be combined into the destination account.<br />Announcements, attachments, calendar events, private messages, topics, posts, post count, buddylist and ignorelist will be combined. The combined member will still have the same permissions that the destination member had to begin with. Any access masks or moderator ability that the source member had will not be transferred.<br /><font color='red'><b>Warning: This process can not be reversed.</b></font>"; //----------------------------------------- // Start form //----------------------------------------- $ADMIN->html .= $SKIN->start_form( array( 1 => array( 'code' , 'domerge' ), 2 => array( 'act' , 'mem' ), ) ); $ADMIN->html .= $SKIN->start_table( 'Merge Members' ); $ADMIN->html .= $SKIN->add_td_row( array( "<b>Source Username</b>", $ADMIN->html .= $SKIN->form_input( 'sname', $_POST['sname'] ? $_POST['sname'] : '' ) ) ); $ADMIN->html .= $SKIN->add_td_row( array( "<b>Destination Username</b>", $ADMIN->html .= $SKIN->form_input( 'dname', $_POST['dname'] ? $_POST['dname'] : '' ) ) ); $ADMIN->html .= $SKIN->end_form( 'Continue' ); $ADMIN->html .= $SKIN->end_table(); $ADMIN->output(); } Ниже функции function merge_member() добавить: Для 2.1 function do_merge_member() { //----------------------------------------- // Make sure we're a root admin, or else! //----------------------------------------- if( $this->ipsclass->member['mgroup'] != $this->ipsclass->vars['admin_group'] ) { $this->ipsclass->admin->error( "Sorry, this function is for the root admin group only" ); } //----------------------------------------- // Check the inputs //----------------------------------------- $sname = strtolower(str_replace('|', '|', $this->ipsclass->input['sname'])); $dname = strtolower(str_replace('|', '|', $this->ipsclass->input['dname'])); if( $this->ipsclass->vars['auth_allow_dnames'] ) { $ssql = " OR LOWER(members_display_name)='{$sname}'"; $dsql = " OR LOWER(members_display_name)='{$dname}'"; } # Check for source name if( empty($sname) ) { $this->ipsclass->main_msg = "Invalid source username specified."; $this->merge_member(); } $this->ipsclass->DB->simple_construct( array( 'select' => 'id,name,mgroup,posts,members_display_name', 'from' => 'members', 'where' => "LOWER(name)='{$sname}'".$ssql ) ); $this->ipsclass->DB->simple_exec(); if( ! $r = $this->ipsclass->DB->fetch_row() ) { $this->ipsclass->main_msg = "Invalid source username specified."; $this->merge_member(); } # Check for destination name if( empty($dname) ) { $this->ipsclass->main_msg = "Invalid destination username specified."; $this->merge_member(); } $this->ipsclass->DB->simple_construct( array( 'select' => 'id,name,mgroup,ip_address,posts,members_display_name', 'from' => 'members', 'where' => "LOWER(name)='{$dname}'".$dsql ) ); $this->ipsclass->DB->simple_exec(); if( ! $row = $this->ipsclass->DB->fetch_row() ) { $this->ipsclass->main_msg = "Invalid destination username specified."; $this->merge_member(); } # Check for both if( $r['name'] == $row['name'] ) { $this->ipsclass->main_msg = "The source and destination members can not be identical."; $this->merge_member(); } if( $r['mgroup'] == $this->ipsclass->vars['admin_group'] && $r['mgroup'] != $row['mgroup'] ) { $this->ipsclass->admin->error( "Sorry, you can not join a root admin account into a non-root admin account." ); } if( $this->ipsclass->vars['auth_allow_dnames'] && $dname != $row['members_display_name'] ) { $dname = $row['members_display_name']; } if( $_POST['confirm'] ) { # So, lets do the converteroo $this->ipsclass->DB->do_update( 'announcements', array( 'announce_member_id' => $row['id'] ), 'announce_member_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'attachments', array( 'attach_member_id' => $row['id'] ), 'attach_member_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'cal_events', array( 'event_member_id' => $row['id'] ), 'event_member_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'calendar_events', array( 'userid' => $row['id'] ), 'userid='.$r['id'] ); $this->ipsclass->DB->do_update( 'contacts', array( 'contact_id' => $row['id'], 'contact_name' => $dname ), 'contact_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'contacts', array( 'member_id' => $row['id'] ), 'member_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'forums', array( 'last_poster_id' => $row['id'], 'last_poster_name' => $dname ), 'last_poster_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'message_text', array( 'msg_author_id' => $row['id'], 'msg_ip_address' => $row['ip_address'] ), 'msg_author_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'message_topics', array( 'mt_from_id' => $row['id'] ), 'mt_from_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'message_topics', array( 'mt_to_id' => $row['id'] ), 'mt_to_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'message_topics', array( 'mt_owner_id' => $row['id'] ), 'mt_owner_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'polls', array( 'starter_id' => $row['id'] ), 'starter_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'posts', array( 'author_id' => $row['id'], 'author_name' => $dname, 'ip_address' => $row['ip_address'] ), 'author_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'subscription_trans', array( 'subtrans_member_id' => $row['id'], 'subtrans_old_group' => $row['mgroup'] ), 'subtrans_member_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'topics', array( 'starter_id' => $row['id'], 'starter_name' => $dname ), 'starter_id='.$r['id'] ); $this->ipsclass->DB->do_update( 'topics', array( 'last_poster_id' => $row['id'], 'last_poster_name' => $dname ), 'last_poster_id='.$r['id'] ); # Update new post count $this->ipsclass->DB->do_update( 'members', array( 'posts' => intval($r['posts'] + $row['posts']) ), 'id='.$row['id'] ); # Delete foreach( array('admin_logs','forum_tracker','moderator_logs','moderators','pfields_content','sessions','tracker','validating','voters') as $tbl ) { $this->ipsclass->DB->simple_exec_query( array( 'delete' => $tbl, 'where' => 'member_id='.$r['id'] ) ); } $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'dnames_change' , 'where' => 'dname_member_id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'email_logs' , 'where' => 'from_member_id='.$r['id'].' OR to_member_id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'members' , 'where' => 'id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'member_extra' , 'where' => 'id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'members_converge' , 'where' => 'converge_id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'subscription_logs', 'where' => 'sublog_member_id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topic_markers' , 'where' => 'marker_member_id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topic_ratings' , 'where' => 'rating_member_id='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topics_read' , 'where' => 'read_mid='.$r['id'] ) ); $this->ipsclass->DB->simple_exec_query( array( 'delete' => 'warn_logs' , 'where' => 'wlog_mid='.$r['id'] ) ); if( USE_MODULES == 1 ) { $this->modules->register_class($this); $this->modules->on_delete($ids); } # Recache moderators require_once( ROOT_PATH .'sources/action_admin/moderator.php' ); $admod = new ad_moderator(); $admod->ipsclass =& $this->ipsclass; $admod->rebuild_moderator_cache(); # Recache announcements require_once( ROOT_PATH.'sources/action_public/announcements.php' ); $announcements = new announcements(); $announcements->ipsclass =& $this->ipsclass; $announcements->announce_recache(); # Recache forums $this->ipsclass->update_forum_cache(); # Update stats $stats = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'cache_store', 'where' => "cs_key='stats'" ) ); $stats = unserialize($this->ipsclass->txt_stripslashes($stats['cs_value'])); $this->ipsclass->DB->simple_construct( array( 'select' => 'id,name,members_display_name', 'from' => 'members', 'where' => "mgroup <> '".$this->ipsclass->vars['auth_group']."'", 'order' => "id DESC", 'limit' => array(0,1) ) ); $this->ipsclass->DB->simple_exec(); $i = $this->ipsclass->DB->fetch_row(); $stats['last_mem_name'] = $i['members_display_name'] ? $i['members_display_name'] : $i['name']; $stats['last_mem_id'] = $i['id']; if( count($stats) > 0 ) { $this->ipsclass->cache['stats'] =& $stats; $this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 1 ) ); } $this->ipsclass->admin->save_log( "Merged '{$r['name']}' into '{$row['name']}' and deleted member {$r['name']}" ); $this->ipsclass->admin->done_screen( "Member Account Merged.", "Merge Members", $this->ipsclass->form_code.'&code=merge', 'redirect' ); } else { //----------------------------------------- // Confirm Merge //----------------------------------------- $this->ipsclass->html .= $this->ipsclass->adskin->start_form( array( 1 => array( 'code' , 'domerge' ), 2 => array( 'act' , 'mem' ), 3 => array( 'sname' , $sname ), 4 => array( 'dname' , $dname ), 5 => array( 'section', $this->ipsclass->section_code ) ) ); $this->ipsclass->html .= $this->ipsclass->adskin->start_table( 'Confirm Merge' ); $this->ipsclass->html .= $this->ipsclass->adskin->add_td_basic( "Are you sure you want to merge <b>{$r['name']}</b> (Display name: {$r['members_display_name']})<br />into <b>{$row['name']}</b> (Display name: {$row['members_display_name']})?<br /><br /><b>{$r['name']}</b> will be deleted after the merge." ); $this->ipsclass->html .= $this->ipsclass->adskin->add_td_basic( "<input name='confirm' type='submit' value='Yes' accesskey='s' class='realbutton' /> ".$this->ipsclass->adskin->js_make_button( 'No', $this->ipsclass->base_url.'&'.$this->ipsclass->form_code_js.'&code=merge' ), 'center', 'tablefooter' ); $this->ipsclass->html .= $this->ipsclass->adskin->end_table(); $this->ipsclass->admin->output(); } } Вот, собственно, и весь мод. А вот как правильно записать функцию function do_merge_member() для версии 1.3 ? Здесь надо учесть, что в 1.3 нет встроенных объявлений, поэтому весь announcements надо вырезать.Может кто хорошо владеет PHP посмотрит этот код функции и поможет подправить? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
dimitry Опубликовано 13 Августа 2007 Автор Жалоба Поделиться Опубликовано 13 Августа 2007 Есть у кого-нибудь идеи, как подправить функцию function do_merge_member() Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 6 Мая 2009 Жалоба Поделиться Опубликовано 6 Мая 2009 Сделал слияние 2-х пользователей в одного через модули. Параллельно показывает список забаненых, в перспективе буду делать удобные инструменты разбанивания для админов/модераторов.Показ забаненых и склейка аккаунтов уже сейчас работают корректно. Файл поместить в директорию modules, вызов по index.php?act=module&module=bankamod_banka.php Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
dimitry Опубликовано 13 Февраля 2013 Автор Жалоба Поделиться Опубликовано 13 Февраля 2013 Файл поместить в директорию modules, вызов по index.php?act=module&module=bankaХорошо, а как правлильно внедрить этот вызов в Админцентр? ( 15 => array ( 'Объединение аккаунтов' ) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 15 Февраля 2013 Жалоба Поделиться Опубликовано 15 Февраля 2013 Хорошо, а как правлильно внедрить этот вызов в Админцентр?Научиться читать.вызов по index.php?act=module&module=bankaГде тут слова про админцентр? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.