Перейти к публикации

Членство в нескольких группах


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

Здравствуйте!

Помогите пожалуйста с сабжевой проблемой. Объясню зачем мне такое нужно.

На сайте существует несколько платных разделов, для примера 8. Человек может оплатить доступ к любому количеству из этих разделов. Получается, что при 8 разделах необходимо 8! разных групп, что бы учесть все возможные варианты оплаты (1 - 2, 1 - 3, 1 - 4, 1 - 2 - 3 и т.д.). Создать такое количество групп, конечно, нереально, к тому же разделы будут со временем меняться. Отсюда единственное решение, которое мне приходит в голову - назначение для каждого раздела одной группы доступа, и, соответственно, присвоение пользователю членства в тех группах, доступ к которым он оплатил. Например, такая система есть в vBulletin.

Можно ли на DLE сделать членство пользователя в нескольких группах?

Заранее спасибо!

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

Кстати, хорошая идея) Мне что-то не приходило это в голову, когда подумывал о расширеном разграничении прав доступа.

Только есть тонкость - в некоторых ситуациях придётся выбирать приоритетные группы, где настройки двух групп разойдутся для одного пользователя.

Правда боюсь:

1. В данном разделе разрешено публиковать только готовые модули или хаки, а также полезные советы. Любые запросы на создание того или иного, а также вопросы, касающиеся движка, публикуются в соседнем разделе.
Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Сегодня сел и решил проблему. Я постараюсь привести решение с полным описанием тут. Я думаю, что кому-то мой опыт будет полезен.

Итак, еще раз повторим исходные условия. Мы знаем, что каждый пользователь в ДЛЕ может принадлежать одной группе. Следовательно, если на сайте есть разветвленная структура разделов и мы хотим тонко назначить права доступа, придется создавать множество групп, что во многих случаях попросту невозможно. Например, в моей ситуации надо было разграничить доступ к 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; // В конце концов заместим значение, полученное дле из настроек админки нашим новым массивом в котором сочетаются настройки админки + данные платежки

		}

		// ################ !Конец самописного блока #################

Вот и все! Таким образом, оплатившие пользователи будут автоматически получать доступ в те разделы, что они оплатили без наших ручных действий!

ДИСКЛЕЙМЕР!!! Я не крутой пхп программер, и тем более не знаю является ли мое решение особенно красивым или есть лучше. Но как факт оно работает, а никто за все время мне помочь не смог/не захотел, предложив хоть какой-нибудь вариант. Я же нашел способ, который работает на ура и четко, и постарался донести его до всех так, чтобы понял непрофессионал. Надеюсь, кому-то это будет полезным! Отвечу на все вопросы и постараюст помочь чем смогу!

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

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

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

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

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

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

×
×
  • Создать...