Yii Framework Forum: Estrutura Da Aplicação - Difícil! - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Estrutura Da Aplicação - Difícil! Como estruturar os models, views e controllers para essa aplicação Rate Topic: -----

#1 User is offline   Thiago Prado 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 27-August 12

Posted 05 March 2013 - 04:14 PM

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
Usuário 01
Usuário 02
Usuário 03

Empresa 02
Usuário 04
Usuário 05
Usuário 06

Franqueadeo 01
Empresa 03
Usuário 07
Usuário 08
Usuário 09


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
FranqueadoUsuario
EmpresaUsuario
SuperadminUsuario
...

Controllers
FranqueadoUsuarioController
EmpresaUsuarioController
SuperadminUsuarioController
...

Views
franqueadousuario
empresausuario
superadminusuario
...


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
0

#2 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 805
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 05 March 2013 - 08:02 PM

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.
Newerton Vargas de Araújo
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users