Dúvida sobre URL após Delete com MVC

MVC

PHP

POO

07/06/2023

Estou começando na área do PHP na estrutura MVC (sem nenhum framework back-end, apenas bootstrap) e no meu formulário eu utilizo algo do tipo

<?php foreach ($this->params as $p) { ?>
<tr>
<th><?= $p['id'] ?></th>
<td><?= $p['nome_movimento'] ?></td>
<td><?= $p['tipo'] == 1 ? 'Lucro' : 'Despesa' ?></td>

<td>
<a href="<?= $delete.'id='.$p['id'] ?>"><i class="fa-solid fa-trash"></i></a>
</td>
</tr>
<?php } ?>

esse código basicamente imprime algumas informações em tela e, ao clicar na minha tag <a> onde, envia uma URL com o controller a ser acessado, o evento e o parametro sendo o ID do registro que está imprimindo em tela
--basicamente cai aqui dentro--
public function excluir($key) {
        if ($this->model->excluir($key)){
            $this->finalMessage('Registro deletado com sucesso');
        }
    }

public function finalMessage($message) {
        $params = ['final_message' => $message];
        $this->listar($params);
    }


A minha função listar basicamente renderiza a View instanciada que é passada manualmente depois.

após a renderização a URL do meu navegador permanece com a URL que foi passada ali no delete e isso está causando alguns problemas de manuseio da página. Já tentei usar um header(location) porém eu preciso enviar alguns parâmetros para a página.

(Tenham pena da minha alma pois não sei programar direito)
Kauan Oliveira

Kauan Oliveira

Curtidas 0

Melhor post

Frank Hosaka

Frank Hosaka

07/06/2023


<a href="/financias/movimentotipo/excluir/id=19"><i class="fa-solid fa-trash"></i></a>
Desconfio que movimentotipo não é uma pasta mas sim o nome de um arquivo, logo o comando esperado seria [code=php] <a href="/financias/movimentotipo.php?excluir=19">


Ou seja, o formato da URL do elemento <a> é sempre <a href=diretorio/arquivo.php?variavel=valor>, e o arquivo.php pegaria a variavel=valor através do comando $_GET.
GOSTEI 1

Mais Respostas

Frank Hosaka

Frank Hosaka

07/06/2023

O problema não é URL mas sim HTML, você está usando o elemento <a> de maneira inadequada, a gramática dele é assim:
<a href=url.php?excluir=<?=$id?>. Na listagem a seguir, eu coloquei um exemplo para o elemento chamar a mesma página.

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" 
    rel="stylesheet" 
    integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" 
    crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<body class="w-25 mx-auto p-3">
<?php 
if(isset($_GET['excluir'])){
    $id=$_GET['excluir'];echo "Vai ser excluído o lançamento $id";exit;}
$params=[["id"=>1,"nome_movimento"=>"dinheiro","tipo"=>1]];
$params[]=["id"=>2,"nome_movimento"=>"camisinha","tipo"=>2];
echo "<table class='table table-striped'><th>Id<th>Histórico<th>Tipo<th>Ação";
foreach ($params as $p) {
    echo "<tr><td>".$p['id'];
    echo "<td>".$p['nome_movimento'];
    if($p['tipo']==1){$tipo='Receita';} else {$tipo='Despesa';}
    echo "<td>$tipo";
    echo "<td><a href=?excluir=".$p['id'].">Excluir <i class='fa fa-trash-o'></i></a>";}
GOSTEI 0
Frank Hosaka

Frank Hosaka

07/06/2023

O problema não é URL mas sim HTML, você está usando o elemento <a> de maneira inadequada, a gramática dele é assim:
<a href=url.php?excluir=<?=$id?>. Na listagem a seguir, eu coloquei um exemplo para o elemento chamar a mesma página.

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" 
    rel="stylesheet" 
    integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" 
    crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<body class="w-25 mx-auto p-3">
<?php 
if(isset($_GET[''excluir''])){
    $id=$_GET[''excluir''];echo "Vai ser excluído o lançamento $id";exit;}
$params=[["id"=>1,"nome_movimento"=>"dinheiro","tipo"=>1]];
$params[]=["id"=>2,"nome_movimento"=>"camisinha","tipo"=>2];
echo "<table class=''table table-striped''><th>Id<th>Histórico<th>Tipo<th>Ação";
foreach ($params as $p) {
    echo "<tr><td>".$p[''id''];
    echo "<td>".$p[''nome_movimento''];
    if($p[''tipo'']==1){$tipo=''Receita'';} else {$tipo=''Despesa'';}
    echo "<td>$tipo";
    echo "<td><a href=?excluir=".$p[''id''].">Excluir <i class=''fa fa-trash-o''></i></a>";}
GOSTEI 0
Kauan Oliveira

Kauan Oliveira

