Criando uma nova ferramenta parte2

Nesta parte vamos colocar um exemplo concreto de uma ferramenta falsa desenvolvida apenas para adaptação e maior familiaridade com as linguagens de programação. O seu desenvolvimento foi dividido em fases.

A ferramenta analisa a compatibilidade amorosa entre duas pessoas de um mesmo curso.

1ª fase:

Primeiro, criamos a estrutura básica da ferramenta, ou seja, os arquivos ferramenta.php, ferramenta.inc, acoes.php, resultado.php, historico.php.
Depois, temos que seguir os seguintes requisitos:
- Todo os dados serão inseridos por meio de inputs normais. Ainda não há algum contato com o banco de dados;
- O resultado será processado na página acoes.php e exibido na página resultado.php;
- Fazer uma validação básica via javascript e depois no php de segurança.
- Todos os elementos, como input, botões, texto, devem seguir os padrões do TelEduc.

Após modificarmos as tabelas do banco de dados e os arquivos da ferramenta, vamos começar a implementar:

ferramenta.php: A idéia aqui é modificar a página novaferramenta.php. Vamos fazer duas fileiras de nomes, onde a da direita estão os nomes femininos e a da esquerda os nomes masculinos. Ao lado direito de cada nome, haverá um radio button para a pessoa poder fazer a escolha de nomes.

ferramenta.inc: Temos de pegar os nomes de algum lugar, então vamos criar uma função neste arquivo para retornar um array com nomes:

//$sexo == 1: feminino, $sexo == 2: masculino
function setListaNomes($sexo){
    //array:
    $lista_nomes;
    if($sexo == 1){
        $lista_nomes = array("Amanda","Thais","Cintia","Camila","Bia","Veronica");
    }
    else{
        $lista_nomes = array("Fernando","Tomas","Leandro","Caio","Luis","Antonio");
    }
    return $lista_nomes;
}

Agora em ferramenta.php, temos que dar um include de ferramenta.inc, então, logo após o include das bibliotecas, colocamos include("ferramenta.inc");:

$bibliotecas="../bibliotecas/";
include($bibliotecas."geral.inc");
include("ferramenta.inc");

Definindo os arrays com os nomes a serem utilizados:

$lista_nomes_m = setListaNomes(1);
$lista_nomes_h = setListaNomes(2);

Mais para o meio do código, temos a criação da tabela interna, após essa criação, vamos colocar os nomes com os radio button:

/*Definindo a tabela interna*/
echo("                    <table id=\"tabelaInterna\" cellpadding=\"0\" cellspacing=\"0\" class=\"tabInterna\">\n");

echo("                          <tr class=\"head\"><td colspan=\"8\">"."Escolha um nome de cada coluna e clique em \"Resultado\":"."</td></tr>\n");

/*Colocando os nomes nas colunas:*/
for ($i = 0; $i <= strlen($lista_nomes_m); $i++){
    echo("                        <tr>\n");
    echo("                             <td width=\"5%\" align=\"center\"><input type=\"radio\" name=\"r_m\" id=\"r_m\" value=\"$i\"/></td><td class=\"alLeft\" width=\"20%\" >".$lista_nomes_m[$i]."</td>\n");
    echo("                             <td width=\"5%\" align=\"center\"><input type=\"radio\" name=\"r_h\" id=\"r_h\" value=\"$i\"/></td><td class=\"alLeft\" width=\"20%\" >".$lista_nomes_h[$i]."</td>\n");
    echo("                        </tr>\n");
}

Após isso, aparecerá na tela:

Colocando o botão "Resultado":

Após colocarmos os nomes, terminamos a tabela interna e adicionamos o botão.

/*Fim da tabela interna*/
echo("                   </table>\n");
/*Botao Resultado*/
echo("                       <div align=\"right\">\n");
echo("                            <input class=\"input\" type=\"submit\" name=\"resultado\" value=\""."Resultado"."\" />\n");
echo("                       </div>\n");
/*Fim da tabela externa*/
echo("                  </td>\n");
echo("             </tr>\n");
echo("        </table>\n");

Agora nossa tela principal já está completa:

E quando o usuário clicar no botão "Resultado"? Bem, a página terá que ser direcionada para acoes.php onde os dados serão processados.
Antes disso, precisamos criar uma função que irá verificar o grau amoroso de duas pessoas. Então, voltando ao arquivo ferramenta.inc, criamos a função grauRelacionamento() que verificará o tamanho dos nomes e retornará o quanto essas duas pessoas tem de afinidade.

