Você está na página 1de 19

Respostas dos Exercícios do livro Crie

um
Framework para Sistemas Web com
PHP 5 e AJAX
Autor Walace Soares

Respostas

Capítulo 1

1.
De uma forma geral, podemos definir framework como um arcabouço, um conjunto de
ferramentas (classes, módulos, métodos) desenvolvido para suportar a construção de
aplicações mais complexas.
Ou:
"Um framework é um conjunto de classes que provê a abstração para resolver uma
família de problemas."

2.
Em um framework caixa-branca as classes ou interfaces são abstratas e devem ser
estendidas pelas classes da aplicação, sobrepondo os métodos necessários para o
funcionamento do sistema conforme as regras de negócio estabelecidas.

3.
Os frameworks considerados híbridos possuem, em sua maioria, o foco na herança e
incluem algumas funcionalidades prontas voltadas para composição.

4.

Respostas dos Exercícios 1


Um framework de aplicação está ligado à construção de aplicações específicas,
encapsulando o conhecimento necessário a uma vasta gama de aplicações. Como
exemplo temos sistemas financeiros, contábeis, de geoprocessamento, produção etc.´

5.
 Gerenciamento de banco de dados
 Suporte ao gerenciamento de classes dos sistemas
 Interface com o usuário
 Ferramentas básicas para administração do sistema
 Interação do browser com o servidor web
 Rotinas gerais para utilização do sistema

Capítulo 2

1.
 Conexão com o servidor de banco de dados
 Seleção do banco de dados
 Execução de comandos SQL
 Controle de transações
 Recuperação de registros (após um SELECT)
 Tratamento básico de exceções

2.
É uma classe especial que não pode ser instanciada diretamente.

3.

/**
* ORACLE
*/
class oracle extends BancoDados {
public function __construct() {

2 Crie um Framework para Sistemas Web com PHP 5 e AJAX


$this->_Tipo = 'oracle';
}

public function Conectar() {


if(($this->_conn=@oci_connect($this->_Usuario,
$this->_Senha,$this->_Banco,
"american.we8iso8859p1"))===false) {
$_e = oci_error();
$this->_ultimoerro = "Erro na Conexão com o " .
"Banco de Dados : {$_e['message']}";
}
return $this->_conn;
}
}

4.

BancoDados:
abstract public function multiqueries($_sql);

pgsql:
public function multiqueries($_sql) {
return $this->executaSQL($sql);
}

mysql:
public function multiqueries($_sql) {
return $this->_conn->multi_query($sql);
}

Capítulo 3
1.
HTML, TABLE, BR, SPAN, DIV

2.
BR, INPUT, IMG

Respostas dos Exercícios 3


3.
Ele adiciona um texto ao conteúdo do marcador atual.

4.
$_html = new html();
$_tipos = new tipospadrao();
$_tag1 = new tag($_tipos->getTipo('HTML'));
$_body = new tag($_tipos->getTipo('BODY'));
$_tab = new tag($_tipos->getTipo('TABLE'),
Array(new atributo("BORDER",1),
new atributo("CELLPADDING",5),
new atributo("WIDTH",400)));
$_tr = new tag($_tipos->getTipo('TR'));
$_tr->addSubTag(new tag($_tipos->getTipo('TH'),null,'Código'));
$_tr->addSubTag(new tag($_tipos->getTipo('TH'),null,'Descrição'));
$_tr->addSubTag(new tag($_tipos->getTipo('TH'),null,'Valor'));
$_tab->addSubTag($_tr);
$_tag1->addSubTag($_body);
$_html->addTag($_tag1);
$_body->addSubTag($_tab);
$_html->setOtimizado(false);
echo $_html->toHTML();

<HTML>
<BODY>
<TABLE BORDER=1 CELLPADDING=4 WIDTH=400>
<TR>
<TH>Código</TH>
<TH>Descrição</TH>
<TH>Valor</TH>
</TR>
</TABLE>
</BODY>
</HTML>

4 Crie um Framework para Sistemas Web com PHP 5 e AJAX


5.

Public function limpar() {


$this->_tags = Array();
}

