Нужно сделать систему распеределения прав для плагинов, прагины хранятся как Plugins/{PluginName}/{PluginName}.class.php по сути это даже не класс а системная автономная единица, т.е. плагин запускается при создании класса Теперь мне нужен класс с правами для этого плагина, т.е. если это плагин комментариев, то методы в классе например CanEditComments CanDeletComments и др, возвращают true/false Вообщем это всё вступление, проблем тут нет, проблема в динамической подгрузке этих классов одним autoload тут уже не обойтись... написал пока такой нехороший код PHP: <? class Righter { public static $RightSave; static function plugin($name) { if (!support::check_plugin($name)) trugger_error("Ошибка плагин $name не найден",E_USER_ERROR); if(!self::$RightSave[$name]) { include_once "sis/Plugins/$name/rights.class.php"; $classname="rights".$name; // пцц self::$RightSave[$name]=new $classname; } return self::$RightSave[$name]; } } ?> вообщем не нравицо мне, как мне динамический подгружать классы с правами?
А как в системе определяются действия? У меня, например, так: Есть ссылка admin.php?m=news&a=new Это значит, что модуль - новости, действие - вывод формы для написания новости. Проверка формы и запись в базу определяется действием &a=new_act Так для каждого модуля у меня определён набор действий (экшенов). Они группируются в отдельном файле вида: $экшенс[написать новость] = массив(форма, запись в базу); Есть таблица в бд где для каждого юзверя прописаны экшены из всех модулей и флаг можно/нельзя и есть функция для проверки прав доступа в модуль. Вот как-то так.
а у меня только одна переменная act которая отвечается за текущий модуль, остальное всё разбивается на массив, короче что-то вроде category/cat_name1/ где category текущий модуль тобишь значение переменной act, а название категории получает сам модуль категории примерно так $z=explode("/",$_SERVER['REQUEST_URI']); $catname=array_pop($z); у меня немного нето, у меня нет чёткого разделения на модуль и плагин, так вот модуль это всегда отдельная страничка сайта типа ?act=search а плагин это всего лишь класс, он может быть отдельной еденицей как комментарии и тогда он будет вызываться автоматически модулем если надо(там каждому плагину приписанна зона), а результат работы плагина будет включён в шаблон в виде переменной, но плагин может быть простым вспомогательным классом(запросы в бд там всякие лежат и др) используемым модулем(в таком случае его может и вообще не быть) короче почему нельзя-то, например редактировать комментарии может глобальный администратор, админ комментариев, и пользователь если это его комментарий и ему разрешено его редактировать т.е. получается такое условие if ($_SESSION['user']['rights']['global_admin'] || $_SESSION['user']['rights']['comment_admin'] || $_SESSION['user']['rights']['caneditowncomments'] && $_SESSION['user']['id']==$id_comment){ тогда можно редактировать } как это записать в бд..можно конечно, но придётся евалить Upd Вчитался щас в твоё сообщение, так у тебя что для каждого Юзверя прописанны свои права? а не для ЮзверьГрупп как у меня?? Зы. Хотя по сути я пытаюсь сделать тоже самое только на классах а не в переменной как это у тебя...т.е. у тебя $rights['news']['canAddNews'] у меня должно быть Righter:lugin('news')->canAddNews()
У меня можно и для групп и для юзверей. У меня такая иерархия: 1. Есть юзвери и группы, у них есть статусы - гость, юзверь, админ, рут. 2. Начиная с админа можно ходить в админку, но делать там чего-то нельзя, если юзверю, или одной из групп в которую он входит, не прописано, что можно что-то в админке делать. Во! Иными словами я могу сделать так, что ты сможешь ходить в админку и, например, только писать новости, но не редактировать! p.s. руты могут всё.
У меня в админке такие же права как и в плагинах, у меня вообще админка это те же плагины только в другой папке... а можно в админку или нет за это отвечает параметр canEnterInAdminCenter группы пользователей Зы. Global_Admin может всё =) Зыы. А кстати, мне мой метод уже начинает нравится, хотя мб это потому что спать хочецо...
Делал распределение прав, вышло 4 таблицы(группы, пользователи, список прав, право+юзер_или_группа) + хитрая функция выборки прав с использованием UNION В итоге права можно назначать как группе так и пользователю, при чем назначив право для группы, можно запретить это право для определенного пользователя который находится в этой группе. Тестировал не долго, но мне кажется производительность хромает.
но у меня-то немного другая проблема у меня права хранятся в юзергруппе в виде сериализованного массива а проблема в хранении вот таких условий и чтобы они были достурны в любой части системы...
при загрузки страницы права считываются для текущего пользователя ну и по коду встречаются конструкции примерно такого вида PHP: <?php $perm = new Permissions(); if ($perm->isPermission('MODER_NEWS')==true) { // разрешено } else { die('Недостаточно прав'); } // примерно как выглядит класс class Permissions{ private $permission = array(); function __construct() { $this->permission = 'SELECT * from table'; // тут утрировано } function isPermission($perm) //можно и с массивом прав сделать чтоб писать isPermissions(array('PERM_ONE', 'PERM_TWO')) { return in_array($perm, $this->permission); } } ?>
ну это одно дело, у меня, я же не буду кажный раз писать Код (Text): if ($perm->isPermission('MODER_NEWS') || $perm->isPermission('GLOBAL_ADMIN') || $perm->isPermission('CONTENT_ADMIN') || $perm->isPermission('CanEditOwnPost') && $_SESSION['user']['id']==$postId)
Предлагаю присмотреться к ZF. Как там реализован брокер плагинов. А так же распределение прав - система такая: 1. К контроллеру привязан плагин в котором есть метод ПРЕД-ОБРАБОТКИ. 2. По URI определяется действие и по нему же права. Если доступа нет, то юзер идет на страницу ошибки. Очень удобно. @see MVC
У меня свой фреймвок. Осовная идея побольше процедурника, поменьше классов, пока реализовать не удалось =)) зато удалось реализовать полностью наборную систему, т.е. есть основной фреймвок(небольшой) - всё остальное плагины и модули. вот уж чего чего, но с MVC я врятли когда-нибудь ещё буду работать на php...
модуль? название модуля передаётся по ссылке ?act={Modul.Name} есть пара состояний, когда модуль инклудится автоматом, типа модуля по дефолту плагины разбиты по зонам, зоны могут быть где угодо, но в основном это модули и глобальная зона - зона __global =)
=) дада. модуль. расскажди кому нить еще. модуль... ГЫ! а там switch($mode) {} да? =) слаще include($strModulName); ниче не знаем? =) тебе б теории почитать нормальной, осознать ее. ОППРОБОВАТЬ, тогда 100% уверен, что с твоим потенциалом был бы неплохой толк, а так... отсебятина... причем мелкого пошиюа. но оно и понятно... без обид.
Mr.M.I.T. Ну и зря.... полностью согласен с 440Hz. Почему я в основном всегда ЗА фреймворки (не самописные для себя, а прижившиеся к народу), т.к. эти фреймворки тестит куча людей, и пишут их люди думаю пограмотнее чем Вы накропаете сами.
GreatWasp а зачем вообще тогда писать движки? есть же уже готовые... нет не зря, с чистым MVC мне не удалось добится нормальной, гибкой плагиномодульной системы, хотя может я что-то не так делал, может ты мне объяснишь на словах структура двига, с автономными, автоинтегируемыми, модулями и плагинами, в чистом MVC естественно (что модель(и), где контреллер(ы), вид)...
эээ... че то вы зеленое с высоким сравниваете. Какая связь между ООП, МВЦ, и модульностью ??? Каждое из них отдельное, независимое понятие.
флоппик а кто сравнивает? я просто говорю, что не смог в рамках мвц НОРМАЛЬНО сделать гибкую модульную систему