Tag Archives: PHP

PRADO para PHP 5: Active Controls (AJAX)

Olá pessoal! Este é o segundo post da série sobre o framework PRADO para PHP 5. Se você chegou aqui diretamente, leia o primeiro post, pois estenderemos o projeto iniciado ali.

No primeiro projeto, implementamos um formulário simples que utiliza o método postback para o envio de requisições ao servidor web. O inconveniente desse método é o recarregamento da página inteira para que a exibição do resultado do processamento seja possível.

Uma forma melhor de obter o mesmo resultado, sem a desagradável atualização da página toda, é utilizar o método callback, que por sua vez se utiliza da tecnologia AJAX (Asynchronous Javascript and XML), capaz de atualizar apenas a região da página efetivamente alterada.

Quem desenvolve para a web sabe que trabalhar com AJAX pode ser penoso, principalmente se lidarmos diretamente com Javascript e XMLHTTPRequest. Felizmente, o Prado nos dá uma grande ajuda neste ponto, encapsulando as requisições AJAX em seus próprios componentes. E o que é melhor: em muitos casos, não é necessário sequer mexer com o Javascript!

Como assim? Vejamos como isso funciona na prática. Para começar, vamos fazer uma cópia de nosso projeto olamundo e renomeá-la como olamundo-2.0.

No arquivo /protected/pages/Home.page, vamos trocar os controles TTextBox, TButton e TLabel pelos seus “irmãos ativos”: TActiveTextBox, TActiveButton e TActiveLabel:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8″>
<title></title>
</head>
<body>
<h1>Olá, mundo!</h1>
<com:TForm>
Qual é o seu nome? <com:TActiveTextBox ID=“txtNome” />&nbsp;
<com:TActiveButton ID=“btnEnviar” Text=“Enviar” OnClick=“Page.btnEnviarClick” />
<br />
<com:TActiveLabel ID=“lblCumprimento” />
</com:TForm>
</body>
</html>

Essa é toda a alteração necessária neste arquivo.

No arquivo /protected/pages/Home.php, vamos acrescentar apenas uma linha ao início do arquivo, antes da declaração da classe:

<?php

Prado::using(‘System.Web.UI.ActiveControls.*’);

class Home extends TPage {

public function btnEnviarClick($sender, $param) {
$this->lblCumprimento->Text = “Olá, “ . $this->txtNome->Text . “!”;
}

}

?>

Como os controles ativos, por padrão, não são carregados automaticamente pelo PRADO, aquela linha serve para dizer ao framework que queremos utilizá-los. E isso é tudo. Você poderá ver o novo projeto em ação aqui e, se tiver olhos atentos, perceberá que a tela não “pisca” mais antes da exibição da saudação.

Para os mais “cismados”, e também para deixar nosso usuário ciente do que está acontecendo nos bastidores, vamos fazer um novo upgrade do projeto, agora para a versão olamundo-2.1. Acrescentaremos um notificador de atividade que será exibida na página enquanto a requisição AJAX vai e volta: uma div vermelha contendo o texto “Aguarde…”.

Vamos mexer no /protected/pages/Home.php:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8″>
<title></title>
<!– STYLE acrescentado –>
<style>
#notif {
background-color:#F00;
color: #FFF;
position:absolute;
visibility:hidden;
}
</style>
</head>
<body>
<!– DIV acrescentada –>
<div id=“notif”>Aguarde…</div>
<h1>Olá, mundo!</h1>
<com:TForm>
Qual é o seu nome? <com:TActiveTextBox ID=“txtNome” />&nbsp;
<!– Propriedades ClientSide Acrescentadas –>
<com:TActiveButton ID=“btnEnviar” Text=“Enviar” OnClick=“Page.btnEnviarClick”
ClientSide.OnLoading=“$(’notif’).style.visibility=’visible’”
ClientSide.OnLoaded=“$(’notif’).style.visibility=’hidden’” />
<br />
<com:TActiveLabel ID=“lblCumprimento” />
</com:TForm>
</body>
</html>

Foram acrescentados um estilo (para configurar a DIV com fundo vermelho, posicionamento absoluto e sem visibilidade inicial), a DIV propriamente dita e configuradas duas novas propriedades do componente TActiveButton: ClientSide.OnLoading e ClientSide.OnLoaded. A primeira propriedade contém um código Javascript (finalmente!) a ser executado quando a requisição é despachada para o servidor e a segunda o código para quando a resposta chegar. Em nosso projeto, a lógica é simples: enviou a requisição, exibe a DIV; a resposta chegou, oculta a DIV. O resultado disso? Veja aqui.