07/06/2023

O problema não é URL mas sim HTML, você está usando o elemento <a> de maneira inadequada, a gramática dele é assim:
<a href=url.php?excluir=<?=$id?>. Na listagem a seguir, eu coloquei um exemplo para o elemento chamar a mesma página.

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" 
    rel="stylesheet" 
    integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" 
    crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<body class="w-25 mx-auto p-3">
<?php 
if(isset($_GET[''''excluir''''])){
    $id=$_GET[''''excluir''''];echo "Vai ser excluído o lançamento $id";exit;}
$params=[["id"=>1,"nome_movimento"=>"dinheiro","tipo"=>1]];
$params[]=["id"=>2,"nome_movimento"=>"camisinha","tipo"=>2];
echo "<table class=''''table table-striped''''><th>Id<th>Histórico<th>Tipo<th>Ação";
foreach ($params as $p) {
    echo "<tr><td>".$p[''''id''''];
    echo "<td>".$p[''''nome_movimento''''];
    if($p[''''tipo'''']==1){$tipo=''''Receita'''';} else {$tipo=''''Despesa'''';}
    echo "<td>$tipo";
    echo "<td><a href=?excluir=".$p[''''id''''].">Excluir <i class=''''fa fa-trash-o''''></i></a>";}


Deixa eu ver se entendi, nesse caso ele vai executar a função do meu controller mas não vai ficar a url? como assim?
GOSTEI 0
Frank Hosaka

Frank Hosaka

07/06/2023

Deixa eu ver se entendi, nesse caso ele vai executar a função do meu controller mas não vai ficar a url? como assim?


O código que você está defendendo é esse:
<a href="<?= $delete.'id='.$p['id'] ?>"><i class="fa-solid fa-trash"></i></a>


1) você não pode usar o comando abreviado do PHP <?= quando você quer definir o valor de uma variável tipo $delete = $p['id']
2) o elemento <a href= precisa de uma URL
3) na gramática do PHP $delete.'id='.$p['id'] só pode ser usado quando a intenção é ajuntar texto. Se for para apresentar na tela, precisa do comando echo, se for atribuir a uma variável, a variável que vai receber o valor tem que vir do lado esquerdo
4) Não dá para saber o que esse comando faz, eu precisaria de todo código para saber se o processador chegaria até esse comando.
5) Quando alguém me fala de controlador, eu logo lembro do Laravel, basicamente dividido em três partes: o roteador, o visualizador e o controlador. De onde você tirou a ideia do controlador?
GOSTEI 0
Kauan Oliveira

Kauan Oliveira

07/06/2023

Deixa eu ver se entendi, nesse caso ele vai executar a função do meu controller mas não vai ficar a url? como assim?


O código que você está defendendo é esse:
<a href="<?= $delete.''id=''.$p[''id''] ?>"><i class="fa-solid fa-trash"></i></a>


1) você não pode usar o comando abreviado do PHP <?= quando você quer definir o valor de uma variável tipo $delete = $p[''id'']
2) o elemento <a href= precisa de uma URL
3) na gramática do PHP $delete.''id=''.$p[''id''] só pode ser usado quando a intenção é ajuntar texto. Se for para apresentar na tela, precisa do comando echo, se for atribuir a uma variável, a variável que vai receber o valor tem que vir do lado esquerdo
4) Não dá para saber o que esse comando faz, eu precisaria de todo código para saber se o processador chegaria até esse comando.
5) Quando alguém me fala de controlador, eu logo lembro do Laravel, basicamente dividido em três partes: o roteador, o visualizador e o controlador. De onde você tirou a ideia do controlador?


mas não está tendo nenhuma atribuição de valores e sim uma concatenação. A impressão do html da página em execução fica exatamente assim

<a href="/financias/movimentotipo/excluir/id=19"><i class="fa-solid fa-trash"></i></a>


movimentotipo = controller
excluir = método
id=19 = parametro passado

$delete armazena essa string = "/financias/movimentotipo/excluir/"
GOSTEI 0
Kauan Oliveira

Kauan Oliveira

07/06/2023


<a href="/financias/movimentotipo/excluir/id=19"><i class="fa-solid fa-trash"></i></a>
Desconfio que movimentotipo não é uma pasta mas sim o nome de um arquivo, logo o comando esperado seria [code=php] <a href="/financias/movimentotipo.php?excluir=19">


Ou seja, o formato da URL do elemento <a> é sempre <a href=diretorio/arquivo.php?variavel=valor>, e o arquivo.php pegaria a variavel=valor através do comando $_GET.


amigo acredito ter entendido, pelo visto estou utilizando o método errado no tratamento do dado. Testarei aqui, caso eu consiga darei um joinha na resposta. Agradeço a paciência tamo junto!
GOSTEI 1
POSTAR