ЦИТАТА(Immeasurability @ Feb 16 2010, 03:02 )
АС и права доступа к контенту ну незаточен не как также как и слайд, дороже выйдет переделывать все! не плана денег а нерв и здоровья (IMG:
http://antislaed.net/style_emoticons/default/sad.gif)
А вот я вас всех удивлю! (IMG:
http://antislaed.net/style_emoticons/default/95.gif) Оказывается заточен! (IMG:
http://antislaed.net/style_emoticons/default/85.gif)
Сначала хотел свою функцию стряпать, начал ковырять, взял модуль пейдж и стал смотреть, что и как.
В начале главной функции есть такая строка
КОД
$cwhere = catmids($conf['name'], "s.catid");
- начал ковырять, что за зверь эта функция catmids() – оказалась,
та самая отвечающая за доступ,
Вот она целиком:
КОД
function catmids() {
global $prefix, $db, $conf, $currentlang;
$arg = func_get_args();
$where = ($conf['multilingual']) ? "WHERE modul='".$arg[0]."' AND (language='$currentlang' OR language='')" : "WHERE modul='".$arg[0]."'";
$result = $db->sql_query("SELECT id, auth_read FROM ".$prefix."_categories ".$where." ORDER BY id");
while (list($cid, $auth_read) = $db->sql_fetchrow($result)) if (is_acess($auth_read)) $catid[] = $cid;
$where = ($catid) ? "AND ".$arg[1]." IN (".implode(", ", $catid).")" : "";
return $where;
}
Сначала она собирает список ID категорий принадлежащих данному модулю и список какой группе разрешен просмотр данной категории, полученный результат прокручивается и передается в функцию is_acess() которая непосредственно проверяет входит ли данный юзвер в перечисленные группы, если да то собирается список категорий который и передается в первоначальную переменную $cwhere, которая в свою очередь подставляется в основной запрос для вывода контента и категорий.
для примера в результате $cwhere ="AND s.catid IN (8, 9, 10)"
Вот функция is_acess() целиком:
КОД
function is_acess($ids) {
global $prefix, $db, $user, $conf;
if ($ids) {
$id = explode("|", $ids);
if (is_moder($conf['name'])) {
$isa = true;
} elseif (is_user() && $id[1]) {
$uid = intval($user[0]);
$mid = explode(",", $id[1]);
foreach ($mid as $val) if ($val) $dmid[] = "g.id=".$val;
$dmid = implode(" OR ", $dmid);
list($uid) = $db->sql_fetchrow($db->sql_query("SELECT Count(u.user_id) FROM ".$prefix."_users AS u LEFT JOIN ".$prefix."_groups AS g ON ((g.extra=1 AND u.user_group=g.id) OR (g.extra!=1 AND u.user_points>=g.points)) WHERE u.user_id='$uid' AND (".$dmid.")"));
$isa = ($uid) ? true : false;
} elseif (is_user() && !$id[1]) {
$isa = (1 >= $id[0]) ? true : false;
} else {
$isa = (0 >= $id[0] && !$id[1]) ? true : false;
}
} else {
$isa = false;
}
return $isa;
}
В результате я выявил следующее, если юзверов раскидать по различным группам, и различным категориям назначить различные группы – Все работает замечательно, Каждый видит только свое.
НО!!! Если в рамках категорий одного модуля, какую неть группу исключить из просмотра всех категорий, то есть ее юзверы по идеи НЕ должны видеть не одной категории – На самом деле такие юзверы будут видеть контент всех разделов. то есть если некая группа не имеет доступа ни к одной категории то в $cwhere="" (пусто) что и приводит к просмотру всего контента, КАК ЭТО ИСПРАВИТЬ???