Os mais atentos vão notar que, nas duas linhas Javascript foi utilizado o atalho $(’notif’) ao invés do longo e tedioso document.getElementById(’notif’). Isso porque o PRADO também não tem a intenção de reinventar a roda, e, ao contrário, incorpora algumas das melhores soluções desenvolvidas por terceiros. No caso do Javascript, o PRADO já traz consigo o Prototype (de onde vem o atalho $) e o script.aculo.us, entre outros.

Fico por aqui com este post, esperando ter sido didático na minha exposição. Para terminar, zipei as três versões do olamundo, juntamente com o PRADO, e fiz upload aqui, para facilitar. Para quem tem uma instalação PHP 5, basta descompactar num diretório acessível pelo seu servidor web.

Um abraço, e até a próxima!

PRADO: (não apenas mais um) framework para o PHP 5

Olá, pessoal! Este é o meu primeiro post aqui no devFranca. O objetivo dele é apresentar o framework PHP com o qual trabalho, e que acho bastante interessante para o desenvolvimento de aplicações web. Não deixe de comentar após a leitura. :)

Há cerca de três anos, percebi que as aplicações estavam migrando para a web, e a partir dessa constatação decidi mudar meu foco de desenvolvimento. Até então, meu trabalho consistia em desenvolver programas para desktop, e minha ferramenta favorita era o Delphi (embora eu já tivesse trabalhado também com o VB). Eu não era nenhum estrangeiro nas terras do desenvolvimento web, tendo já trabalhado por quatro anos com o ASP, e conhecia, portanto, as limitações dessa plataforma.

Como simpatizante das tecnologias opensource, escolher o PHP foi a decisão natural. Naquele momento, eu iria iniciar um projeto PHP do zero, e percebi que reinventar a roda não seria inteligente nem produtivo. Foi daí que parti em busca de um framework, uma caixa de ferramentas mais ou menos prontas, que me poupasse o esforço de codificar muita coisa “na unha”.


Read more

Classe genérica de conexão. Essa é pra guardar com carinho!

Boa tarde pessoal, olha eu aqui de novo, agora que já mostrei como configurar o apache + php + mysql, vou mostrar a vocês uma classe de conexão que uso em 90% das aplicações que faço em PHP, nos outros 10% não faço conexão com base de dados (tá explicado porque uso a classe só em 90%, rs).

Funciona da seguinte forma, nessa classe você pode utilizar métodos de conexão com “n” bancos de dados diferentes, passando apenas no método construtor o tipo de banco de dados que irá utilizar, no exemplo que vou mostrar nesse tutorial utilizo apenas conexão com MySQL e PostgreSQL, mas fica a critério de vocês qual tipo de banco de dados utilizar, basta adicionar mais uma cláusula nos métodos da classe, referente ao banco de dados que irá utilizar.

Neste tutorial não vou enrolar muito não, vou postar a classe inteira aqui e explicá-la nos comentários, crie um arquivo chamado Conn.php e dentro dele coloque o seguinte código:

