Estrutura Da Aplicação - Difícil!

Oi pessoal,

Preciso de ajuda para estruturar minha aplicação. A principal dúvida é como estruturar o Yii para trabalhar com os usuários.

Tenho uma tabela em nested set que atende perfeitamente o meu modelo

Empresa 01

[indent]Usuário 01

Usuário 02

Usuário 03[/indent]

Empresa 02

[indent]Usuário 04

Usuário 05

Usuário 06[/indent]

Franqueadeo 01

[indent]Empresa 03

[indent]Usuário 07

Usuário 08

Usuário 09[/indent][/indent]




CREATE TABLE `usuario` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `nome` varchar(200) NOT NULL DEFAULT '',

  `login` varchar(20) NOT NULL DEFAULT '',

  `senha` varchar(20) NOT NULL DEFAULT '',

  `email` varchar(50) NOT NULL DEFAULT '',

  `inclusao` datetime NOT NULL,

  `modificacao` datetime NOT NULL,

  `ativo` tinyint(1) NOT NULL,

  `grupoId` int(11) NOT NULL,

  `lft` int(11) NOT NULL,

  `rgt` int(11) NOT NULL,

  `level` int(11) NOT NULL,

  `root` int(11) NOT NULL,

  `rememberMe` tinyint(1) DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `login` (`login`),

  UNIQUE KEY `email` (`email`),

  KEY `u_grupo_id` (`grupo_id`),

  CONSTRAINT `u_grupo_id` FOREIGN KEY (`grupo_id`) REFERENCES `UsuarioGrupo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB AUTO_INCREMENT=6699 DEFAULT CHARSET=utf8;



Dessa maneira eu consigo criar uma árvore de usuários onde todos tem login / senha e estão organizados em grupos. Cada um desses usuários possui um grupoId que identifica qual tipo ele é (ex: empresa, franqueado, vendedor, básico, super administrador, etc) e cada tipo está associado a uma ROLE (usei o auth) que cria regras de acesso ao sistema.

A idéia é que quando um usuário Empresa se logar, ele verá somente os itens de menu correspondentes as permissões dele, assim como terá acesso as actions que tem direito.

Só que todos dos usuários, com exceção do Básico, terão direito a criar outros usuários que ficarão agrupados sob seu próprio id.

Supondo que um usuário tipo Franqueado esteja logado, ele verá somente os botões que tem direito e um deles será incluir usuários. Esses usuários poderão ser Empresas, que por sua vez poderão ter outros usuários Básicos associados. No caso das Empresas, o botão incluir usuários também estará visível, só que ela só poderá criar usuários Básicos.

Agora é que vem a minha dúvida…

Todas essas interações serão feitas numa mesma tabela, usuários, que já possui um Model que lista todo o conteúdo (o caso do SuperAdministrador). Não estou conseguindo entender como vou fazer com os Franqueados que só poderão visualizar, criar, editar e deletar usuários Child, ou com os usuários Empresa que seguirão a mesma lógica.

Não sei se crio um model / view / controller para cada um dos tipos de usuários, e toda vez que inventar um novo tipo, monto o mesmo esquema.

Nesse caso ficaria essa loucura

Models

[indent]FranqueadoUsuario

EmpresaUsuario

SuperadminUsuario

…[/indent]

Controllers

[indent]FranqueadoUsuarioController

EmpresaUsuarioController

SuperadminUsuarioController

…[/indent]

Views

[indent]franqueadousuario

empresausuario

superadminusuario

…[/indent]

Agora imaginem essa lógica estendida para minhas outras tabelas (estatísticas, filmes, categorias, etc). Se para cada um dos meus models eu tiver que fazer uma versão para cada um dos tipos de usuários esse aplicativo ficará gigantesco!!

Uma outra possibilidade seria criar views para cada um dos tipos de usuários o que já reduziria significativamente o volume. Ou até o bom e velho if(usuario_tipo==‘Franqueado’) {–COD DO FRANQUEADO–} elseif (…) {…} nas views do model Usuario.

O ponto é, quando se tem diferentes tipos de interação, que visualizam dados filtrados e podem fazer determinadas coisas, com forms diferentes, como estruturamos isso no Yii?

Obrigado

Thiago,

Inicialmente e complica este tipo de estrutura. Mais nada impossível!

Se você for usar os componentes nativo do Yii, como o CGridView, é possivel fazer isso de uma maneira rapida.

Quando você gera o Model, ele inclui uma função que se chama search(), que é usado no Controller de cada Model.

  1. Para a listagem, você pode fazer uma validação dentro dessa função (search()), que se o usuário logando não for SuperAdministrador, ele vai listar somente os Usuários que ID pai igual ao ID do usuário Logado.

Exemplo:




public function search() {

	$criteria=new CDbCriteria;

        $usuario = Usuario::model()->findByPk(Yii::app()->user->getId());

	$criteria->compare('id_parent',$usuario->idUsuarioGrupo->titulo == 'SuperAdministrador' ? $this->id_parent : Yii::app()->user->getId(),true);


	return new CActiveDataProvider(get_class($this), array(

					'criteria' => $criteria,

			));

}



Na listagem só irá mostrar os Usuários com o id_parent o usuário logado.

Esse idUsuarioGrupo é o nome do relacionamento que o Yii gera automático.

Para adicionar você pode usar uma função que se chama beforeValidate() que é usado no Model, para se fazer algumas regras de negócios, nela você já pode setar o id_parent = ID usuário logado.

Se ficar muita informação, você pode começar pela listagem, depois avançamos para Adicionar ou Editar.