No arquivo ferramenta.inc colocamos:

/*Funcao que verifica o grau de relacionamento entre duas pessoas
 * A verificacao é feita a partir do número de letras dos nomes
 * a = alto, b = baixo, m = medio */
function grauRelacionamento($nome_m, $nome_h){
    $g_alto = "a";
    $g_medio = "m";
    $g_baixo = "b";
    if((0 <= strlen($nome_m)) && (strlen($nome_m) < 4)){
        if((6 <= strlen($nome_h)) && (strlen($nome_h) < 8)){
            return $g_alto;
        }
        elseif((3 <= strlen($nome_h)) && (strlen($nome_h) < 6)){
            return $g_medio;
        }
        else{
            return $g_baixo;    
        }    
    }
    elseif((4 <= strlen($nome_m)) && (strlen($nome_m) < 6)){
        if((6 <= strlen($nome_h)) && (strlen($nome_h) < 8)){
            return $g_baixo;
        }
        elseif((4 <= strlen($nome_h)) && (strlen($nome_h) < 6)){
            return $g_alto;
        }
        else{
            return $g_medio;    
        }    
    }
    else{
        if((6 <= strlen($nome_h)) && (strlen($nome_h) < 8)){
            return $g_medio;
        }
        elseif((3 <= strlen($nome_h)) && (strlen($nome_h) < 6)){
            return $g_baixo;
        }
        else{
            return $g_alto;    
        }
    }
}

Percebemos que a função precisa de dois parâmetros: $nome_m e $nome_h. Esses nomes são passados pelo método POST da página ferramenta.php para a página acoes.php. Em ferramenta.php, além de passarmos os dados que serão os parâmetros da função, temos que passar o tipo de ação que será tomada.
No arquivo ferramenta.php criamos um formulário, onde indicaremos que quando o botão "Resultado" for clicado, direcionaremos a página para acoes.php com 2 variáveis: o tipo de ação e o código do curso.

Então, antes de colocarmos os radio buttons com os nomes, criamos um formuário, em que indicamos para qual página irá após clicar no botão "Resultado":

echo("                        <form id=\"formCompor\" name=\"formCompor\" action=\"acoes.php\" method=\"post\" />\n");

E, após a criação do botão "Resultado", colcamos os parâmetros que serão passados para a página acoes.php:

echo("                       <div align=\"right\">\n");
echo("                            <input class=\"input\" type=\"submit\" name=\"resultado1\" value=\""."Resultado"."\"/>\n");
echo("                            <input type=\"hidden\" name=\"acao\" value=\"Resultado\">");
echo("                            <input type=\"hidden\" name=\"cod_curso\" value=\"$cod_curso\">");
echo("                       </div>\n");
echo("                        </form>\n");

Em acoes.php temos que primeiro dar um include do arquivo ferramenta.inc e depois fazer uma verificação do tipo de ação a ser tomada para processar os dados. No caso, a ação que existe é quando o usuário clica em "Resultado", então temos uma ação do tipo "Resultado".
Por motivos de segurança, os dados da página ferramenta.php são passados através do método "post". Esses dados são pegos na página acoes.php, gera um resultado, e então a página é direcionada para resultado.php, onde será mostrado esse resultado.

No arquivo acoes.php:

$bibliotecas="../bibliotecas/";
include($bibliotecas."geral.inc");  
include("novaferramenta.inc");

if($acao == 'Resultado'){

    $cod_curso = $_POST["cod_curso"];
    $id_m = $_POST['r_m'];
    $id_h = $_POST['r_h'];

    $lista_m = setListaNomes(1);
    $lista_h = setListaNomes(2);

    if($id_m > -1 && $id_m < 8 && $id_h > -1 && $id_h < 8){
        if(strlen($lista_m[$id_m]) > 0 && strlen($lista_h[$id_h]) > 0){

            $resultado = grauRelacionamento($lista_m[$id_m], $lista_h[$id_h]);

            header("Location: resultado.php?cod_curso=".$cod_curso."&resultado=".$resultado."&nome1=".$lista_m[$id_m]."&nome2=".$lista_h[$id_h]."&acao=".$acao);
        }
    }
}

O método "header" é uma maneira de direcionar a página. Dentro dele, colocamos a página que será direcionada e os argumentos que serão usados nela.