<?php

    /* Declaração da Classe deve ter o mesmo nome do arquivo (conceitos de OO) */    

 

    /**

     * @author Dheyson Wildny - www.devfranca.com.br

     */

    class Conn {

        

        /* Declaração dos atributos da classe */

        private $servidor;

        private $usuario;

        private $senha;

        private $banco;

        private $tipoBanco;

        private $conn;

        private $resultado;

        private $sql;

        

        /**

         * @param String $tipo

         * @param String $server

         * @param String $user

         * @param String $pass

         * @param String $banco

         */

        public function conn($tipo, $server, $user, $pass, $banco) {        

            $this->setTipoBanco($tipo);

            $this->setServidor($server);

            $this->setUsuario($user);

            $this->setSenha($pass);

            $this->setBanco($banco);            

        }

        

        /**

         * @param String $server

         */

        public function setServidor($server) {

            $this->servidor = $server;

        }

        /**

         * @param String $user

         */   

        public function setUsuario($user) {

            $this->usuario = $user;

        }

        /**

         * @param String $pass

         */     

        public function setSenha($pass) {

            $this->senha = $pass;

        }        

        /**

         * @param String $banco

         */     

        public function setBanco($banco) {

            $this->banco = $banco;

        }

        /**

         * @param String $tipo

         */     

        public function setTipoBanco($tipo) {

            $this->tipoBanco = $tipo;

        }

        

        /**

         * @return Conexão Aberta

         */     

        public function connDB() {

            //Se o banco for MySQL

            if ($this->tipoBanco == "mysql") {        

                $this->conn = mysql_connect($this->servidor, $this->usuario, $this->senha);                

                if(!$this->conn) {

                    echo "<p>N&atilde;o foi poss&iacute;vel conectar-se ao servidor MySQL. <br>Erro MySQL: ".mysql_error()."</p>";

                    exit();

                } elseif (!mysql_select_db($this->banco, $this->conn)) {

                    echo "<p>N&atilde;o foi poss&iacute;vel selecionar o banco de dados desejado. <br>Erro MySQL: ".mysql_error()."</p>";

                    exit();

                }

            //Se o banco for PostgreSQL

            } else if ($this->tipoBanco == "pgsql") {

                $this->conn = pg_connect($this->servidor, $this->usuario, $this->senha);

                if(!$this->conn) {

                    echo "<p>N&atilde;o foi poss&iacute;vel conectar-se ao servidor PostgreSQL. <br>Erro PgSQL: ".pg_errormessage()."</p>";

                    exit();

                } elseif (!pg_select($this->banco, $this->conn)) {

                    echo "<p>N&atilde;o foi poss&iacute;vel selecionar o banco de dados desejado. <br>Erro MySQL: ".mysql_error()."</p>";

                    exit();

                }

            }

        }

        

        /**

         * @return Fecha Conexão

         */     

        public function closeConnDB() {

            if ($this->tipoBanco == "mysql") {    

                return mysql_close($this->conn);

            } else if ($this->tipoBanco == "pgsql") {

                return pg_close($this->conn);

            } else {

                return false;

            }

        }

        

        /**

         * @return Query - retorna o resultado de algum comando executado

         */     

        public function runQuery($sql) {

            $this->connDB();

            $this->sql = $sql;

            if ($this->tipoBanco == "mysql") {

                $this->resultado = mysql_query($this->sql);

            } else if ($this->tipoBanco == "pgsql") {

                $this->resultado = pg_query($this->sql);

            }

            if($this->resultado) {

                $this->closeConnDB();

                return $this->resultado;

            } else {

                $this->closeConnDB();

                if ($this->tipoBanco == "mysql") {

                    exit("<p>N&atilde;o foi poss&iacute;vel executar o comando solicitado.<br>Erro MySQL: ".mysql_error()."</p>");

                } else if ($this->tipoBanco == "pgsql") {

                    exit("<p>N&atilde;o foi poss&iacute;vel executar o comando solicitado.<br>Erro PgSQL: ".pg_errormessage()."</p>");

                } else {

                    exit("<p>N&atilde;o foi poss&iacute;vel executar o comando solicitado.</p>");

                }

            }

        }

        

        /**

         * @return Objeto de Conexão - Retorna uma instância da classe de conexão

         */     

        static public function conexao(){

            $con = new Conn('mysql', 'localhost', 'root', '', 'devfranca');

            return $con;

        }                    

    }

?>

Com esta classe de conexão vocês não precisarão de mais nada para realizar suas operações CRUD (Create, Retrieve, Update e Delete – Criar, Recuperar, Alterar e Deletar).

Para que quizer baixar essa classe prontinha, clique aqui.

Nos próximos tutoriais vou mostrar a vocês como aplicar essa classe de conexão, e então vocês vão perceber que essa classe pode ser aplicada com extrema facilidade em qualquer projeto que exija conexão com banco de dados.

Abraço e até a próxima!

Por onde começar em PHP?

Olá a todos, sou Dheyson Wildny e é com grande prazer que escrevo esta minha primeira postagem para nosso blog. Trabalho com desenvolvimento web a bastante tempo, com as linguagens, php 5 OO, ajax, flex (principais linguagens), asp, vb e java (eventuais desenvolvimentos), e como muitos programadores web que conheço iniciei minha carreira desenvolvendo sistemas comerciais em Delphi apenas desktop e migrando depois para php.

Sei que já existe muito material na internet que mostra como configurar e utilizar o php e eu poderia muito bem pular esta parte, mas como o intuito do nosso grupo aqui do DevFranca é atingir todos os níveis de programadores, desde iniciantes até nossos colegas de profissão mais avançados.

