Evader 0 Опубликовано: 21 июня 2009 Рассказать Опубликовано: 21 июня 2009 Здравствуйте! Помогите пожалуйста с сабжевой проблемой. Объясню зачем мне такое нужно. На сайте существует несколько платных разделов, для примера 8. Человек может оплатить доступ к любому количеству из этих разделов. Получается, что при 8 разделах необходимо 8! разных групп, что бы учесть все возможные варианты оплаты (1 - 2, 1 - 3, 1 - 4, 1 - 2 - 3 и т.д.). Создать такое количество групп, конечно, нереально, к тому же разделы будут со временем меняться. Отсюда единственное решение, которое мне приходит в голову - назначение для каждого раздела одной группы доступа, и, соответственно, присвоение пользователю членства в тех группах, доступ к которым он оплатил. Например, такая система есть в vBulletin. Можно ли на DLE сделать членство пользователя в нескольких группах? Заранее спасибо! Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 21 июня 2009 Рассказать Опубликовано: 21 июня 2009 Кстати, хорошая идея) Мне что-то не приходило это в голову, когда подумывал о расширеном разграничении прав доступа. Только есть тонкость - в некоторых ситуациях придётся выбирать приоритетные группы, где настройки двух групп разойдутся для одного пользователя. Правда боюсь: 1. В данном разделе разрешено публиковать только готовые модули или хаки, а также полезные советы. Любые запросы на создание того или иного, а также вопросы, касающиеся движка, публикуются в соседнем разделе. Цитата Ссылка на сообщение Поделиться на других сайтах
Evader 0 Опубликовано: 21 июня 2009 Рассказать Опубликовано: 21 июня 2009 Автор Извиняюсь за пост в неверном разделе. Цитата Ссылка на сообщение Поделиться на других сайтах
Evader 0 Опубликовано: 23 июня 2009 Рассказать Опубликовано: 23 июня 2009 Автор Никто не может помочь с решением такой проблемы.. ? Цитата Ссылка на сообщение Поделиться на других сайтах
Evader 0 Опубликовано: 19 августа 2009 Рассказать Опубликовано: 19 августа 2009 Автор Сегодня сел и решил проблему. Я постараюсь привести решение с полным описанием тут. Я думаю, что кому-то мой опыт будет полезен. Итак, еще раз повторим исходные условия. Мы знаем, что каждый пользователь в ДЛЕ может принадлежать одной группе. Следовательно, если на сайте есть разветвленная структура разделов и мы хотим тонко назначить права доступа, придется создавать множество групп, что во многих случаях попросту невозможно. Например, в моей ситуации надо было разграничить доступ к 8 платным разделам, что подразумевало бы создание 8! групп. Решением виделось изначально создание мультигрупп как в Вобле, но после изучения структуры БД и файлов движка стало ясно, что членство в 1ой группе проходит красной нитью через все файлы и изменять это себе дороже. Что же я придумал взамен (я опишу именно конкретно свой пример, вы его наверняка сможете модифицировать под свои нужды). Так как доступ необходимо было дать оплатившим, я предположил разделить обычных зарегистрировавшихся пользователей и клиентов (прямо как сделано на dle-news), другие группы нас не интересуют. Сам способ оплаты неважен - в моем случае это банальная оффлайновая платежка, может быть и система платежей электронная, и смс код. Важен сам факт, что после некоторого события человек должен попасть из группы зарегеных в группу оплативших. В моем случае это происходит так: человек отмечает галками доступ к нужным разделам, нажимает генерацию платежки. Она создается, ее можно распечатать. Одновременно с этим в базе в специальной таблице создается запись вида id, user_id, код в котором отражены отмеченные разделы, дата создания, флаг статуса оплаты. Изначально флаг стоит в ноль, т.е. случай когда человек распечатал платежку и забил на нее. Как только мы в бухгалтерии видим оплату, меняем флаг оплаты на единицу. Одновременно с этим человек переводится из группы зарегеных в оплатившие. В админке права доступа для оплативших не отличаются от зарегеных. Моя же идея заключается в том, чтобы давать автоматический доступ в разделы, которые были выбраны во время генерации платежки, если последняя имеет флаг оплаты единицы (и, соответственно человек в группе клиенты). Сделать это, как оказалось, можно редактируя файл /engine/engine.php. В нем нам необходимо работать с массивом $allow_list, который формируется в самом начале файла (у меня это строка 135): $allow_list = explode ( ',', $user_group[$member_id['user_group']]['allow_cats'] ); В результате применения этой функции получается одномерный массив вида [0] => ид 1ой категория разрешенной в админке, [1] => ид 2ой категории и т.д., либо же если доступ дан на все разделы, идет [0] = > all. Для того, чтобы не создавать дополнительных групп, я предлагаю модифицировать этот самый $allow_list на лету, подставляя к нему в конце цифры категорий, которые соответствуют оплаченным разделам. В моем случае просто они не совпадали, при оплате я формировал номер вида 00000000 на 8 категорий, и типа 10000000 если оплачена только 1ая, и 12345678 - если все. При этом 1 в этом номере соответствовала ид 14 на сайте, 7 - 21 и т.д., не суть важно. Получается, что после такой модификации для пользователя список доступных категорий будет выглядеть как стандартный заданный в админке + оплатившие. Как я это реализовал (этот код идет сразу после указанной выше строчки): // ################ Вывод разделов только оплатившим пользователям ################# $id = $_COOKIE['dle_user_id']; // Получаем ид юзера из куки, и не производим вообще никаких действий если он не залогинен $query = "SELECT `user_group` FROM `dle_users` WHERE `user_id` = '$id'"; // Так как мы работаем напрямую в файлах движка, можно использовать mysqli запросы без дополнительного указания параметров коннекта к базе и тд $result = $db->query($query); $row = $result->fetch_array(MYSQLI_NUM); // Получаем номер группы из базы, к которой приписан юзер if ($id != "" && $row[0] == 6) // Все действия делаем если юзер залогинене и принадлежит группе оплативших (6 в моем случае) { $query = "SELECT `payment`, `ok` FROM `dle_payments` WHERE `user` = '$id'"; // Получаем как раз таки флаг платежа и код $result = $db->query($query); $i = 0; while($row = $result->fetch_array(MYSQLI_ASSOC)) // Обрабатываем полученные данные, перенося их в 2 массива - кодов и статусов (платежек может быть несколько) { $payments[$i] = $row['payment']; $state[$i] = $row['ok']; $i++; } for ($i = 0; $i < count($payments); $i++) { if ($payments[$i] != "" && $state[$i] == 1) // Проверяем чтобы запись была получена верна и платежка была не просто создана, но и оплачена (это лишнее с учетом проверки группы в общем-то, но я не претендую на абсолютную истину) { if (substr_count($payments[$i],"1") > 0) $additional_groups[0] = 14; // А тут мы создаем массив оплачиваемых категорий из кода. Например, если встретилась платежка вида 00305670, мы получим массив 3 - 16, 5 - 18, 6 - 22, 7 - 23 if (substr_count($payments[$i],"2") > 0) $additional_groups[1] = 15; if (substr_count($payments[$i],"3") > 0) $additional_groups[2] = 16; if (substr_count($payments[$i],"4") > 0) $additional_groups[3] = 17; if (substr_count($payments[$i],"5") > 0) $additional_groups[4] = 18; if (substr_count($payments[$i],"6") > 0) $additional_groups[5] = 22; if (substr_count($payments[$i],"7") > 0) $additional_groups[6] = 23; if (substr_count($payments[$i],"8") > 0) $additional_groups[7] = 21; } } $number_standart = count($allow_list); // Определим длину стандартного списка разрешенных разделов в админке $number_additional = count($additional_groups); // И нашего дополнительного, зависящего от платежки $allow_list_paid_length = $number_standart + $number_additional; // И их сумму $k = 0; for ($i = 0; $i < 8; $i++) {if ($additional_groups[$i] != "") {$additional[$k] = $additional_groups[$i]; $k++;}} // Создадим новый массив, отсортировав $additional_groups чтобы вид был 1 - 16, 2 -18, 3 - 22, 4 - 23 $k = 0; for ($i = 0; $i < $number_standart; $i++) {$allow_list_paid[$i] = $allow_list[$i];} // Заполним массив который мы стремимся создать вместо стандартного $allow_list сначала элементами из $allow_list for ($i = $number_standart; $i < $allow_list_paid_length; $i++) {$allow_list_paid[$i] = $additional[$k]; $k++;} // А затем дополним его нашими добавочными номерами категорий, которые соответствуют данным платежки $allow_list = $allow_list_paid; // В конце концов заместим значение, полученное дле из настроек админки нашим новым массивом в котором сочетаются настройки админки + данные платежки } // ################ !Конец самописного блока ################# Вот и все! Таким образом, оплатившие пользователи будут автоматически получать доступ в те разделы, что они оплатили без наших ручных действий! ДИСКЛЕЙМЕР!!! Я не крутой пхп программер, и тем более не знаю является ли мое решение особенно красивым или есть лучше. Но как факт оно работает, а никто за все время мне помочь не смог/не захотел, предложив хоть какой-нибудь вариант. Я же нашел способ, который работает на ура и четко, и постарался донести его до всех так, чтобы понял непрофессионал. Надеюсь, кому-то это будет полезным! Отвечу на все вопросы и постараюст помочь чем смогу! Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.