PHP Framework (II)

Илья2

Guest
PHP Framework (II)

Стан в "PHP Framework I" поднял вопрос о шаблонах веб программирования (каркасах), вот я хочу дать на растерзание один работающий вариант

(особо за английский сильно не ругайте - не ученые мы)

elementalSiteMaker

так около 50 классов, разбитых по 20 папкам.

значит вот так выгляди страница логина:
PHP:
$pageManagerLogin = new PageManagerLogin();
$pageManagerLogin->manage();
и все, все остальное делает класс Manager - он всем заведует, потом есть Controller - он отвечает за дествия над контентом, есть View - он отвечает за отображение, URLKeeper - он отвечает за хранение ссылок, делает редирект.

\include\Page\Core - тут находятся абстрактные, от них наследуются, далее идет \include\Page\Auth
- для проверки аутентификации и отображения текущего пользователя.

Значит схема работы каркаса такая:
менеджеру говорят - "давай работай", он спрашивает контроллера "есть ли действия над контентом в запросе?" если есть, то говорит контроллеру "сделай действие", и делает редирект на себя.
если нет действий, то говорит вьюверу "отобрази страницу".

ну вот и все :)

выглядит это примерно так:
PHP:
  function manage(){
    if( $this->pageController->isActionInRequest() ){
      $this->pageController->makeAction();
      $this->urlKeeper->redirect();
    }
    else{
      $this->pageViewer->showPage();
    }
  }
уже контроллер и вьювер работают с "контентной" частью, в PageSiteEdit это особенно видно, они работают с классом PageContent.php который предоставляет интерфейс для модификации контента (для контроллера) и интерфейс для просмотра контена (для вьювера)

пока все, остальное смотрите в исходниках :)
 

PhpDeveloper

Guest
Не скачиваются твои исходкики!
This page cant be displayed...
 

PhpDeveloper

Guest
Ты б, Илюх, комментариев в код побоьлше добавил, а то разобраться сложно API=?.

Не совсем согласен со "схемой работы сайта"
 

Илья2

Guest
ну как сказано в "Рефакторинге" если есть комментарий то надо сделать так что-бы комментария не было, т.е. из контекста из названий и т.д. было бы понятно :)

какое место не понятно, спрашивай.
 

PhpDeveloper

Guest
Вот такие должны быть комментарии :)"

/*
Компонент: user
Версия: 1.0
Использует библиотеки: wse.lib.php
Использует компоненты: wse.com.php, db.com.php
Использует дамп: wse.com.sql
Дата: январь 2002
Автор: Илья Бурашов

Описание:
Компонент служит для авторизации пользователей в системе.

Каждый пользователь, который в данный момент работает с сайтом, имеет свой уникальный идентификатор, который можно получить таким образом: $wse->getuserid(); Если этому идентификатору соответствует какое-либо имя пользователя в таблице user_logged то пользователь считается "залогиненным", в противном случае пользователь считается не "залогиненным". Пользователи могут быть объединены в группы, а также могут существовать пользователи, не принадлежащие какой-либо группе. Таким образом могут быть установлены права как для отдельных пользователей, так и для групп пользователей. Используя методы компонента whoami, и getmygroup, можно определить имя и группу для пользователя с идентификатором $wse->getuserid().

Методы компонента:

I. Основные
login ( $user, $passwd, $timeout=3600 )
Авторизует пользователя в системе (ставит в соответствие пользователю с идентификатором $wse->getuserid() имя, например ilia, vova...).
$user - имя пользователя
$passwd - пароль
$timeout - время в секундах, по умолчанию час, через которое будет автомотически произведен logout, при отсутствии запросов к компоненту.

logout ()
"Выкидывает" пользователя из системы

whoami ()
Возвращает имя пользователя (ilia, vova..), если пользователь не "залогинен" возвращает пустую строку

getmygroup ()
Возвращает группу пользоватля (admins, content-managers), если пользователь не "залогинен" возвращает пустую строку

setpass ( $user, $new_passwd, $old_passwd )
Устанавливает новый пароль для пользователя
$user - имя пользователя
$new_passwd - новый пароль
$old_passwd - старый пароль

II. Работа с пользователями
useradd ( $user, $passwd, $group="" )
Добавляет пользователя
$user - имя нового пользователя
$passwd - пароль для нового пользователя
$group - группа, в которою мы добавляем нового пользователя, по умолчанию пустая строка, т.е. пользователь не принадлежит к какой-либо группе

userdel ($user)
Удаляет пользователя
$user - имя удаляемого пользователя

user_exists ( $user )
Проверяет существует ли пользователь в системе
$user - имя пользователя, существование которого нужно проверить

getallusers ()
Возвращает массив всех пользователей

getusergroup ( $user )
Возвращает группу в которой состоит пользователь с именем $user

III. Работа с группами
groupadd ( $group )
Добавляет новую группу
$group - название группы

groupdel ( $group )
Удаляет группу
$group - название группы

group_exist ( $group )
Проверяет существование группы
$group - название группы

getallgroups ()
Возвращает массив всех групп

getusersingroup ( $group )
Возвращает массив всех пользователей, содержащихся в группе $group


Внутренние методы:
groupid_from_groupname Ф-я возвращает id группы по ее имени
groupname_from_groupid Ф-я возвращает имя группы по ее id
update_logged
*/
 

Crazy

Developer
Страшно даже подумать, какие комментарии пишут люди, незнакомые с дао Literate Programming... :)
 

Илья2

Guest
Ну мой компонент аутентификации пока намного проще:

Компонент AuthSystem - система аутентификации,
использует класс User.

методы:

getUID( $login, $pwd ) - получение идентификатора пользователя по логину и паролю, в случае ошибки - возвращает -1