6.
$_html = new html();
$_form = new tag(new tipotag("FORM"),
Array(new atributo("ACTION","processa.php5")));
$_form->addsubtag(new tag(new tipotag("SPAN"),null,"Código: "));
$_form->addsubtag(new tag(new tipotag("INPUT"),
Array(new atributo("NAME","CODIGO"))));
$_form->addsubtag(new tag(new tipotag("BR",false)));
$_form->addsubtag(new tag(new tipotag("SPAN"),null,"Descrição: "));
$_form->addsubtag(new tag(new tipotag("INPUT"),
Array(new atributo("NAME","DESCRICAO"))));
$_form->addsubtag(new tag(new tipotag("BR",false)));
$_form->addsubtag(new tag(new tipotag("SPAN"),null,"Data: "));
$_form->addsubtag(new tag(new tipotag("INPUT"),
Array(new atributo("NAME","DATA"))));
$_form->addsubtag(new tag(new tipotag("BR",false)));
$_form->addsubtag(new tag(new tipotag("SPAN"),null,"Valor: "));
$_form->addsubtag(new tag(new tipotag("INPUT"),
Array(new atributo("NAME","VALOR"))));
$_form->addsubtag(new tag(new tipotag("BR",false)));
$_form->addsubtag(new tag(new tipotag("SPAN"),null,"Ativo? "));
$_form->addsubtag(new tag(new tipotag("INPUT"),
Array(new atributo("NAME","ATIVO"),
new atributo("TYPE","CHECKBOX"),
new atributo("CHECKED"))));
$_html->addtag($_form);
echo $_html->toHTML();

Respostas dos Exercícios 5


7.
/**
* Gera o marcador LINK para a inclusão de
* um arquivo com folhas de estilo (css)
*
*/
class css extends tag {
public function __construct($_arquivo) {
parent::__construct(new tipotag("LINK"),
Array(new atributo("REL","STYLESHEET"),
new atributo("TYPE","text/css"),
new atributo("HREF","{$_arquivo}")));
}
}

8.
/**
* Classe estática para geração
* de atributos padrão de campos do tipo input
* uso: atributosinmput::geraAtributos(....);
*
*/

class atributosinput {
public static function geraAtributos($_tipo="TEXT",$_tamanho=20,
$_id="INP",$_nome=null,
$_valor="") {
return Array(
new atributo("TYPE",$_tipo),
new atributo("SIZE",$_tamanho),
new atributo("ID",$_id),
new atrributo("NAME",$_nome===null ? $_id : $_nome),
new atributo("VALUE",$_valor)
);
}
}

9.

6 Crie um Framework para Sistemas Web com PHP 5 e AJAX


$_html->toHTML(false);

10.
Sim. Neste caso o atributo é gerado somente com o nome atribuído; por exemplo, new
atributo("nowrap") gera apenas a palavra nowrap no marcador html.

Capítulo 4

1.
Gerenciar os sistemas, incluindo as rotinas de inclusão, alteração, exclusão, seleção e
listagem de dados existentes no sistema. Ela é a espinha dorsal das demais estruturas do
sistema, permitindo um desenvolvimento rápido e automatizado.

2.
 Montagem automática de comandos SQL;
 Controle para inclusão de novos registros;
 Controle para alteração de registros existentes;
 Controle para exclusão de registros;
 Rotina para busca de um registro ou de um conjunto de registros;
 Rotina para listagem de registros existentes.

3.
BancoDados e Campo [formularioRelatorio e Relatorio]

4.
Ela fornece a infra-estrutura para as suas classes filhas. Essa classe contém a maioria dos
atributos necessários ao gerenciamento de um campo qualquer, além de alguns métodos-
padrão.

5.
String, inteiro, float, dinheiro, data e datahora.

Respostas dos Exercícios 7


6.
Converte o valor do campo no formato aceito pelo banco de dados.

7.
Converte o valor do campo para ser exibido em uma página html.

8.
É um método preexistente para todas as classes do PHP, que executa funções especiais
dentro da classe.

9.
O método mágico __call é executado para todos os métodos não existentes na classe,
disponibilizando um meio de tratar essas exceções.