A página resultado.php é muito parecida com a página ferramenta.php com a diferença que em vez de aparecerem duas fileira de nomes, irá aparecer o nome do casal e uma frase dizendo o quanto esse casal dará certo.
Então, após a criação da tabela interna, vamos colocar escrito "Resultado".

/*Definindo a tabela interna*/
echo("                    <table id=\"tabelaInterna\" cellpadding=\"0\" cellspacing=\"0\" class=\"tabInterna\">\n");

echo("                          <tr class=\"head\"><td colspan=\"8\">"."Resultado"."</td></tr>\n");

Agora pegamos os argumentos que foram passados pelo acoes.php pelo método GET e mostramos o resultado:

echo("                          <tr>\n");
$resultado = $_GET['resultado'];
$nome1 = $_GET['nome1'];
$nome2 = $_GET['nome2'];

if(strcmp($resultado, "vazio") != 0){
    if(strcmp($resultado, "a") == 0){
       echo("                    <td>Casal ".$nome1." e ".$nome2."</td>\n");
       echo("                    <tr><td>Uau! Com certeza voces formarao um lindo casal!</td></tr>\n");
    }
    if(strcmp($resultado, "m") == 0){
       echo("                    <td>Casal ".$nome1." e ".$nome2."</td>\n");
       echo("                    <tr><td>Hum...Ha chances de rolar algo, mas nao acredite muito nisso.</td></tr>\n");
    }
    if(strcmp($resultado, "b") == 0){
       echo("                    <td>Casal ".$nome1." e ".$nome2."</td>\n");
       echo("                    <tr><td>Xiii...Conselho: procure por outro(a).</td></tr>\n");
    }
}

/*Fim da tabela interna*/
echo("                         </tr>\n");
echo("                    </table>\n");

Após isso, salve tudo, selecione dois nomes na tela e clicle no botão "Resultado", a tela que aparecerá será:

O que falta agora é a verificação via javascript. Repare que se a pessoa não selecionar nenhum nome, o botão "Resultado" irá funcionar. Então, vamos fazer uma verificação de que a pessoa precisa selecionar 2 nomes (um de cada fileira) para poder clicar no botão.

Em ferramenta.php vamos colocar a indicação de que um código javascript será adicionado:

echo("<script type=\"text/javascript\">\n\n");
echo("    function Iniciar(){}\n");
echo("</script>\n\n");

Agora vamos criar duas funções em javascript, uma chamada checkNome() que verifica se algum nome foi clicado, e outra chamada validaFormulario() que se caso apenas um ou nenhum nome for selecionado, aparece um aviso para o usuário. Essas funções serão colocadas antes de echo("</script>\n\n");

Função checkNome():

echo("      function checkNome(){\n");
echo("            var cont1 = 0;\n");
echo("            var cont2 = 0;\n");
echo("            var objRadio1 = document.forms[0].elements['r_m'];  \n");
echo("            var objRadio2 = document.forms[0].elements['r_h'];  \n");
echo("            for(var i = 0; i < objRadio1.length; i++){         \n");
echo("                if(objRadio1[i].checked == true){     \n");
echo("                    cont1++;            \n");
echo("                }                    \n");
echo("            }                        \n");
echo("            for(var j = 0; j < objRadio2.length; j++){     \n");
echo("                if(objRadio2[j].checked == true){     \n");
echo("                    cont2++;            \n");
echo("                }                    \n");
echo("            }                        \n");
echo("            if(cont1 > 0 && cont2 > 0){            \n");
echo("                return (true)                            \n");
echo("            }                        \n");
echo("            else{                        \n");
echo("                return (false);                 \n");
echo("            }                        \n");
echo("      }                                                         \n\n");

Função validaFormulario():

echo("      function validaFormulario(){                            \n");
echo("            if(!checkNome()){                                     \n");
echo("                alert('Selecione um nome de cada coluna');    \n");
echo("                return(false);                                    \n");
echo("            }                                                    \n");
echo("            else{                                                \n");
echo("                return(true);    \n");
echo("            }                                                    \n");
echo("      }\n\n                                                      ");

Agora, quando criamos o botão "Resultado" temos que indicar que quando for clicado, deve fazer a verificação, entâo temos:

echo("                            <input class=\"input\" type=\"submit\" name=\"resultado\" value=\""."Resultado"."\" onclick=return(validaFormulario(document.formCompor)) />\n");