getUserByUID( $uid ) - получение объекта класса User, по идентификатору пользователя.

Класс User:
getUID() - получение идентификатора пользователя
getName() - получение имени пользователя.



система такая, есть объект класса Login который отвечает за прецедент "Логин пользователя", включает сценарии "Логин в систему", "Выход из системы".
(этот объект создается менеджером страницы PageManagerLogin.php)

методы:

makeLogin( $loginInfo ) - попытка залогинить пользователя заполнившего loginInformation.
возвращает true в случае успешного логина, в этом случае создает объект класса SessionSystem в который регистрируется $uid, а полученный $sid (ид сессии) позже получается контроллером, для передачи в параметры на следующую страницу.

чтобы было понятнее отрывок класса PageControllerLogin.php:

PHP:
  function makeAction(){
    switch( $this->action ){
      case 'login':
        $loginInfo = $this->pageManager->login->getLoginInfoFromRequest( $this->pageManager->request );
        if ( $this->pageManager->login->makeLogin( $loginInfo ) ){
          $sid = $this->pageManager->login->getSID();
          $this->pageManager->urlKeeper->setPageName( 'pageList.php' );
          $this->pageManager->urlKeeper->addParam( 'sid', $sid );
        }
        else{
          $this->pageManager->urlKeeper->addParam( 'msg',  'errorLogin' );
        }
        break;
      case 'logout':
        $this->pageManager->login->setSID( $this->pageManager->request->getParam( 'sid' ) );
        $this->pageManager->login->makeLogout();
        break;
      default:
        // wrong action
    }
  }
makeLogout() - вылогон пользователя

getSID() - получение идентификатора сессии

getForm() - получение формы для логина (отображает поле для ввода логина и поле для ввода пароля), использоуется во вьювере

вот отрывок из PageViewerLogin.php:
PHP:
  function makeFormLogin(){
    $this->out( '<center>' );
    $this->out( $this->getMessage() );
    $this->out( '<form method="post" action='.$this->pageManager->urlKeeper->getPageName().'>' );
    $this->out( $this->pageManager->login->getForm() );
    $this->out( '<br>' );
    $this->out( $this->pageManager->urlKeeper->getHiddenForForm() );
    $this->out( '<input type="hidden" name="action" value="login">' );
    $this->out( '<input type="submit" value="'.$this->translator->getText( 'enter' ).'">' );
    $this->out( '</form>' );
    $this->out( '</center>' );
  }
getLoginInfoFromRequest( $request ) - получение информации по логину из запроса (из HTTP_POST - переменных), то что пользователь заполнил на форме.

setSID( $sid ) - установка ид. сессии.


Илья
 

PhpDeveloper

Guest
По моему мнению классный движок сайта должен обладать следующими характеристиками:

- Простотой в использовании. Т.е. для того чтобы научится пользоваться движком не надо читать многочисленные толмуты документации, ломать голову (как например в MFC).

- Движок должен обладать очень хорошо продуманной логикой (пример продуманности - труды W3C), чтобы не ломать голову выискивая в нем неожиданно возникшие ошибки

- Движок должен иметь механизмы, позволяющие легко импортировать код, написанный сторонними разработчиками

- С помощью стандартных компонентов и библиотек движка + немного своего кода + уникальный дизайн мы можем построить практически ЛЮБОЙ сайт

- Движок должен понимать, что на сайте существует не только он, т. е. я, например, могу поставить на сайт вот этот php форум, и при этом движок будет нормально функционировать.

Если вы знаете пример подобного движка, скинте, пожалуйста ссылку. Сам я искал (плохо наверное) и не нашел, поэтому написал свой.
 

STAH

Guest
xexe PhpDeveloper, сначало свой скинь, а потом подумаем...
 

Илья2

Guest
нет у меня не такой крутой "движок" :), я честно говоря специально его и не делал (доработал, точнее модифицировал и урезал один проект), он позиционируется на простые сайты, статические, (я для этого и сделал генерацию для оффлайна). Это в принципе очень не доделанный продукт (если смотреть с точки зрения "портала"), но с другой стороны каждая доработка нужна для кого-то, и их может быть 1000, что не реально сделать, текущее его состояние -- это многое в зачаточном состоянии, и если необходимо, то заинтересованный разработчик может доработать ту часть какая ему нужна.
А в общем то это пример работающей объектно-ориентированной системы :). в которой применены некоторые мои достижения :) но каждому конечно удобнее работать со своей системой, если он ее сделал.

а если кто ищет навороченную, то вот по слухам http://developer.ez.no/ крутая, но проблема в том что на изучение надо тратить время, а иногда быстрее сделать самому :))
 

Илья2

Guest
я думаю, что если перевести этот сайт по eZ на русский, и заключить лиц. соглашение на сопровождение и продажу коммерческих версий на территории России, то я думаю вполне было бы коммерческим предприятием. Просто многие не знаю что уже есть такие системы. А кто-то портирует на русский и продает как свои.

да тот же PHP-Nuke я тоже не встречал документации по русски. вот еще одна объектно-ориентированная есть http://www.xoops.org/
еще есть http://cool.sourceforge.net/
пример: http://cool.sourceforge.net/0.2/
в общем в действительности все давно уже написано, просто надо найти время и все это переварить :)
 

STAH

Guest
2PhpDeveloper.
ok, а пока можешь сравнить свое чудо вот с этим: http://www.binarycloud.com
 

STAH

Guest
В смысле? Посмотри в мейлинг лист, CVS на tigris.org ... там и код, и документация.
 

PhpDeveloper

Guest
Ничего не понял: binarycloud=?
Смотрел postnuke, phpnuke - не удовлетворяют вышесказанным требованиям
 
Сверху