Powered by CodeIgniter

Советы и решения

(55)
10
10 голосов
Решаем проблемы вместе и передаем друг другу полезные знания.
Внимание: найдена Проблема Сейчас буду пытаться ее решить. Проблема решена, вот описание.
Приношу свои извинения за косяк.

Добавим в список участников сообщества возможность изменять роль каждого участника
Первым делом добавим пару строчек в файл gears/community/lang/ru.lng (в секцию [community]):
setrole_msg = "Участнику %s присвоена роль '%s'" set_role = "Изменить роль"
Далее, добавим в файл gears/community/index.php новую функцию:
/** * Setting member's role * @param string * @param string * @param string * @return void */ function setrole ($url_name = FALSE, $username = FALSE, $role = FALSE) { if(!$url_name||!$username||!$role) show404(); else { $test= false; $test = ($community = $this->db->get_where('community',array('url_name'=>$url_name))->row()); $test = $test && ($user = $this->db->get_where('users',array('url_name'=>$username))->row()); if ($test) $test = $test && ($cuser = $this->db->get_where('community_users',array('uid'=>$user->id))->row()); if ($test) $test = $test && ($role == 'admin'||$role == 'moder'||$role == 'member'); if ($test){ if($this->community->check($community->id) != 'admin') return _403(); $this->db->update('community_users',array('role'=>$role),array('uid'=>$user->id)); msg(t('setrole_msg',$user->name,t('!community '.$role))); redirect(l('/community/'.$url_name.'/members/')); }else{show404();} } } // ------------------------------------------------------------------------
Теперь редактируем файл gears/community/models/community.php:
в функцию show($url_name,$page = 0, $expage = 0) после строчек
if($member['role'] == 'admin') $info['undel'][] = $member['id']; $member['role_icon'] = '/gears/community/img/icon/'.$member['role'].'.png'; }
добавляем следующий код:
/* Start Setrole section */ if ($this->check($community) == 'admin'){ $header['set_role']= array(fc_t('!community set_role'),'text','5%'); } if ($this->check($community) == 'admin' ){ foreach($members as &$member){ $member['set_role']=''; if ($member['role'] != 'admin') { $member['set_role'] = $member['set_role'].$CI->builder->a('<img border="0">',l('/community/setrole/'.$community->url_name.'/'.$member['name'].'/admin'),'','',t('!community admin')); } if ($member['role'] != 'moder') { $member['set_role'] = $member['set_role'].$CI->builder->a('<img border="0">',l('/community/setrole/'.$community->url_name.'/'.$member['name'].'/moder'),'','',t('!community moder')); } if ($member['role'] != 'member') { $member['set_role'] = $member['set_role'].$CI->builder->a('<img border="0">',l('/community/setrole/'.$community->url_name.'/'.$member['name'].'/member'),'','',t('!community member')); } } } /* End Setrole section */
Один момент: В папке gears/community/img/icon отсутствует иконка помощника (moder.png).
Мне показалось, что иконка gears/favorites/img/icon/remove.png вполне подойдет для роли помощника. Если вы со мной согласны — просто скопируйте ее.
15:11 ← 10 января 2010 Отправить в Твиттер sudersuder  RSS comments 6

Комментарии (6) ↓

dqpb dqpb time 18:14 ← 10 января 2010 #
Suder, т.е теперь наделенный нужными правами может редактировать или удалять нужное ненужное?
Автор
suder suder time 18:30 ← 10 января 2010 #
Да, это так. Но тут появилась проблема (точнее, баг).
Сейчас думаю как решать. (описана вот тут)
Автор
suder suder time 18:43 ← 10 января 2010 #
Блин, по ссылке не совсем то.
http://cogear.ru/community/tips-n-tricks/vybor-roli-uchastnika-soobshhestva-159.html#comment-2372 Есличто
Автор
suder suder time 18:18 ← 10 января 2010 #
Так, внимание, обнаружился косяк. Сча буду исправлять. Я слишком плохо знаю sql.
Если кто может помочь — суть косяка: сообщество выводится в списке столько раз, сколько у него админов.

Как мне кажется проблема вот в чем:
файл gears/community/models/community.php:
function _query(){ $this->db->select('community.*'); $this->db->join('community_users','community.id = community_users.cid AND community_users.role = "admin"','left'); $this->db->select('users.name as aname,users.url_name as aurl_name,users.avatar as uavatar'); $this->db->join('users','users.id = community_users.uid'); $this->db->select('(SELECT COUNT(id) FROM community_users WHERE cid = community.id && approved = true) as users_num',FALSE); $this->db->select('(SELECT COUNT(id) FROM nodes WHERE cid = community.id) as nodes_num',FALSE); return $this->db; }
Автор
suder suder time 22:47 ← 10 января 2010 #

Решение проблемы

1. в файле gears/community/models/community.php в функции _query() комментируем строчки:
function _query(){ $this->db->select('community.*'); //$this->db->join('community_users','community.id = community_users.cid AND community_users.role = "admin"','left'); //$this->db->select('users.name as aname,users.url_name as aurl_name,users.avatar as uavatar'); //$this->db->join('users','users.id = community_users.uid'); $this->db->select('(SELECT COUNT(id) FROM community_users WHERE cid = community.id && approved = true) as users_num',FALSE); $this->db->select('(SELECT COUNT(id) FROM nodes WHERE cid = community.id) as nodes_num',FALSE); return $this->db; }
2. в файле gears/community/index.php в функции index($url_name = FALSE, $action = FALSE, $subaction = FALSE) после строчки
foreach($all as &$community){ добавляем код:
$admins = $this->db->get_where('community_users',array('cid'=>$community['id'],'role'=>'admin'))->result_array(); $community['aname']= ''; foreach($admins as &$admin){ $auser=$this->db->get_where('users',array('id'=>$admin['uid']))->row(); $community['aname'] .= $this->builder->a($auser->name,l('/user/'.$auser->url_name),'user').' '; }
3. там же находим строку
'aname'=>array(fc_t('admin'),'link','10%','before'=>'<span class="user">','after'=>'</span>'), и заменяем ее на
'aname'=>array(fc_t('admin'),'text','10%')
Внимание! У этого решения есть существенный недостаток: число запросов к базе данных при выводе списка сообществ становится OVER 9000 достаточно большим
inetlover inetlover time 19:49 ← 11 января 2010 #
Спасибо, полезная инфа!