Caso o usuário não clique em nenhum nome, um pop-up deve aparecer:

2ª fase:

Nesta fase, temos os seguintes requisitos:
- Todo resultado será guardado no banco de dados;
- um histórico de resultados deve ser mostrado;
- adicionar feedback à página de resultados.

Antes, os resultados não eram guardados em lugar nenhum, apenas havia uma página que mostrava o resultado e pronto, não tinha mais como recuperar esse resultado. Então, vamos guardar os resultados gerados no banco de dados. Para isso, vamos precisar criar uma nova tabela no banco de dados.

Depois de entrar em phpMyAdmin, clique no banco de dados do curso e vá ao fim da página, lá tem uma parte escrito "Create new table on database <nome_banco_dados>". Para essa ferramenta, criou-se a tabela Relacionamento_historico com 5 campos (cod_relacionamento - chave primária, data, nome1, nome2 e resultado).

Após criarmos a tabela, vamos fazer uma função no arquivo ferramenta.inc que inclui dados no banco de dados.
Então temos:

function incluirHistorico($sock, $nome1, $nome2, $resultado)
{
      $data = date("d/m/Y H:i:s "); 

    $consulta="insert into Relacionamento_historico (data, nome1, nome2, resultado) values ('".VerificaStringQuery(htmlentities($data))."', '".VerificaStringQuery(htmlentities($nome1))."', '".VerificaStringQuery(htmlentities($nome2))."', '".VerificaStringQuery(htmlentities($resultado))."')";
      $res=Enviar($sock, $consulta);

      return($cod_relacionamento);
}

Essa função tem que ser chamada quando o usuário clica no botão "Resultado". Então, temos que alterar o arquivo acoes.php:

if($acao == 'Resultado'){

    $cod_curso = $_POST["cod_curso"];
    $id_m = $_POST['r_m'];
    $id_h = $_POST['r_h'];

    $lista_m = setListaNomes(1);
    $lista_h = setListaNomes(2);

    $sock = Conectar($cod_curso);

    if($id_m > -1 && $id_m < 8 && $id_h > -1 && $id_h < 8){
        if(strlen($lista_m[$id_m]) > 0 && strlen($lista_h[$id_h]) > 0){

            $resultado = grauRelacionamento($lista_m[$id_m], $lista_h[$id_h]);

            $cod_relacionamento = incluirHistorico($sock, $lista_m[$id_m], $lista_h[$id_h], $resultado);

              if($cod_relacionamento == -1){
                Desconectar($sock);
                  header("Location:novaferramenta.php?cod_curso=".$cod_curso);
                  exit();
              } 

              Desconectar($sock);

            header("Location: resultado.php?cod_curso=".$cod_curso."&resultado=".$resultado."&nome1=".$lista_m[$id_m]."&nome2=".$lista_h[$id_h]."&acao=".$acao."&atualizacao=true");
        }
    }
}

Como a tabela Relacionamento_historico foi criada como auto_increment então ao incluir algo no histórico, é devolvido a nova chave primária cod_relacionamento. Caso ela devolva -1, quer dizer que não foi possível incluir os dados na tabela.
Pronto, agora teste e olhe se na tabela foi adicionado algo.

Agora precisamos fazer um histórico. Para isso, será necessária uma função que retorne os dados do banco de dados para serem mostrados na página historico.php
No arquivo ferramenta.inc vamos incluir a função:

function retornaDadosHistorico($sock)
{
  $consulta="select * from Relacionamento_historico order by data desc";
  $res=Enviar($sock, $consulta);
  $lista=RetornaArrayLinhas($res);
  return($lista);
}

Nessa consulta temos select * que quer dizer que todos os dados da tabela Relacionamento_historico serão retornados.

Agora, vamos montar a página historico.php. Assim como as outras páginas, criamos uma tabela externa e uma interna. Dentro dessa tabela interna, vamos criar uma tabela que terá três colunas: data, casal e resultado. Os dados guardados no banco de dados serão mostrados nessa tabela:

$sock=Conectar($cod_curso);

$dados = retornaDadosHistorico($sock);

