13 | | Começando pelo nível de atividade, deve-se fazer o seguinte para implementá-lo: |
| 13 | Começando pelo nível de módulo, ele é representado pela classe !BaseController, que possui atributos e métodos de uso geral, disponíveis para todas as atividades. A classe não precisa ser codificada porque já está inclusa no pacote de código do módulo workflow. Basta extendê-la. |
| 14 | |
| 15 | Atributos da classe !BaseController: |
| 16 | |
| 17 | * templateFile: armazena o nome do template em uso pela camada View; |
| 18 | * view: objeto da classe Smarty que representa a camada View; |
| 19 | * model: objeto da classe Model da atividade. |
| 20 | |
| 21 | Métodos da classe !BaseController: |
| 22 | |
| 23 | * showForm: troca o template em uso; |
| 24 | * syncVars: transfere todos os atributos da camada Model para a Camada View; |
| 25 | * loadViewVars: recupera os dados produzidos pela camada Model e os transfere para a camada View; |
| 26 | * assign: define o valor de uma variável da camada View; |
| 27 | * cancelar: aborta a execução da atividade corrente; |
| 28 | * dispatch: executa a ação solicitada pelo usuário; |
| 29 | * !__default: método abstrato a ser redefinido nas classes filhas; |
| 30 | * run: método abstrato a ser redefinido nas classes filhas. |
| 31 | |
| 32 | Partindo para o nível de processo, ele é representado pela classe Controller, que deve ser implementada pelo desenvolvedor do processo, seguindo estas diretrizes: |
| 33 | |
| 34 | * Criar um arquivo com o nome class.Controller.inc.php; |
| 35 | * Armazenar o arquivo no diretório 'code' da estrutura de diretórios do processo; |
| 36 | * Se preferir editar o arquivo pela interface web, ele fica na aba 'includes' da [wiki:WF/Edicaodecodigo interface de codificação]; |
| 37 | * Definir uma classe com o nome Controller, e que extenda a classe !BaseController; |
| 38 | * Definir um ou mais atributos para os templates da atividade; |
| 39 | * Implementar o método !__default(); |
| 40 | * Implementar o método run(); |
| 41 | |
| 42 | Eis um exemplo de classe Controller de um processo: |
| 43 | |
| 44 | {{{ |
| 45 | <?php |
| 46 | /** |
| 47 | * Camada Controller a nível de Processo |
| 48 | * @author Fulano |
| 49 | * @version 1.x |
| 50 | * @license http://www.gnu.org/copyleft/gpl.html GPL |
| 51 | * @package Nome_do_processo |
| 52 | */ |
| 53 | class Controller extends BaseController |
| 54 | { |
| 55 | /** |
| 56 | * @var string Template padrão da atividade |
| 57 | * @access public |
| 58 | */ |
| 59 | var $TEMPLATEPADRAO = 'template.tpl'; |
| 60 | |
| 61 | /** |
| 62 | * Construtor da classe |
| 63 | * @param object $model Instância da camada Model |
| 64 | * @param array Configurações do ambiente MVC |
| 65 | * @return object |
| 66 | * @access public |
| 67 | */ |
| 68 | function Controller(&$model , &$env) |
| 69 | { |
| 70 | $this->super(&$model , &$env); |
| 71 | } |
| 72 | |
| 73 | /** |
| 74 | * Execucao da atividade. |
| 75 | * @param $action Servico (acao) solicitado |
| 76 | * @return void |
| 77 | * @access public |
| 78 | */ |
| 79 | function run($action) |
| 80 | { |
| 81 | $this->model->DAO->connect(); |
| 82 | $this->dispatch($action); |
| 83 | $this->model->DAO->disconnect(); |
| 84 | } |
| 85 | |
| 86 | } |
| 87 | ?> |
| 88 | }}} |
| 89 | |
| 90 | O acionamento da camada de Controle se dará pela execução do método run(), que por sua vez fará uso do método dispatch(), que analisará a ação requisitada e executará o método de ação adequado. Assim, se for requisitada uma ação 'salvar', será executado o método Salvar(), que deverá estar declarado a nível de atividade. Caso nenhuma ação seja recebida, será executado o método !__default(). |
| 91 | |
| 92 | Neste exemplo, ainda, o método run() estabelece uma conexão com o banco de dados do processo, feita através do comando $this->model->DAO->connect(), mas isto é opcional. |
| 93 | |
| 94 | Continuando, agora é a hora de implementar a classe de Controle a nível de atividade. Para isso fazer o seguinte: |
70 | | Note que para cada ação que for necessária na atividade, deverá existir um método correspondente na camada Controller. |
71 | | |
72 | | Analisando o método salvar(), vemos que o mesmo faz uso da camada Model para executar a operação de salvamento (negócio) e caso obtenha sucesso irá carregar os dados na camada View e a seguir definir qual o template será usado para mostrar os dados. |
73 | | |
74 | | Tudo que foi falado até aqui sobre a camada Controller está contido no escopo da atividade, mas note que na definição da classe Controller, existe uma herança de outra classe, representado pela cláusula 'extends Controller'. Isso significa que existe uma classe superior (pai) da qual a classe em questão é filha. Na classe pai existem métodos que são comuns a todos as classes Controller das atividades do processo em questão. Esta maneira de programar por objetos, com herança, é fundamental para evitar a repetição de código. |
75 | | |
76 | | Continuando com o exemplo, teremos uma classe Controller, a nível de processo, cujo código está exemplificado a seguir. Esta classe também fica armazena no diretório 'code', e nome do arquivo deve seguir o formato class.Controller.inc.php |
77 | | |
78 | | {{{ |
79 | | <?php |
80 | | /** |
81 | | * Gerencia o processo Atos Administrativos |
82 | | * @author carloseduardo |
83 | | * @author viani |
84 | | * @author aleheil |
85 | | * @version 1.4 |
86 | | * @license http://www.gnu.org/copyleft/gpl.html GPL |
87 | | * @package Atos_Administrativos |
88 | | */ |
89 | | class Controller extends BaseController |
90 | | { |
91 | | /** |
92 | | * @var string Tela inicial da atividade Compor |
93 | | * @access public |
94 | | */ |
95 | | var $COMPOR = 'Compor.tpl'; |
96 | | |
97 | | /** |
98 | | * @var string Tela da atividade Consultar |
99 | | * @access public |
100 | | */ |
101 | | var $CONSULTAR = 'Consultar.tpl'; |
102 | | |
103 | | /** |
104 | | * @var string Tela da atividade Alterar |
105 | | * @access public |
106 | | */ |
107 | | var $ALTERAR = 'alterar.tpl'; |
108 | | |
109 | | /** |
110 | | * @var string Tela da atividade Visualizar |
111 | | * @access public |
112 | | */ |
113 | | var $VISUALIZAR = 'visualizar.tpl'; |
114 | | |
115 | | /** |
116 | | * Construtor da classe |
117 | | * @param object $model Instância da camada Model |
118 | | * @param array Configurações do ambiente MVC |
119 | | * @return object |
120 | | * @access public |
121 | | */ |
122 | | function Controller(&$model , &$env) |
123 | | { |
124 | | $this->super(&$model , &$env); |
125 | | $this->assign('inbox', $this->model->getWfProperty('wf_workflow_path') . |
126 | | SEP . 'index.php?start_tab=0'); |
127 | | $this->assign('processes', $this->model->getWfProperty('wf_workflow_path') . |
128 | | SEP . 'index.php?start_tab=1'); |
129 | | $this->assign('activity_title', 'Atos Administrativos'); |
130 | | } |
131 | | |
132 | | /** |
133 | | * Execucao da atividade. |
134 | | * @param $action Servico (acao) solicitado |
135 | | * @return void |
136 | | * @access public |
137 | | */ |
138 | | function run($action) |
139 | | { |
140 | | $this->model->DAO->connect(); |
141 | | $this->dispatch($action); |
142 | | $this->model->DAO->disconnect(); |
143 | | } |
144 | | |
145 | | } |
146 | | ?> |
147 | | }}} |
148 | | |
149 | | Na classe de Controle, a nível de processo, exemplificada no código anterior, iremos colocar tudo aquilo que for comum às classes Controle das atividades. A classe começa definindo as constantes que representam os templates do processo. Depois implementa o método construtor 'Controller', que no exemplo, está definindo três variáveis da camada View, que ficarão disponíveis para as classes que a estenderem. Também é implementado o método run() que é responsável por chamar o método adequado de cada classe Controller das atividades. Podemos notar que, no exemplo, este método já está estabelecendo uma conexão com o banco de dados do processo (feita através do comando $this->model->DAO->connect()), mas isto é opcional. |
150 | | |
151 | | Mais uma vez observamos a existência de uma cláusula 'extends' que neste caso está estendendo a classe !BaseController. Essa classe está definida a nível de módulo e contém métodos de uso geral para atividades de Controle, que estão disponíveis para as classes filhas. |
152 | | |
153 | | Segue uma explicação dos atributos da classe !BaseController: |
154 | | |
155 | | * view: objeto da classe Smarty que representa a camada View; |
156 | | * templateFile: armazena o nome do template em uso pela camada View; |
157 | | * model: objeto da classe Model da atividade. |
158 | | |
159 | | Métodos da classe !BaseController: |
160 | | |
161 | | * showForm: troca o template em uso; |
162 | | * syncVars: transfere todos os atributos da camada Model para a Camada View; |
163 | | * loadViewVars: recupera os dados produzidos pela camada Model e os transfere para a camada View; |
164 | | * assign: define o valor de uma variável da camada View; |
165 | | * cancelar: aborta a execução da atividade corrente; |
166 | | * dispatch: executa a ação solicitada pelo usuário. |
167 | | |
168 | | Resumindo, a implementação da camada Controller de uma atividade estará representada por três classes, com herança entre elas: |
169 | | |
170 | | * !BaseController: age em todos os processos desenvolvidos sob o padrão MVC no módulo de workflow; |
171 | | * Controller: estende o nível de módulo. Age somente sobre as atividades dos processos; |
172 | | * !AtividadeController: estende os níveis anteriores. Recebe e responde as requisições do usuário final dos processos. |
| 149 | Analisando o método Acao(), vemos que o mesmo faz uso da camada Model para executar a operação de sistema (acaoAction) e caso obtenha sucesso irá carregar os dados na camada View e a seguir definir qual o template será usado para mostrar os dados. |