10.
$_numero = new inteiro("NUMERO","Número",10,null,null);
$_numero->setValor('10 peças');
echo $_numero->toBD() ."<br>";
$_numero->setValor('-');
echo $_numero->toBD() ."<br>";
$_data = new data("DATA","Data",10,null,null,
true,true,true,null,null,null,false,$_bd);
$_data->setValor("07-04-2009");
echo $_data->toBD() . "<br>";
echo $_data->toHTML();

10
0
2009-04-07 (considerando que o banco é o postgreSQL)
07-04-2009

11.
/**
* Campo booleano , true ou false (S/N)
*
*/

8 Crie um Framework para Sistemas Web com PHP 5 e AJAX


class booleano extends campo {
public function __construct($_nome,$_titulo,$_tamanho,
$_formato,$_relacao,
$_incluir=true,$_alterar=true,
$_listar=true,$_minimo=null,
$_maximo=null,$_camporef=null,$_pk=false) {
parent::__construct($_nome,$_titulo,'BOOL',$_tamanho,
$_formato,$_relacao,$_incluir,$_alterar,
$_listar,$_minimo,$_maximo,$_camporef,$_pk);
}

public function toBD() {


return $this->_valor===false ? 'N' : 'S';
}

public function toHTML() {


return $this->_valor=='S' ? true : false;
}
}

Capítulo 5:

1.
Formulário html é o meio pelo qual o usuário interage com o sistema, fornecendo dados
em campos predefinidos e formatos.

2.
Cabeçalho, menu, corpo e rodapé.

3.
AJAX significa Asynchronous Javascript and XML (JavaScript e XML assíncrono),
porém o que temos é muito mais que a junção de JavaScript com XML; é todo um
conceito de navegação e atualização de páginas web (algumas partes descritas no
conceito do AJAX não são novas, tendo sido chamadas muitas vezes de DHTML (HTML
Dinâmico) e Script Remoto.

Respostas dos Exercícios 9


4.
A classe processaAjax concentra no framework a maioria das chamadas AJAX
necessárias, fornecendo métodos para o envio de dados ao servidor web e para o
processamento do resultado.

5.
var ax = new processaAjax();
ax.run('retorna_ufs.php5','ufs');

6.
A classe paginacao calcula o número de páginas conforme os parâmetros enviados (total
de registros, página atual, registros por página, usar AJAX, marcador que receberá o
resultado) e monta a lista de páginas com os links para que elas sejam exibidas no
framework.

7.
Duas formas:
 Alterar a constante REGISTROS_PAGINA.
 Enviar como parâmetro no método paginar().
A primeira opção afeta todas as chamadas à classe paginação e a segunda, apenas a
execução atual do método pagina().

8.
 Input
 Select
 Button
 TextArea
9.
formSelect (formInputRadio também funciona)

10.
Essa classe gera no formulário um campo do tipo INPUT e do subtipo CHECKBOX, que
permite ao usuário marcar ou desmarcar a opção exibida.

10 Crie um Framework para Sistemas Web com PHP 5 e AJAX


11.
Não. A classe gera um campo do tipo INPUT e subtipo RADIO e no formulário html
deve haver pelo menos dois campos desse tipo com o mesmo nome para que sua
utilização seja justificada, uma vez que este é um campo que permite ao usuário escolher
apenas uma opção entre várias (pelo menos duas).

12.
formInputSubmit

13.
/**
* Gera um Campo do tipo INPUT e subtipo IMAGE
*/
class formInputImage extends formCampo {
public function __construct($_nome,$_src,$_valor=' Enviar ',
$_classe=null,Eventos $_eventos=null) {
parent::__construct(new tipotag("INPUT",false),
Array(new atributo("TYPE","IMAGE"),
new atributo("SRC",$_src),
new atributo("VALUE",$_valor)),
$_nome,$_classe,$_eventos);
}
}
14.

Essa classe oferece suporte para a validação dos campos durante a alteração do seu
conteúdo e no processo de envio do formulário ao servidor web.

15.
O framework insere uma chamada ao método verificaCampo() da classe formulário no
evento onkeypress() de cada campo. O método verificaCampo(), conforme o tipo de
campo (inteiro, decimal, data), valida o caractere digitado, aceitando-o ou recusando-o.

Capítulo 6:

1.

Respostas dos Exercícios 11


Os menus são criados pela inclusão das opções na tabela de menus do sistema. É possível
realizar essa tarefa por meio de um script de inclusão de dados ou pelo programa
adm_menu.php5 (que deve estar criado no menu para que seja possível utilizá-lo).

2.
Esse arquivo informa à classe menu que sistemas estão sendo executados no framework,
possibilitando que seus programas estejam disponíveis para o gerenciamento de menus do
framework.

3.
Esse programa facilita o desenvolvimento de novos programas, pois inclui todas as
classes e includes necessárias, instancia a classe informada e executa o método
processaAcao() da classe.

4.
No Internet Explorer precisamos contornar um pequeno problema na definição da
pseudoclasse hover, uma vez que o IE somente a reconhece quando ela está ligada ao
marcador html <a>, ou seja, a:hover.

5.
Infinitos.

6.

ul#nivel1 ul {
margin: 0;
padding: 2px;
background: #ffffff;
font-size: 12px;
width: 250px;
 border: 1px solid #1E90FF;
position: absolute;
display: none;

12 Crie um Framework para Sistemas Web com PHP 5 e AJAX


left: 1px;
top: 24px;
}