/*Definindo a tabela interna*/
echo("                    <table id=\"tabelaInterna\" cellpadding=\"0\" cellspacing=\"0\" class=\"tabInterna\">\n");
echo("                          <tr class=\"head\">\n");
echo("                            <td class=\"alLeft\" width=\"20%\">"."Data"."</td>\n");
echo("                            <td width=\"30%\">"."Casal"."</td>\n");
echo("                            <td width=\"40%\">"."Resultado"."</td>\n");
echo("                        </tr>\n");

foreach($dados as $linha){
    echo("                          <tr id=\"tr_".$linha['cod_relacionamento']."\">\n");
    echo("                                <td>".$linha['data']."</td>\n");
    echo("                                <td>".$linha['nome1']." e ".$linha['nome2']."</td>\n");
    if($linha['resultado'] == "a"){
        echo("                                <td>"."Uau! Com certeza voces formarao um lindo casal!"."</td>\n");    
    }
    if($linha['resultado'] == "m"){
        echo("                                <td>"."Hum...Ha chances de rolar algo, mas nao acredite muito nisso."."</td>\n");    
    }
    if($linha['resultado'] == "b"){
        echo("                                <td>"."Xiii...Conselho: procure por outro(a)."."</td>\n");    
    }
    echo("                            </tr>\n");
}

/*Fim da tabela interna*/
echo("                         </tr>\n");
echo("                    </table>\n");

Temos que colocar um botão "Novo teste" para o usuário poder fazer um outro teste. Depois da criação da tabela externa e antes da criação da tabela interna, vamos colocar o seguinte código:

echo("                <td valign=\"top\">\n");

/*botao 'Novo teste'*/
echo("                        <ul class=\"btAuxTabs\">\n");
echo("                          <li><a href='novaferramenta.php?cod_curso=".$cod_curso."'>"."Novo teste"."</a></li>\n");
echo("                        </ul>\n");
echo("                </td>\n");

Agora, em ferramenta.php vamos criar um botão "Novo teste" e "Histórico" que seguem o mesmo padrão do botão "Novo teste" anterior. Então, após a definição da tabela externa, colocamos:

echo("                <td valign=\"top\">\n");

/*botoes 'novo teste' e 'historico'*/
echo("                        <ul class=\"btAuxTabs\">\n");
echo("                          <li><a href='novaferramenta.php?cod_curso=".$cod_curso."'>"."Novo teste"."</a></li>\n");
echo("                          <li><a href='historico.php?cod_curso=".$cod_curso."'>"."Historico"."</a></li>\n");
echo("                        </ul>\n");
echo("                </td>\n");

As imagens abaixo referem-se a ferramenta.php e historico.php respectivamente após as mudanças acima:

Agora só faltam dois botões em resultado.php. Da mesma maneira que os outros, após a criação da tabela externa, colocamos:

echo("                <td valign=\"top\">\n");

/*botoes 'voltar' e 'historico'*/
echo("                        <ul class=\"btAuxTabs\">\n");
echo("                          <li><a href='novaferramenta.php?cod_curso=".$cod_curso."'>"."Voltar"."</a></li>\n");
echo("                          <li><a href='historico.php?cod_curso=".$cod_curso."'>"."Historico"."</a></li>\n");
echo("                        </ul>\n");
echo("                </td>\n");

Pronto. A última parte dessa fase é colocar o feedback.
Em phpMyAdmin, vá até o banco principal, e procure a tabela "Lingua_textos", adicione com o código da sua ferramenta o texto que deseja aparecer quando o usuário clicar em "Resultado". O texto aqui escolhido foi "Resultado submetido com sucesso".
Agora em resultado.php vamos colocar

// instanciar o objeto, passa a lista de frases por parametro
$feedbackObject =  new FeedbackObject($lista_frases);

//adicionar as acoes possiveis (1o parametro), passar o id da frase a ser exibida (nesse caso 213)
$feedbackObject->addAction("Resultado", 213, 0);

echo("<script type=\"text/javascript\">\n\n");
echo("    function Iniciar(){\n");
            $feedbackObject->returnFeedback($_GET['acao'], $_GET['atualizacao']);
echo("    }");
echo("</script>\n\n");

Pronto, assim que o usuário clicar em "Resultado" a frase terá que aparecer na parte de cima da tela:

3ª fase:

Agora, as informações serão trazidas do banco de dados, ou seja:
  • Pegar os nomes dos alunos do curso
  • Critério para resultado agora será o número de mensagens que as duas pessoas trocaram através do correio