Por onde começar em PHP? Instalando e configurando! Então vamos lah!

Primeiro os DOWNLOADS:

- PHP: vamos trabalhar com a versão 5.2.9 para Windows, para baixá-lo clique aqui

- Apache: vamos trabalhar com a versão 2.2.11 para Windows, para baixá-lo clique aqui

- MySQL: vamos trabalhar com a versão pra Windows, para baixá-lo clique aqui

CONFIGURANDO PHP

1º passo: Extair os arquivos do php para uma pasta chamada PHP5 dentro de C:Arquivos de programas.

2º passo: Renomeie um arquivo chamado php.ini-dist para php.ini.

3º passo: Abra o arquivo php.ini e vamos alterar as linhas necessárias:

procure a linha que contém o texto: extension_dir = "./" e altere para extension_dir = "C:/Arquivos de programas/PHP5/ext/" neste diretório se encontra todas as dlls do php para trabalhar com banco de dados, sockets, xml, etc

procure a linha que contém o texto: ;extension=php_mysql.dll e retire o “;” da frente da linha. Esta linha diz ao php para carregar as funções de manipulação do mysql.

Salve e feche o arquivo.

4º passo: Mover os arquivos php5ts.dll e libmysql.dll para a pasta: C:WINDOWSsystem32. E o arquivo php.ini para a pasta: C:WINDOWS

CONFIGURANDO APACHE

1º passo: Instalar o apache, instalação básica: next, next, next e finish, exceto na tela onde solicita informações do servidor: são três campos, coloque no primeiro campo localhost, no segundo campo localhost e no terceiro campo seu e-mail.

2º passo: abra o aquivo httpd.conf localizado na pasta: C:Arquivos de programasApache Software FoundationApache2.2conf e vamos alterar as linhas necessárias:

procure a linha que contém o texto: #LoadModule vhost_alias_module modules/mod_vhost_alias.so e abaixo dela adicione a linha com texto: LoadModule php5_module "C:/Arquivos de programas/php5/php5apache2_2.dll".
Aqui você fala para o apache que ele deve carregar o php em sua execução

procure a linha que contém o texto: DirectoryIndex index.html e na frente dela escreva: index.php default.php main.php, ficando da seguinte forma, DirectoryIndex index.html index.php default.php main.php.
Aqui você dia ao apache que ele deverá reconhecer essas páginas como arquivos iniciais de aplicações web, sendo que ele procurar na sequência em que elas estão, até encontrar alguma

- crie uma pasta chamada www no c: de sua máquina

procure a linha: DocumentRoot "C:/Arquivos de programas/Apache Software Foundation/Apache2.2/htdocs" e substitua por: DocumentRoot "C:/www". Procure a linha: <Directory "C:/Arquivos de programas/Apache Software Foundation/Apache2.2/htdocs"> e substitua por <Directory "C:/www">. 
Isso fará que o apache reconheça a pasta www criada como sendo o repositório de suas aplicações web (apenas para facilitar a nossa vida).

procure a linha: AddType application/x-gzip .gz .tgz e abaixo dela adicione uma linha com o texto, AddType application/x-httpd-php .php e outra linha abaixo com, AddType application/x-httpd-php-source .phps.
Aqui você diz ao apache como reconhecer que uma página php esta sendo executada, então ele adiciona o Mime-Type PHP ao APACHE quando você abre uma página .php o apache executa o Mime-Type application/x-httpd-php e quando você executa um arquivo .phps executa o Mime-Type application/x-httpd-php-source.

Reinicie o monitor do apache para que as novas alterações entrem em vigor.

CONFIGURANDO O MySQL

Instalação comum, apenas lembre no nome de usuário e senha que você colocar pois vamos necessitar dessas informações futuramente.

VERIFICANDO SE INSTALAÇÃO FOI EXECUTADA COM SUCESSO

Abra o bloco de notas e digite:

<?php

    phpinfo();

?>

Salve o aquivo com nome de info.php dentro da pasta C:www.

Digite no seu navegador: http://localhost/info.php, se aparecer a tela abaixo as instalações e configurações foram executas perfeitamente.

print

E terminamos nosso primeiro tutorial aqui, espero ter sido bastante objetivo e claro, sei que essa parte de instalação é bastante chatinha mas tenho certeza que vamos nos divertir bastante como o php e php+amfphp+flex.

Grande abraço e até a próxima!