7.
ul#nivel2 li.principal {
background: transparent url(../imagens/submenu.png) right center
no-repeat;
}

Define uma imagem de fundo para o elemento UL com identificador 'nivel2' e subitem LI
cuja classe seja 'principal'. Essa folha é utilizada na exibição de menus, sendo aplicada
quando um menu possui submenus associados.

Capítulo 7:

1.
Para garantir que apenas os usuários autorizados tenham acesso aos sistemas.

2.
Estão criptografadas utilizando o algoritmo (chiper) MCRYPT_BLOWFISH.

3.
Devemos alterar as chaves utilizadas para geração da senha criptografada. Os atributos
são $_Chave , $_Texto e $_Iv = "ED.ERICA". Este último deve ter obrigatoriamente
oito caracteres. Esses atributos estão definidos na classe usuario.

4.
O usuário deve clicar no link "esqueceu?" da página de autenticação e fornecer sua
identificação ou e-mail. O framework valida as informações e envia ao endereço de e-
mail do usuário os seus dados de login, incluindo a senha.

5.
Não, pois o framework precisa do endereço de e-mail para enviar os dados do usuário.

Respostas dos Exercícios 13


6.
Pela gravação de uma sessão do usuário contendo seus dados.

7.
Identificação do usuário, login, nome, e-mail, menu com as permissões de acesso e lista
de programas autorizados.

$_SESSION['USUARIO_AUTENTICADO'] = true;
$_SESSION['USUARIO_ID'] =
$_usuario->getCampo('USUARIO_ID')->getValor();
$_SESSION['USUARIO_LOGIN'] =
$_usuario->getCampo('USUARIO_LOGIN')->getValor();
$_SESSION['USUARIO_NOME'] =
$_usuario->getCampo('USUARIO_NOME')->getValor();
$_SESSION['USUARIO_EMAIL'] =
$_usuario->getCampo('USUARIO_EMAIL')->getValor();
$_SESSION['MENU'] = serialize($_menu->geraMenuHTML(
$_perm->retornaPermissoes(
$_usuario->getCampo('USUARIO_ID')->getValor()),
$_autorizados));
$_SESSION['AUTORIZADOS'] = serialize($_autorizados);

8.
A sessão é destruída, evitando que a sessão do usuário seja acessada por pessoa não
autorizada.

Capítulo 8:

1.
Determinar a quais programas do sistema o usuário tem acesso.

2.

14 Crie um Framework para Sistemas Web com PHP 5 e AJAX


Por usuário.

3.
Todos os programas estão inicialmente autorizados.

4.
Sim.

5.
Não. O framework mostra a mensagem "Você não tem Permissão para Acessar Este
programa" e encerra o processamento.