Cadastre em seu curso alguns alunos. Aqui, foram feitos 6 cadastros: Aluno1, Aluno2, Aluno3, Aluno4, Aluno5 e Aluno6. Depois, envie alguns e-mails entre eles, para podermos comparar depois e dar um resultado a partir do número de e-mails.

Em ferramenta.inc vamos criar algumas funções, uma que pega os nomes dos alunos no banco de dados, outra que pega os dados dos e-mails e outra que conta quantos e-mails foram trocados por cada usuário. Vamos alterar também as funções setNomeDados() e grauRelacionamento():

function RetornaNomeUsuario($sock, $cod_usuario)
{
  $consulta="select nome from Usuario where cod_usuario=".$cod_usuario;

  $res=Enviar($sock, $consulta);

  $linha=RetornaLinha($res);

  return($linha);
}
function setListaNomes($sock, $tam){
    $lista_nomes;
    for($i = 0; $i < $tam; $i++){
        $lista_nomes[$i+2] = RetornaNomeUsuario($sock, ($i+2));
    }

    return $lista_nomes;
}
function RetornaDadosEmails($sock)
{
  $consulta="select * from Correio_lista_destinos";

  $res=Enviar($sock, $consulta);

  $lista=RetornaArrayLinhas($res);

  return($lista);
}
/*Funcao que cria uma matriz para contar o numero de e-mails trocados entre os usuarios
* $lista: lista com os campos da tabela Correio_lista_destinos*/
function numeroEmails($lista, $tam){
    $matriz1 = array($tam);

    for($i = 0; $i < $tam; $i++){
        $matriz1[$i] = array($tam);
    }

    for($i = 0; $i < $tam; $i++){
        for($j = 0; $j < $tam; $j++){    
            $matriz1[$i][$j] = 0;
        }
    }

    foreach($lista as $value){
        $x = $value['cod_usuario_emissor'];
        $y = $value['cod_destino'];            

        $matriz1[$x][$y]++;

    }

    return $matriz1;
}
/*Nova funcao de verificar o grau de relacionamento
* Entrada: numero de e-mails trocados entre dois usuarios
* Saida: grau do relacionamento*/
function grauRelacionamento($num1, $num2){
    $g_alto = "a";
    $g_medio = "m";
    $g_baixo = "b";
    $soma = $num1 + $num2;
    if(0 <= $soma && $soma < 4){
        return $g_baixo;        
    }
    elseif(4 <= $soma && $soma < 6){
        return $g_medio;    
    }
    else{
        return $g_alto;
    }
}

Vamos alterar o arquivo ferramenta.php para receber os novos nomes e para mostrá-los:

Nova lista de nomes:

include("novaferramenta.inc");
$sock=Conectar("");

$cod_ferramenta = 31;
$tamanho = RetornaProximoCodigoUsuarioCurso($sock, $cod_curso) - 1;
$lista_nomes = setListaNomes($sock, $tamanho);
Desconectar($sock);

Mostra os nomes com os radio buttons:

$j = 2;
$l = 0;
for ($i = 0; $i <= strlen($lista_nomes)/2; $i++){
    echo("                        <tr>\n");
    //$j = $j+2;
    $l = $j+1;
    echo("                          <td width=\"5%\" align=\"center\"><input type=\"radio\" name=\"r_m\" id=\"r_m\" value=\"$l\"/></td><td class=\"alLeft\" width=\"20%\" >".$lista_nomes[$l]['nome']."</td>\n");
    echo("                          <td width=\"5%\" align=\"center\"><input type=\"radio\" name=\"r_h\" id=\"r_h\" value=\"$j\"/></td><td class=\"alLeft\" width=\"20%\" >".$lista_nomes[$j]['nome']."</td>\n");
    echo("                        </tr>\n");
    $j = $j + 2;
}

Observação: foram criadas as variáveis $j e $l para deixarmos o "value" do radio button com o mesmo valor do cod_usuario da tabela no banco de dados.

Agora vamos mudar acoes.php para processar essas novas mudanças:

