quarta-feira, 17 de julho de 2013

Script padrão para bancos de dados Mysql em linguagem PHP - XII

A ação Edit

Todos os registros da tabela do banco de dados podem ser alterados. Difícil é trazê-los transformando cada campo para exibição em uma forma editável, invertendo para gravação em certos casos (data e senha). E, posteriormente, é necessária uma nova transformação para gravação.

Código:

 case "edit":
   // Verifica permissão para a operação
   if( $permiteEdit ){
     $operation = $operEdit;
     $description = $descEdit;
     require("libCabecalhoPadrao.php");
     include 'Conexao_banco.php';
     // Obtém um registro
     $result = mysqli_query($conn, "select * from " . $tabela . " WHERE Id = " . $_GET['Id'] );
     if( $row = mysqli_fetch_array($result) ){
     ?>
     <h2 class=tit>EDITAR</h2>
     <h5 class=help>Altere os conteúdos. Os campos de senha precisam da checagem caso sejam 
alterados.</h5>
     <?php
openQuadro();
echo "<form method=post action=?action=editsave&Id=" . $_GET['Id'] . "&estilo=" . 

$_GET['estilo'] . ">";
echo "<table border=0 cellspacing=0>";
// Loop no esquema da estrutura de dados
for($x=0;$x<$NoCampos;$x++){
 $tipo = strtolower($arr[$x][4]);
 $sTipo = "";
 $inp = "<input";
 echo "<tr>";
 echo "<td><label>" . $arr[$x][1] . "</label></td>";
 echo "<td>";
 $valor = $row[$arr[$x][0]];
 // Ajuste do tipo, valor, delimitador e tag do campo
 $pl = new paramLineOut($arr,$x,$valor);
 $inp = $pl->taginput;
 $valor = $pl->valorfinal;
 $sTipo = $pl->tipocampo;
 $deli = $pl->delimitador;
 echo $inp;
 echo " name=" . $arr[$x][0] . " id=" . $arr[$x][0];
 if ( strtolower($inp) == "<select" ) {
     echo ">";
     echo "<option value=" . $row[$arr[$x][0]] . ">" . $row[$arr[$x][0]];
     echo $arr[$x][6];
   } elseif ( strtolower($inp) == "<textarea" ) {
     echo " cols=" . $arr[$x][2] . " rows=" . number_format($arr[$x][3]/$arr[$x][2],0,'.','') 

. ">";
   } elseif ( strtolower($inp) == "<input" ){
     echo " type=" . $sTipo . " size=" . $arr[$x][2] ." maxlength=" . $arr[$x][3] . " value=" 

. $valor . ">";
   }
 if ( $sTipo == "password" ){
   echo "Alterada <input type=checkbox name=ck" . $arr[$x][0] . " id=ck" . $arr[$x][0] . ">";
   }
 if ( $inp == "<textarea" ) {
   echo $row[$arr[$x][0]] . "</textarea>";
   }
 if ( $inp == "<select" ) {
   echo "</select>";
   }
 echo "</td><td>";
 echo "<span class=msg>" . $arr[$x][7] . "</span>";
 echo "</td>";
 echo "</tr>";
 }
echo "<tr><td colspan=3 align=center><input class=post type=submit value=\"" . $btnEdit . 

"\"></td>";
echo "</table>";
echo "</form>";
closeQuadro();

     include 'Conexao_banco_close.php';
     } else {
     echo $msgPermissao;
     }
   break;

Verificação de autorização

// Verifica permissão para a operação
   if( $permiteEdit ){
               .
               .
               .
               } else {
      echo $msgPermissao;
      }
O código desta ação fica condicionado a uma verificação no parâmetro $permiteAdd, declarado no include ExemploDefinicao.inc. Se lá estiver declarado um valor "S" para este parâmetro, o restante da ação será permitido, senão será mostrada a mensagem $msgPermissao, também declarada no include de que falamos aqui.

Cabeçalho da ação

     $operation = $operEdit;
     $description = $descEdit;
     require("libCabecalhoPadrao.php");

Da mesma forma que na ação add, estas linhas de código desenham o cabeçalho da tela de operação de edição (edit).

As variáveis $operation e $description são parâmetros do HTML contido no include libCabecalhoPadrao.php, cujo código repetiremos aqui:
 <div class=h2><div class="btn b1"><?= $titulo ?> - <?= $operation ?></div></div>
  <div class=h3><div class="btn b2"><?= $description ?>&nbsp;[<?= $_SERVER['REMOTE_ADDR'] .'-' . $_SERVER['SERVER_ADDR'] ?>]
  <a class="btn" style="margin-left:50px;" href="?estilo=<?= $_GET['estilo'] ?>"><span class="btn a">TELA INICIAL</span></a>
  </div>
  </div>

O cabeçalho é feito à base de DIVs, pois são os containers mais flexíveis do HTML.

Leitura do registro a ser alterado

A URL (endereço http) formatado quando se clica na operação de edição contém, em um de seus parâmetros, o identificador (id) do registro.. Este precisa ser lido, porque, diferentemente da ação add, os campos do formulário deverão receber os conteúdos atuais do registro a ser editado. Para tal, é preciso providenciar a leitura do registro na tabela do banco de dados.

   include 'Conexao_banco.php';
   // Obtém um registro

   $result = mysqli_query($conn, "select * from " . $tabela . " WHERE Id = " . $_GET['Id'] );

É feita a conexão ao banco de dados utilizando códigos contidos no include "Conexao_banco.php". Em seguida é disparada uma query Select sobre a tabela em questão, procurando o registro cujo Identificador (Id) é o parâmetro Id contido na URL de chamada.

Quadro do formulário de Edição

     if( $row = mysqli_fetch_array($result) ){
     ?>
     <h2 class=tit>EDITAR</h2>
     <h5 class=help>Altere os conteúdos. Os campos de senha precisam da checagem caso sejam alterados.</h5>
     <?php

openQuadro();

O recordset ($result) com o registro (esperamos que seja só um, pois cada registro tem um id diferente do outro) é testado. Se realmente a operação devolver algum registro, a script iniciará o desenho (renderização tecnicamente falando) de um cabeçalho secundário para o formulário de edição.

Este é feito com as tags Header normais. Em seguida é chamada a rotina openQuadro, já descrita anteriormente.

Código Formulário de edição

echo "<form method=post action=?action=editsave&Id=" . $_GET['Id'] . "&estilo=" .  $_GET['estilo'] . ">";
echo "<table border=0 cellspacing=0>";
// Loop no esquema da estrutura de dados
for($x=0;$x<$NoCampos;$x++){
 $tipo = strtolower($arr[$x][4]);
 $sTipo = "";
 $inp = "<input";
 echo "<tr>";
 echo "<td><label>" . $arr[$x][1] . "</label></td>";
 echo "<td>";
 $valor = $row[$arr[$x][0]];
 // Ajuste do tipo, valor, delimitador e tag do campo
 $pl = new paramLineOut($arr,$x,$valor);
 $inp = $pl->taginput;
 $valor = $pl->valorfinal;
 $sTipo = $pl->tipocampo;
 $deli = $pl->delimitador;
 echo $inp;
 echo " name=" . $arr[$x][0] . " id=" . $arr[$x][0];
 if ( strtolower($inp) == "<select" ) {
     echo ">";
     echo "<option value=" . $row[$arr[$x][0]] . ">" . $row[$arr[$x][0]];
     echo $arr[$x][6];
   } elseif ( strtolower($inp) == "<textarea" ) {
     echo " cols=" . $arr[$x][2] . " rows=" . number_format($arr[$x][3]/$arr[$x][2],0,'.','') 

. ">";
   } elseif ( strtolower($inp) == "<input" ){
     echo " type=" . $sTipo . " size=" . $arr[$x][2] ." maxlength=" . $arr[$x][3] . " value=" .  $valor . ">";
   }
 if ( $sTipo == "password" ){
   echo "Alterada <input type=checkbox name=ck" . $arr[$x][0] . " id=ck" . $arr[$x][0] . ">";
   }
 if ( $inp == "<textarea" ) {
   echo $row[$arr[$x][0]] . "</textarea>";
   }
 if ( $inp == "<select" ) {
   echo "</select>";
   }
 echo "</td><td>";
 echo "<span class=msg>" . $arr[$x][7] . "</span>";
 echo "</td>";
 echo "</tr>";
 }
echo "<tr><td colspan=3 align=center><input class=post type=submit value=\"" . $btnEdit . 

"\"></td>";
echo "</table>";
echo "</form>";
closeQuadro();


Início do formulário

echo "<form method=post action=?action=editsave&Id=" . $_GET['Id'] . "&estilo=" . 
$_GET['estilo'] . ">";
echo "<table border=0 cellspacing=0>";

A ação deste formulário direciona a script para a ação editsave, que vai gravar as alterações feitas no registro. E repare que o parâmetro Id tem que ser repassado para esta ação também, pois a identidade do registro não pode ser perdida.

Loop dos campos

// Loop no esquema da estrutura de dados
for($x=0;$x<$NoCampos;$x++){
 $tipo = strtolower($arr[$x][4]);
 $sTipo = "";
 $inp = "<input";
 echo "<tr>";
 echo "<td><label>" . $arr[$x][1] . "</label></td>";
 echo "<td>";

A leitura dos campos (SCHEMA) da tabela é feita de forma parecida com a que foi feita para a ação add. Estabelecemos um loop de 0 até o número de campos ($NoCampos) disponíveis.

Até aqui, é construído o Label do campo para exibição.

Ajustes do campo

Por razões parecidas com as da ação de inclusão, o campo precisa ter seu valor ajustado, e o delimitador regularizado, bem como o tipo de campo registrado. Isto é feito através da classe paramLineOut.

 $valor = $row[$arr[$x][0]];
 // Ajuste do tipo, valor, delimitador e tag do campo
 $pl = new paramLineOut($arr,$x,$valor);
 $inp = $pl->taginput;
 $valor = $pl->valorfinal;
 $sTipo = $pl->tipocampo;
 $deli = $pl->delimitador;

Construção do campo de entrada

 echo $inp;
 echo " name=" . $arr[$x][0] . " id=" . $arr[$x][0];
 if ( strtolower($inp) == "<select" ) {
     echo ">";
     echo "<option value=" . $row[$arr[$x][0]] . ">" . $row[$arr[$x][0]];
     echo $arr[$x][6];
   } elseif ( strtolower($inp) == "<textarea" ) {
     echo " cols=" . $arr[$x][2] . " rows=" . number_format($arr[$x][3]/$arr[$x][2],0,'.','') . ">";
   } elseif ( strtolower($inp) == "<input" ){
     echo " type=" . $sTipo . " size=" . $arr[$x][2] ." maxlength=" . $arr[$x][3] . " value=" . $valor . ">";
   }
 if ( $sTipo == "password" ){
   echo "Alterada <input type=checkbox name=ck" . $arr[$x][0] . " id=ck" . $arr[$x][0] . ">";
   }
 if ( $inp == "<textarea" ) {
   echo $row[$arr[$x][0]] . "</textarea>";
   }
 if ( $inp == "<select" ) {
   echo "</select>";
   }
 echo "</td><td>";

A classe paramLineOut devolveu, pelo seu parâmetro de saída taginput, a tag de HTML correta a ser usada.

Término da exibição do campo

 echo "<span class=msg>" . $arr[$x][7] . "</span>";
 echo "</td>";
 echo "</tr>";
 // Fechamento do loop
                  }

A última informação colocada para cada campo é o sétimo atributo, que contém alguma mensagem de auxílio no preenchimento do campo.

Botão submit

echo "<tr><td colspan=3 align=center><input class=post type=submit value=\"" . $btnEdit . "\"></td>";

Fechamento do formulário, do painel que o contém e do loop de campos

echo "</table>";
echo "</form>";
closeQuadro();
}

Conclusão da ação

     include 'Conexao_banco_close.php';
     } else {
     echo $msgPermissao;
     }
   break;

Fecha-se a conexão com o banco. Se não houver permissão para esta ação na template ExemploDefinicao.inc, é emitida uma mensagem de impossibilidade da ação ser completada.








Nenhum comentário:

Postar um comentário