Larback - Retornando conhecimento

Confiança é aquele sentimento que você tem antes de compreender a situação

Agenda Web - Parte 5 - Alterando contatos

O processo de edição divide-se em duas etapas:
Primeiro, precisamos carregar os dados já existentes;
Depois, precisamos salvar os dados alterados

Para isso, a classe Contatos será alterada. Acrescentaremos dois métodos. O primeiro, retorna um contato específico. O segundo, salva as alterações no banco de dados. O arquivo Contato.class.php está abaixo:

[CONTATO.CLASS.PHP]
<?php
class Contato {
  const USUARIO = "root";
  const SENHA = "SENHA_DO_ROOT";
  public function conectar() {
    $con = new PDO("mysql:host=localhost;dbname=agenda", self::USUARIO,self::SENHA);
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $con;
  }
  public function alterar($codigo, $nome, $email, $telefone){
	  $con = $this->conectar();
	  $stm = $con->prepare("update contatos set nome=?, email=?, telefone=? where codigo=?");
	  $stm->bindValue(1,$nome);
	  $stm->bindValue(2,$email);
	  $stm->bindValue(3,$telefone);
	  $stm->bindValue(4,$codigo);
	  $stm->execute();
  }
  public function getContatoByCodigo($codigo) {
	  $con = $this->conectar();
	  $stm = $con->prepare("select * from contatos where codigo=?");
	  $stm->bindValue(1,$codigo);
	  $stm->execute();
	  return $stm->fetch(PDO::FETCH_ASSOC);
  }
  public function excluir($codigo){
	$con = $this->conectar();
	$stm = $con->prepare("delete from contatos where codigo=?");
	$stm->bindValue(1,$codigo);
	$stm->execute();
  }
  
  
  public function novo($nome,$email,$telefone,$responsavel){
    $con = $this->conectar();
    $stm = $con->prepare("insert into contatos (nome,email,telefone,responsavel) values (?,?,?,?)");
    $stm->bindParam(1,$nome);
    $stm->bindParam(2,$email);
    $stm->bindParam(3,$telefone);
    $stm->bindParam(4,$responsavel);
    $stm->execute();
  }
  
  
  public function getContatos() {
	  $con = $this->conectar();
	  $stm = $con->prepare("select * from contatos");
	  $stm->execute();
	  return $stm->fetchAll(PDO::FETCH_ASSOC);
  }
  public function getContatosByResponsavel($responsavel) {
	  $con = $this->conectar();
	  $stm = $con->prepare("select * from contatos 
										where responsavel=?");
	  $stm->bindParam(1,$responsavel);
	  $stm->execute();
	  return $stm->fetchAll(PDO::FETCH_ASSOC);
  }
}
?>



Precisamos criar um formulário para exibir os dados atualmente cadastrados. Este novo formulário será nomeado como editarContato.inc.php
EDITARCONTATO.INC.PHP
<?php
session_start();
if (!$_SESSION['autenticado']){
  include_once "index.php";
  exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
include_once "Contato.class.php";
$c = new Contato();
$contato = $c->getContatoByCodigo($_GET['c']);
?>
<form class="form-horizontal" action="principal.php?q=7b" method="post">
<fieldset>

<!-- Form Name -->
<legend>Editar Contato</legend>

<div class="form-group">
  <label class="col-md-4 control-label" for="nome">C&oacute;digo</label>  
  <div class="col-md-5">
  <input id="codigo" name="codigo" value="<?=$contato['codigo'];?>"
  class="form-control input-md" required type="text" readonly>
    
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-md-4 control-label" for="nome">Nome</label>  
  <div class="col-md-5">
  <input id="nome" name="nome" value="<?=$contato['nome'];?>" 
  class="form-control input-md" required type="text">
    
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-md-4 control-label" for="telefone">Telefone</label>  
  <div class="col-md-4">
  <input id="telefone" name="telefone" value="<?=$contato['telefone'];?>" class="form-control input-md" required type="text">
    
  </div>
</div>

<!-- Text input-->
<div class="form-group">
  <label class="col-md-4 control-label" for="email">Email</label>  
  <div class="col-md-4">
  <input id="email" name="email" value="<?=$contato['email'];?>" class="form-control input-md" required type="text">
    
  </div>
</div>

<!-- Button (Double) -->
<div class="form-group">
  <label class="col-md-4 control-label" for="salvar"></label>
  <div class="col-md-8">
    <button id="salvar" name="salvar" class="btn btn-success" type="submit"  >&nbsp;Salvar&nbsp;</button>
    <a href="principal.php" id="cancelar" name="cancelar" class="btn btn-danger">Cancelar</a>
  </div>
</div>

</fieldset>
</form>



A página de listagem tem que ser alterada para incluir o link para a edição
LISTA_CONTATOS.INC.PHP
<?php
session_start();
if (!$_SESSION['autenticado']){
  include_once "index.php";
  exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
include_once "Contato.class.php";
$contato = new Contato();
try {
	if (!isset($_GET['r']))
		$dados = $contato->getContatos();
	else
		$dados = $contato->getContatosByResponsavel($_GET['r']);
	?>
	  <table class="table table-striped">
    <thead>
      <tr>
        <th>Nome</th>
        <th>E-mail</th>
        <th>Telefone</th>
        <th>Responsável</th>
      </tr>
    </thead>
    <tbody>
    <?php
	foreach($dados as $dado){
	?>
		<tr>
			<td><?=$dado['nome'];?></td>
			<td><?=$dado['email'];?></td>
			<td><?=$dado['telefone'];?></td>
			<td><a href="?q=2&r=<?=$dado['responsavel'];?>"><?=$dado['responsavel'];?></td>
			
			<td><a href="?q=7&c=<?=$dado['codigo'];?>" title="Editar">
			<span class="glyphicon glyphicon-edit"></span></td>
			
			<td><a href="?q=6&c=<?=$dado['codigo'];?>" title="Excluir">
			<span class="glyphicon glyphicon-trash"></span></td>
		</tr>
	<?php
	}
	
	?> 
		<tfoot>
			<tr>
				<td colspan="4"><?=count($dados);?> contatos cadastrados.</td>
			</tr>
		</tfoot>
    </tbody>
  </table>
	<?php
	
}catch (PDOException $p) {
	exit("Ocorreu um erro ao tentar exibir os contatos. <br>-->" .$p->getMessage());
}

?>



Por último, a página principal.php recebe um novo case onde executa o método que salva as alterações no banco de dados.
PRINCIPAL.PHP
<?php
session_start();
//error_reporting(0);

?>
<!doctype html>
<html lang="pt-br">
<head>
<meta charset="utf-8">

 <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<title>Agenda Web</title>

</head>

<body>
<?php

if (!$_SESSION['autenticado']){
  include_once "index.php";
  exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
?>
<div class="container">    
        <div id="loginbox" style="margin-top:50px;" class="mainbox">                    
            <div class="panel panel-info" >
                    <div class="panel-heading">
                        <div class="panel-title">Agenda Web - Bem vindo <b><?=$_SESSION['usuario'];?></b></div>
                        
                        <div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="logout.php"> Sair </a></div>
                    </div>     
            </div>
            
              <!-- Menu dropdown com bootstrap -->
              <div class="dropdown">
              <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">A&ccedil;&otilde;es
              <span class="caret"></span></button>
              <ul class="dropdown-menu">
                    <li><a href="?q=1">Cadastrar Contato</a></li>
                    <li><a href="?q=2">Visualizar Contatos</a></li>
                    <li><a href="#">Localizar</a></li>
              </ul>
              </div>

<?php
  if (isset($_GET['q'])){
    switch($_GET['q']) {
      case '1':
        include_once 'novoContato.inc.php';
        break;
      case '1b':
        include_once 'Contato.class.php';
        $contato = new Contato();
        try {
          $contato->novo($_POST['nome'],$_POST['email'],$_POST['telefone'],$_SESSION['usuario']);
          echo "<br /><br /><div class='alert alert-success col-sm-12'>Contato salvo com sucesso.</div>";
        } catch(PDOException $p) {
          echo "Ocorreu um erro inesperado: ". $p->getMessage();
        }
        break;
      case '2':
		include_once 'lista_contatos.inc.php';
		break;
		
	  case '6':
		include_once 'Contato.class.php';
		try{
			$contato = new Contato();
			$contato->excluir($_GET['c']);
			echo "<br /><br /><div class='alert alert-success col-sm-12'>Contato removido com sucesso.</div>";
			include_once 'lista_contatos.inc.php';
		} catch(PDOException $p){
			echo "<div class='alert alert-danger'>Ocorreu um erro inesperado. Favor tentar novamente em alguns segundos. Se o erro persistir, entre em contato com conosco.</div>";
		}
		break;
	  case '7':
		include_once 'editarContato.inc.php';
		break;
	  case '7b':
		include_once 'Contato.class.php';
		try{
			$c = new Contato();
			$c->alterar($_POST['codigo'],$_POST['nome'],$_POST['email'],$_POST['telefone']);
			echo "<div class='alert alert-success'>Alterações salvas com sucesso.</div>";
			include_once 'lista_contatos.inc.php';
		} catch(PDOException $p){
			echo "<div class='alert alert-danger'>Ocorreu um erro inesperado.</div>";
		}
		break;
    }
  } else {
    ?>
         <div style="font-size:60px;color:white;text-shadow: 2px -5px 3px skyblue;margin:0 auto;width:50%">Agenda WEB 1.0</div> 
    <?php
  }      
?>
            
            
            
        </div>
</div>
</body>
</html>

Em anexo, o projeto atualizado.


Bons estudos.

Baixar arquivos anexos