if($acao == 'Resultado'){

    $cod_curso = $_POST["cod_curso"];
    $id_m = $_POST['r_m'];
    $id_h = $_POST['r_h'];

    $sock = Conectar("");
    $tamanho = RetornaProximoCodigoUsuarioCurso($sock, $cod_curso);

    $lista_m = setListaNomes($sock, 1, $tamanho);

    Desconectar($sock);

    $sock = Conectar($cod_curso);

    $lista = RetornaDadosEmails($sock);

    $matriz1 = numeroEmails($lista, $tamanho);

    if($id_m > -1 && $id_m < 8 && $id_h > -1 && $id_h < 8){
        if(strlen($lista_m[$id_m]) > 0 && strlen($lista_m[$id_h]) > 0){

            $x = $matriz1[$id_m][$id_h];
            $y = $matriz1[$id_h][$id_m];

            $resultado = grauRelacionamento($x, $y);

            $cod_relacionamento = incluirHistorico($sock, $lista_m[$id_m]['nome'], $lista_m[$id_h]['nome'], $resultado);

              if($cod_relacionamento == -1){
                Desconectar($sock);
                  header("Location:novaferramenta.php?cod_curso=".$cod_curso);
                  exit();
              } 

              Desconectar($sock);
            header("Location: resultado.php?cod_curso=".$cod_curso."&resultado=".$resultado."&nome1=".$lista_m[$id_m]['nome']."&nome2=".$lista_m[$id_h]['nome']."&acao=".$acao."&atualizacao=true");
        }
    }
}

Pronto, agora basta salvar tudo e verificar as alterações:

4ª fase:

Nesta nossa última fase temos que usar o ajax. Requisitos:
- O resultado deve ser exibido na mesma página e processado de forma assincrona.
- O feedback deve ser chamado através do ajax.

Agora vamos tirar o botão "Resultado" e quando o usuário clicar no segundo nome (algum nome da fileira da direita) aparece um feedback dizendo o resultado do teste. Portanto, não teremos mais a página resultado.php.

Com o ajax, o que ocorre é que em vez de termos uma página intermediária acoes.php, chamamos o ajax e sumimos com acoes.php. Dessa forma, o processo é agilizado e não há tanto redirecionamento de páginas.

Vamos fazer a função de gerar resultado para o ajax, no ferramenta.inc colocamos:

function retornaFrase2($grau){
    if($grau == "a"){
        return "Uau! Com certeza voces formarao um lindo casal!";
    }
    else if($grau == "m"){
        return "Hum...Ha chances de rolar algo, mas nao acredite muito nisso.";
    }
    else
        return "Xiii...Conselho: procure por outro(a).";
}
/*Função por causa do Ajax*/
function ObterResultadoDinamic($cod_curso, $id_m, $id_h){

    $objResponse = new xajaxResponse();

    $sock = Conectar("");
    $tamanho = RetornaProximoCodigoUsuarioCurso($sock, $cod_curso);

    $lista_m = setListaNomes($sock, 1, $tamanho);

    Desconectar($sock);

    $sock = Conectar($cod_curso);

    $lista = RetornaDadosEmails($sock);

    $matriz1 = numeroEmails($lista, $tamanho);

    if($id_m > -1 && $id_m < 8 && $id_h > -1 && $id_h < 8){
        if(strlen($lista_m[$id_m]) > 0 && strlen($lista_m[$id_h]) > 0){

            $x = $matriz1[$id_m][$id_h];
            $y = $matriz1[$id_h][$id_m];

            $resultado = grauRelacionamento($x, $y);

            $cod_relacionamento = incluirHistorico($sock, $lista_m[$id_m]['nome'], $lista_m[$id_h]['nome'], $resultado);

              if($cod_relacionamento == -1){
                Desconectar($sock);
                  $objResponse->call("mostraFeedback", "Nao foi possivel fazer o teste", 'false');
                  exit();
              } 

              Desconectar($sock);
              $texto = retornaFrase2($resultado);
            $objResponse->call("mostraFeedback", $texto, 'true');
        }

        return $objResponse;
    }    
}

Em ferramenta.php vamos incluir a biblioteca ajax e criar um objeto do tipo xajax:

  require_once("../xajax_05/xajax_core/xajax.inc.php");

  // Estancia o objeto XAJAX
  $objMaterial = new xajax();

  $objMaterial->configure("characterEncoding", 'ISO-8859-1');
  $objMaterial->configure('javascript URI', "../xajax_0.5");
  $objMaterial->registerFunction("ObterResultadoDinamic");
  $objMaterial->processRequests();

  include("../topo_tela.php");

  $objMaterial->printJavascript();

No formulário que é criado antes dos radio buttons, vamos tirar o action:

echo("                        <form id=\"formCompor\" name=\"formCompor\" action=\"\" method=\"post\" />\n");

