Ir para conteúdo
Fórum Script Brasil
  • 0

Um roteador de classe


Frank K Hosaka

Pergunta

Eu comecei a estudar o PHP em 2020. Os meus códigos estavam bastante embaralhados, PHP aqui, HTML ali, e era difícil consertar o código.

Hoje eu sei um pouco sobre classe e imaginei se era possível criar um conjunto de funções sem o autoload e sem o roteador no PHP.

A resposta é sim, olha só que beleza:

arquivo classe.php
<?php
class Classe
{
	function roteador()
	{
		if(count($_GET))
		{
			$metodo=key($_GET);
			$parametro=$_GET[$metodo];
			return $this->$metodo($parametro);
		}
		if(count($_POST))
		{
			$metodo=key($_POST);
			$parametro=$_POST[$metodo];
			return $this->$metodo($parametro);
		}
	}
}
(new Classe)->roteador();

Se você não trabalha com a classe (programação orientada a objeto) não há porque instalar um roteador no PHP, mas nada impede de você trabalhar com a classe no meio dos códigos. Nesse caso, é a classe que vai precisar de um roteador para saber qual a função você precisa utilizar.

Vamos supor que exista uma função chamada inicio. Para chamá-lo, você pode usar header('location:classe.php?inicio). No caso acima, essa função não existe.

A seguir vou deixar uma lista de uma classe que não tem o suporte de um autoload e um roteador no index.php:

arquivo diario.php
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" 
	rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js">
</script>
<style>
  @media (min-width: 768px) { body {width: 50%; margin: auto} }
  @media (max-width: 767px) { body {width: 75%; margin: auto} }
  a {color:blue;text-decoration:none}
  a:hover {color:black;}
  form {margin:0}
  .inv {border:none;background:transparent;font-weight:600}
  .linha {line-height:0px}
  summary{list-style:none}
  td {white-space: nowrap}
</style>
<?php 
session_start();
$mysqli=new mysqli("localhost","root","","teste");
date_default_timezone_set('America/Sao_Paulo');
function dbr($date) 
{ 
    return date('d/m/y',strtotime($date));
}
function dec($value) 
{
    return ($value) ? number_format($value,2,',','.') : null;
}
function deca($num) 
{   
    $value=str_replace(".","",$num); 
    return str_replace(",",".",$value);
}

class Diario 
{
	function roteador()
	{
		if(count($_GET))
		{
			$metodo=key($_GET);
			$parametro=$_GET[$metodo];
			return $this->$metodo($parametro);
		}
		if(count($_POST))
		{
			$metodo=key($_POST);
			$parametro=$_POST[$metodo];
			return $this->$metodo($parametro);
		}
	}

	function inicio()
	{
		global $mysqli;
		$dia=(isset($_SESSION['dia'])) ? $_SESSION['dia'] : date('Y-m-d');
		$mensagem=(date('Y-m-d',strtotime($dia))<>date('Y-m-d')) ? " hoje é ".date('d/m/Y') : null;
		$lctos = json_decode(json_encode($mysqli->query("select * from tbdiario 
			where dia = '$dia' order by lcto, docto")->fetch_all(MYSQLI_ASSOC)));
		$somaDebito=$mysqli->query("select sum(case when contad>0 then valor else 0 end) as soma 
			from tbdiario where dia = '$dia'")->fetch_assoc()['soma'];
		$somaCredito=$mysqli->query("select sum(case when contac>0 then valor else 0 end) as soma 
			from tbdiario where dia = '$dia'")->fetch_assoc()['soma'];
		?>
		<table class='table table-striped'>
			<tr class=fw-semibold>
			<td colspan=5>
			<form method=post action=diario.php>
				<input type='submit'name=lancamento value='Lançamentos' size='8'> do dia 
				<input id=data type=date size=6 name=dia value=<?=$dia?> 
					onchange=submit()><?=$mensagem?>
			</form>
			<tr class=fw-semibold><td>Lcto<td>Ctad<td>Ctac<td class=text-end>Valor
			<td>
			<form method=post action=diario.php>
				<input name=historico onchange=submit() autocomplete=off 
					placeholder='Procurar no histórico'>
			</form>
			<?php foreach($lctos as $lcto): ?>
				<tr class=linha>
					<td><?=$lcto->lcto?>
					<td><?=$lcto->contad?>
					<td><?=$lcto->contac?>
					<td class=text-end><?=dec($lcto->valor)?>
					<td><?=$lcto->hist?>
			<?php endforeach; ?>
			<tr class=fw-semibold><td><td><td><td class=text-end><?=dec($somaDebito)?><td>
			<?php if($somaCredito!==$somaDebito): ?>
				<td class='text-end text-danger'><?=dec($somaCredito)?> Total de crédito
			<?php else: ?>
				</table></div>
			<?php endif;
	}

	function historico($hist)
	{
		global $mysqli;
		$historico = str_replace(' ','%',$hist);
		$lctos=json_decode(json_encode($mysqli->query("select *
			from tbdiario where hist like '%$historico%'")->fetch_all(MYSQLI_ASSOC)));
		?>
		Lançamentos com o histórico <?=$hist?>
		<table class='table table-striped linha'>
		<tr><th>Dia<th>Lçto<th>CtaD<th>CtaC<th>Valor<th>Histórico
		<?php foreach($lctos as $lcto): ?>
			<tr>
				<td><?=dbr($lcto->dia)?>
				<td><?=$lcto->lcto?></a>
				<td><?=$lcto->contad?>
				<td><?=$lcto->contac?>
				<td class=text-end><?=dec($lcto->valor)?>
				<td><?=$hist?>
		<?php endforeach; ?>
		</table>
		<?php
	}

	function registro()
	{
		global $mysqli;
		$dia=$_GET['registro'];
		$contad = empty($_GET['debito']) ? 'null' : $_GET['debito'];
		$contac = empty($_GET['credito']) ? 'null' : $_GET['credito'];
		$lcto=$_GET['lcto'];
		$valor= empty($_GET['valor']) ? 'null' : deca($_GET['valor']);
		$hist=$mysqli->real_escape_string($_GET['hist']);
		$mysqli->query("insert into tbdiario (lcto,dia,contad,contac,valor,hist) 
			values ($lcto,'$dia',$contad,$contac,$valor,'$hist')");
		return $this->inicio();
	}

	function lancamento()
	{
		global $mysqli;
		$dia=$_SESSION['dia'];
    	//plano de contas
		$ativo=json_decode(json_encode($mysqli->query("select * 
			from tbconta where conta < 201")->fetch_all(MYSQLI_ASSOC)));
		$passivo=json_decode(json_encode($mysqli->query("select * from 
			tbconta where conta >=201")->fetch_all(MYSQLI_ASSOC)));
		$contaPassivo=count($passivo); 
		$proximoLcto=$mysqli->query("select lcto from tbdiario order by lcto desc")
			->fetch_assoc()['lcto']+1; 
		?>
		<script>
			btmenu.innerHTML='Lançamento'
			document.title='Lançamento'
			var idControle,Descricao
			function ir(controle,destino)
			{
    			idControle=controle
    			Descricao=destino
			}
			function voltar(texto)
			{
    			controle=document.getElementById(idControle)
    			destino=document.getElementById(Descricao)
    			controle.value=texto.substr(0,3)
    			tamanho=texto.strlen
    			destino.innerHTML=texto.substr(4,tamanho)
			}
		</script>
		<div class=modal id=myModal>
    	<div class=modal-dialog>
		<div class=modal-content>
    	<div class=modal-body>
        <table class='table table-striped linha'>
		<?php foreach($ativo as $key=>$row): ?>
            <tr><td><a href data-bs-dismiss='modal' onclick=voltar(this.innerHTML)><?=$row->conta." ".$row->descricao?></a>
				<?php if($key<$contaPassivo): ?>
                	<td><a href data-bs-dismiss='modal' onclick=voltar(this.innerHTML)><?=$passivo[$key]->conta." ".$passivo[$key]->descricao?></a>
           	 	<?php else: ?>
                	<td>
            	<?php endif; ?>
        <?php endforeach; ?>
        </table>
    	</div>
    	</div>
   	 	</div>
		</div>
		<form>
	    	<div>
			<table class='table table-sm table-striped'>
			<tr><td>Lançamento<td><?=$proximoLcto?>
	    	<tr><td>Data<td><?=dbr($dia)?>
	    	<input type='hidden' name='registro' value='<?=$dia?>'>
	    	<input type='hidden' name='lcto' value=<?=$proximoLcto?>>
	    	<tr><td>ContaD<td><input id=idebito name=debito onclick="ir(id,'adebito')" 
		    	data-bs-toggle=modal data-bs-target=#myModal  size=2 autocomplete=off>
	    		<a id=adebito></a>
	    	<tr><td>ContaC<td><input id=icredito name=credito onclick="ir(id,'acredito')" 
		        data-bs-toggle=modal data-bs-target=#myModal  size=2 autocomplete=off>
	    		<a id=acredito></a>
	    	<tr><td>Valor<td><input name='valor' id='valor' autocomplete='off' onchange='hist.focus()'>
	    	<tr><td>Histórico<td><input name='hist' id='hist' size='30' autocomplete='off' required>
	    	<tr><td><td><input type=submit value=Confirmar></table></div>
		</form>
		<?php
	} 

	function dia($dia)
	{
		$_SESSION['dia']=$dia;
		$this->inicio();
	}

}
(new Diario)->roteador();
?> 

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...