Version 1 (modified by viani, 16 years ago) (diff) |
---|
Camada de Modelo
A camada Model define o que o processo vai fazer e como implementá-lo, ou seja, as regras de negócio do sistema. Ela possibilita o desenvolvimento de recursos, independentemente da forma como os dados serão exibidos (interface) e do momento em que serão executados (fluxo). Essa camada deve saber somente como executar cada recurso do sistema.
A maneira de representar uma classe model é criando um arquivo no formato class.AtividadeModel.inc.php, e armazenando este arquivo no diretório 'code' da estrutura de diretórios do processo, semelhante ao que foi feito anteriormente com a camada de Controle. O arquivo deverá conter:
- Uma classe com nome no formato AtividadeModel, que extenda a classe Model do processo;
- Métodos que implementam cada uma das ações solicitadas pelo usuário e encaminhadas pelo Controller;
- Resultados booleanos indicando sucesso ou falha na requisição feita pelo usuário.
Abaixo um exemplo de camada Model de uma atividade:
<?php /** * Implementa a atividade Compor do processo Atos Administrativos. * @author carloseduardo * @author viani * @author aleheil * @version 1.4 * @license http://www.gnu.org/copyleft/gpl.html GPL * @package Atos_Administrativos. */ class ComporModel extends Model { /** * Implementa acao padrao da atividade Compor. * @license http://www.gnu.org/copyleft/gpl.html GPL. * @access public. * @return boolean. */ function defaultAction() { $ano = date('Y'); $this->addViewVar("categoria" , "10000" ); $this->addViewVar("categlist" , $this->lista_categorias() ); $this->addViewVar("ano" , $ano ); $this->addViewVar("lista_anos" , $this->lista_anos($ano) ); return true; } /** * Implementa acao Salvar - Atribui valor as variaveis da instancia e passa * para a proxima atividade * @return bool * @access public */ function salvarAction() { if (!count($erro = $this->verifica_erros($this->request))) { $this->_usuario = $this->getWfProperty('wf_user_name'); $this->_categoria = trim($this->request['categoria']); $this->_numero = trim($this->request['numero'] ); $this->_area = trim($this->request['area'] ); $this->_assunto = trim($this->request['assunto'] ); $this->_texto = trim($_POST['texto'] ); $this->_ano = $this->request['ano']; $this->updateInstance(); $this->instance->setNextUser($this->getWfProperty('wf_user_id')); $this->setNameInstance($this->_assunto); $this->commitInstance(); return true; } else { $this->addViewVar("msg" , $erro ); $this->addViewVar("icon_msg" , "icon_msg_erro.png" ); $this->addViewVar("class_msg" , "msg_erro" ); $this->addViewVar("categoria" , $this->request['categoria'] ); $this->addViewVar("numero" , $this->request['numero'] ); $this->addViewVar("area" , $this->request['area'] ); $this->addViewVar("assunto" , $this->request['assunto'] ); $this->addViewVar("texto" , $_POST['texto'] ); $this->addViewVar("ano" , $this->request['ano'] ); $this->addViewVar("categlist" , $this->lista_categorias() ); $this->addViewVar("lista_anos" , $this->lista_anos(date('Y'))); return false; } } } ?>
Neste exemplo estão codificados duas ações da atividade: default e salvar. Ambos serão acionados pela camada de controle conforme as ações forem solicitadas. O método defaultAction() é encarregado de preparar os dados a serem exibidos na camada de visualização quando a atividade for executada a primeira vez. Já o método SalvarAction?() implementa o que fazer quando o usuário clicar no botão Salvar do formulário da atividade. Analisando mais a fundo este método, ele começa fazendo uma consistência nos dados vindos do formulário (representado pelo objeto Request). Caso sejam válidos realiza as seguintes operações:
- Armazena os dados do formulário como atributos da camada Model;
- Em seguida executa o método updateInstance() que irá transferir para a instância os atributos da camada Model;
- Seta qual o próximo usuário que irá receber a instância. Isso é feito pelo método setNextUser();
- Executa o método commitInstance(), que fará a atualização da instância definitivamente e encerrará a execução da atividade;
- Retorna indicativo de sucesso da operação
Caso exista inconsistência nos dados do formulário, irá:
- Preparar os dados para serem exibidos novamente ao usuário. Cada chamada ao método addViewVar cria uma variável a ser passada para a camada de visualização;
- Retornar indicativo de insucesso da operação.
Isso conclui a camada Model a nível de atividade.
Agora é necessário definir a camada Model a nível de processo, cuja finalidade é difinir os atributos da instância e também os métodos de modelo que são comuns a todo o processo.
Eis um exemplo de camada de Modelo a nível de processo:
<?php /** * Implementa o modelo do processo Atos Administrativos. * @author carloseduardo * @author viani * @author aleheil * @version 1.4 * @license http://www.gnu.org/copyleft/gpl.html GPL * @package Atos_Administrativos. */ class Model extends BaseModel { /** * @var $filter * @warning NOMES DE ATRIBUTOS DE PROCESSO COMEÇAM COM O CARACTERE _ * @access protected. */ var $filter; /** * @var $_categoria * @access protected */ var $_categoria; /** * @var $_ano * @access protected */ var $_ano; /** * @var $_numero * @access protected */ var $_numero; /** * @var $_area * @access protected */ var $_area; /** * @var $_assunto * @access protected */ var $_assunto; /** * @var $_texto * @access protected */ var $_texto; /** * @var $_email * @access protected */ var $_email; /** * @var $_usuario * @access protected */ var $_usuario; /** * Monta um array com o resultado da busca ao banco de dados - array com todas as categorias * cadastradas na tabela categorias. * @return array Resultado da seleção. * @access public */ function lista_categorias() { $commandText = " SELECT * FROM atos.categoria ORDER BY categoria_id"; $resultSet = $this->DAO->query($commandText); $categorias = array("" => "----- Selecione -----"); while ($res = $resultSet->fetchRow(DB_FETCHMODE_ASSOC)) { $indice = $res['categoria_id']; $categorias[$indice] = $res['descricao']; } return $categorias; } /** * Função que monta um array de sequencia de anos para que o usuario possa escolher o ano do ato * @author aleheil * @return array array com uma sequencia de dois anos antes ao corrente e dois depois do corrente */ function lista_anos($ano_atual) { $lista_anos = array(); $ano = $ano_atual-2; while ($ano <= ($ano_atual+2)) { $lista_anos[$ano] = $ano; $ano = $ano+1; } return $lista_anos; } /** * Valida dados do formulário. * @return array Resultado da validação. * @access public */ function verifica_erros() { $erro = array(); if ($_REQUEST['categoria'] == "" ) $erro[] = "Escolha uma categoria correspondente ao Ato Administrativo."; if (trim($_REQUEST['numero']) == "") $erro[] = "O preenchimento do campo Número é obrigatório."; elseif (!ereg ("^[0-9]{1,3}$", trim($_REQUEST['numero']))) $erro[] = "Número de Ato inválido."; if ( trim($_REQUEST['area']) == "" ) $erro[] = "O preenchimento do campo Área é obrigatório."; if (trim($_REQUEST['assunto']) == "") $erro[] = "O preenchimento do campo Assunto é obrigatório."; if ( trim($_REQUEST['texto']) == "" ) $erro[] = "O preenchimento do campo Texto é obrigatório."; return $erro; } /** * Construtor da camada Model em nivel de processo. * @param array $env Configuracao MVC. * @return Model. * @license http://www.gnu.org/copyleft/gpl.html GPL * @access protected */ function Model(&$env) { $this->super(&$env); $this->filter = & new Filtro(); } } ?>
46 Estrutura: 47 48 * Nível de módulo: 49 * Representado pela classe BaseModel; 50 * Contém um atributo para armazenamento de instância da classe Instance (!BaseModel::instance); 51 * Contém um atributo para armazenamento de instância da classe Activity (!BaseModel::activity); 52 * Contém um atributo para armazenamento de instância da classe Wf_Db (!BaseModel::DAO); 53 * Contém um atributo para armazenamento de comandos SQL (!BaseModel::commandText); 54 * Contém um atributo para armazenamento de resultados de consultas SQL (!BaseModel::resultSet); 55 * Contém um atributo para armazenamento de registros individuais das consultas SQL (!BaseModel::resultRow); 56 * Contém um atributo para armazenamento do array $_REQUEST (!BaseModel::request); 57 * Contém um atributo para armazenamento de informações sobre o ambiente workflow (!BaseModel::workflow); 58 * Contém um atributo para armazenamento de dados a serem lidos pelo Controller e exibidos na View (!BaseModel::viewData); 59 * Contém atributos para armazenamento de instâncias de classes de negócio (como paginação); 60 * Contém métodos para recuperar e alterar variáveis do ambiente workflow; 61 * Contém métodos de sincronização entre as informações contidas na classe Instance e nos atributos; 62 * Contém método construtor da camada Model (pode ser estendido no nível de processo). 63 64 * Nível de processo: 65 * Representado pela classe Model; 66 * Contém as informações, representadas na forma de atributos, comuns a todo o processo; 67 * Propaga as informações pelas atividades através da sincronização de seus atributos com a classe Instance do módulo de workflow;