E vamos tirar também a div que criava o botão "Resultado" e enviava as variáveis $acao e $cod_curso.

Vamos alterar a criação da coluna da direita de radio buttons para quando o usuário clicar em algum nome da coluna direita, aparecer o resultado se algum nome da fileira da esquerda já estiver selecionado, ou aparecer um aviso de que um nome da coluna da esquerda tem que estar selecionado:

for ($i = 0; $i <= strlen($lista_nomes_m)/2; $i++){
    echo("                        <tr>\n");
    //$j = $j+2;
    $l = $j+1;
    echo("                          <td width=\"5%\" align=\"center\"><input type=\"radio\" name=\"r_m\" id=\"r_m\" value=\"$l\"/></td><td class=\"alLeft\" width=\"20%\" >".$lista_nomes_m[$l]['nome']."</td>\n");
    echo("                          <td width=\"5%\" align=\"center\"><input type=\"radio\" name=\"r_h\" id=\"r_h\" value=\"$j\" onclick =return(checkNome()) /></td><td class=\"alLeft\" width=\"20%\" >".$lista_nomes_m[$j]['nome']."</td>\n");
    echo("                        </tr>\n");
    $j = $j + 2;
}

Repare que foi adicionado onclick = return(checkNome()). Então, precisamos alterar a nossa função de javascript para validação. Vamos tirar a função validaFormulario() e alterar a função checkNome():

echo("      function checkNome(){\n");
echo("            var cont1 = 0;\n");
echo("            var cont2 = 0;\n");
echo("            var radioChecado1 = 0;                                \n");
echo("            var radioChecado2 = 0;                                \n");
echo("            var objRadio1 = document.forms[0].elements['r_m'];  \n");
echo("            var objRadio2 = document.forms[0].elements['r_h'];  \n");
echo("            for(var i = 0; i < objRadio1.length; i++){             \n");
echo("                if(objRadio1[i].checked == true){                 \n");
echo("                    radioChecado1 = objRadio1[i].value             \n");
echo("                    cont1++;                                    \n");
echo("                }                                                \n");
echo("            }                                                    \n");
echo("            for(var j = 0; j < objRadio2.length; j++){             \n");
echo("                if(objRadio2[j].checked == true){                 \n");
echo("                    radioChecado2 = objRadio2[j].value             \n");
echo("                    cont2++;                                    \n");
echo("                }                                                \n");
echo("            }                                                    \n");
echo("            if(cont1 > 0 && cont2 > 0){                            \n");
echo("                xajax_ObterResultadoDinamic(".$cod_curso.", radioChecado1, radioChecado2)    \n");
echo("            }                                                    \n");
echo("            else{                                                \n");
echo("                alert('Selecionar um nome da coluna direita');    \n");
echo("                for(var j = 0; j < objRadio2.length; j++){         \n");
echo("                    if(objRadio2[j].checked == true){             \n");
echo("                        objRadio2[j].checked = false             \n");
echo("                        cont2++;                                \n");
echo("                    }                                            \n");
echo("                }                                                \n");
echo("                return (false);                                     \n");
echo("            }                                                    \n");
echo("      }\n\n                                                      ");

Pronto, agora quando o usuário escolhe dois nomes a seguinte tela deve aparecer:

Caso o usuário escolha apenas um nome da coluna direita, a seguinte tela deve aparecer:

Pronto! Sua nova ferramenta está pronta! =)

novaferramenta1.png (40,264 KB) Caroline Letizio, 11/05/2010 10:05

novaferramenta2.png (14,28 KB) Caroline Letizio, 11/05/2010 10:34

novaferramenta3.png (8,748 KB) Caroline Letizio, 11/05/2010 11:16

novaferramenta4.png (24,083 KB) Caroline Letizio, 11/05/2010 11:36

novaferramenta5.png (12,744 KB) Caroline Letizio, 13/05/2010 14:21

novaferramenta6.png (17,792 KB) Caroline Letizio, 13/05/2010 14:21

novaferramenta7.png (10,971 KB) Caroline Letizio, 13/05/2010 14:43

novaferramenta8.png (8,432 KB) Caroline Letizio, 13/05/2010 17:11

novaferramenta9.png (13,383 KB) Caroline Letizio, 14/05/2010 09:37

novaferramenta10.png (20,399 KB) Caroline Letizio, 14/05/2010 09:41