6.
O controle pode ser feito relacionando os usuários a grupos de acessos, assim podemos
classificar os usuários por função (administrador, estoquista, faturista etc.) e definir
menus para esses perfis ou grupos, o que facilita o trabalho do administrador (imagine
uma empresa com 300 funcionários. Dar permissão individual será um inconveniente e as
chances de erro são bem maiores).
Para implementar o novo controle é necessário:
 Criar um cadastro de grupos.
 Alterar o cadastro de usuários, incluindo o grupo.
 Criar uma tabela para permissão por grupo.
 Criar a rotina de geração da permissão por grupo.
 Alterar a busca de permissão para considerar o grupo antes do usuário, sendo o
usuário o nível principal, ou seja, um programa autorizado no grupo e
bloqueado no usuário permanece bloqueado e vice-versa.

Capítulo 9:

1.
Por meio de folhas de estilo (CSS).

2.
Framework.css.

Respostas dos Exercícios 15


3.
Sim. Basta alterar a folha de estilo body, incluindo o elemento background-color e
informando a cor desejada. Por exemplo:
body {
width: 1024;
font-family: Verdana Georgia Sans;
font-size: 12px;
 background-color: yellow;
}

4.
button, #ok, #gravar, #clear {
 border: 2px outset green;
padding: 3px;
padding-left:17px;
font-size: 12px;
background: url(../imagens/fundobotao.png) left center no-repeat;
background-color: #ffffff;
color: #000000;
}

5.
a:hover {
text-decoration: none;
color: white;
 background-color: red;
}

Capítulo 10:

1.
Barra de botões, filtro, impressão, auditoria, histórico e favoritos.

2.

16 Crie um Framework para Sistemas Web com PHP 5 e AJAX


Para gerar uma série de botões.

3.
Contém a barra de botões com os botões-padrão estabelecidos para o framework.

4.
Alterando as folhas de estilo da classe 'botao' no arquivo framework.css.

5.
Tooltip.

6.
Serve para determinar os critérios de recuperação (seleção) dos registros.

7.
Sim, basta alterar o valor do atributo $_filtro para falso (false) nos campos que não
devem fazer parte do filtro.
8.
FILTRO.

9.
Como variável de sessão.

$_SESSION["FILTRAR_" . get_class($this)] = serialize($_filtro);

10.
Sim.

11.
Sim, é possível. Para não utilizar, basta desmarcar a opção "Aplicar Filtro ao Relatório"
mostrada no formulário de configuração de impressão.

12.

Respostas dos Exercícios 17


Basta alterar o valor do atributo $_relatorio para falso (false) nos campos que não devem
fazer parte do relatório.

13.
Em uma nova página.

14.
Lista de campos, ordenação e aplicação do filtro. Sim, basta informar a nova ordenação
no quadro "Ordenar por".

15.
É necessário criar na classe base três métodos:
getFormularioRelatorio(),imprimirRelatorio() e processaRelatorio().

16.
O framework grava todas as operações de inclusão, alteração e exclusão de registros
executadas pelo usuário, armazenando as informações necessárias para a trilha de
auditoria (usuário, data/hora, ip, classe, função, histórico).

17.
Inclusão, alteração e exclusão.

18.
Sim. Basta alterar os métodos geradores de auditoria, testando se é uma instância da
classe antes de executar a operação (outra forma seria a criação de um atributo na classe
base que define se a classe gera auditoria ou não).

19.
Armazenar as páginas visitadas pelo usuário.

20.
Na chamada do programa, ou seja, dentro de instanciaclasse.php5.

18 Crie um Framework para Sistemas Web com PHP 5 e AJAX


21.
Os dez itens mais visitados em ordem decrescente de número de acessos.

22.
Sim. Existe uma opção de limpeza no menu suspenso do histórico.

23.
Foi necessário alterar o método runPost() para que fosse possível enviar um marcador
html com valor nulo, indicando que o método não deve escrever o resultado retornado
pelo servidor web na página.

24.
É opção do usuário, que deve abrir o menu suspenso de favoritos e clicar na opção
"Adicionar programa" quando o programa desejado estiver em execução.
25.
Sim. Basta abrir o menu suspenso de favoritos e excluir na opção "Remover programa"
quando o programa desejado estiver em execução.

Respostas dos Exercícios 19

Você também pode gostar