Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gremio10

Não tem o Reenvio de formulario

Recommended Posts

Cara não ficou claro para mim.

 

Da forma que eu entendi, com um link você teria o resultado indo para a página que você quer. Só que se você usar o Back do navegador ela simplesmente vai para a pagina anterior que você estava.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não é isso não ^_^

 

tipo, tenho um form, cliquei no submit, ele me trouxe o resultado, o que ele fez, atualizou a página, só que o usuário pode ir no navegador e dar um back history, para voltar a página anterior, só que ele vai cair em uma página padrão do navegador, aqui para mim, como uso o chrome, foi reenvio de formulário, ai eu teria de dar um F5 para que ele voltasse com o POST dado, mas queria que isso não acontecesse...

 

:)

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai ter que usar um PRG ( Post Redirect Get Pattern )

 

<?php
header( 'HTTP/1.1 303 See Other' ) ;
header( 'Location: http://site.com/xyz.php' ) ;

 

Lembrando que você tem que saber se é um POST .. por exemplo

 

if( count ( $_POST ) ) 
{ 
   // ... 
}

 

 

Algo do tipo..

 

<?php ob_start(); ?>
<html>
<head>
	<!-- -->
</head>
<body>
	<form method="POST">
		<input type="hidden" value="Test" name="inpt" />
		<input type="submit" name="Send" value="Send" />
	</form>
	<?php
		if ( isset ( $_POST [ 'Send' ] ) ) { // .. verifico se há um índice 'Send' em $_POST

			// ... 

			header( 'HTTP/1.1 303 See Other' );
			header( 'Location: ' . $_SERVER [ 'PHP_SELF' ]  );

			ob_end_flush();
		}
	?>
</body>
</html>

 

Mais sobre o pattern :seta: http://en.wikipedia.org/wiki/Post/Redirect/Get

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode inserir esse trecho em seu controller:

 

public function testeAction()
{
   if( $this->_request->isPost() )
   {
       header( 'HTTP/1.1 303 See Other' );
       header( 'Location: ' . $_SERVER [ 'PHP_SELF' ]  );

       exit();
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ghean, olhe meu código:

 

public function indexAction()
   {
       $relevance = new Application_Model_Feed();

       $pagina = intval( $this->_getParam( "page", 1 ) );

       $search = new Zend_Session_Namespace( "search" );

       $search->search[ "listAll" ] = 1;

       if( $this->isPost() ) {
           // se foi enviado o formulário, eu limpo os dados da busca e gravo novamente o array dos dados
           $search->unsetAll();
           $search->search = $this->getPost();
       }

       if( isset( $search->search ) )
       {   
           if( isset( $search->search[ "listAll" ] ) && $search->search[ "listAll" ] == 1 )
           {
               $tips = $relevance->listTips( "dicas" );
           }
           else
           {
               if( $search->search[ "tags" ] )
               {
                   $tips = $relevance->listTips( "dicas" );
               }
               else
               {
                   $tips = $relevance->listByRelevanceTips( $search->search[ "tags" ], $search->search[ "type" ] );                
                   $this->view->myTags = $search->search[ "tags" ];
               }                
           }            

           $paginator = Zend_Paginator::factory( $tips );
           // Seta a quantidade de registros por página
           $paginator->setItemCountPerPage( 5 );
           // numero de paginas que serão exibidas
           $paginator->setPageRange( 10 );
           // Seta a página atual
           $paginator->setCurrentPageNumber( $pagina );
           // Passa o paginator para a view
           $this->view->paginator = $paginator;
       }        
   }

 

eu colocaria esse código aonde para que quando ocorresse um POST, ele não caísse no reenvio de formulário ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara o mais correto seria o usuário não usar o back history do navegador depois de submeter o formulário, inclusive se fizer isso o navegador informa que os dados serão re-submetidos e pergunta se o usuário quer mesmo fazer isso.

 

Mas como muitos usuários são leigos e gostam de aprontar barbaridades em frente ao PC, uma sugestão seria usar um token no formulário, assim se o formulário já foi enviado uma vez o token expira e se tentar mandar novamente vai dar erro. Neste caso só funcionaria se o usuário clicar no botão "submit" do formulário novamente depois de abrir o formulário.

 

Lembrando que este token não só vai impedir que isso aconteça como também vai evitar ataques do tipo CRSF.

 

Para usar esse token basta incluir o trecho de código abaixo no seu formulário:

 

$csrf = new Zend_Form_Element_Hash('csrf');
$csrf->setIgnore(true);
$this->addElement($csrf);

 

Se preferir, em vez de usar o método addElement você pode usar o método addElements no final do formulário pra adicionar todos os elementos juntos em um array, como eu costumo fazer.

 

Aí não precisa mais se preocupar que o ZF faz todo o processo de geração e validação deste token. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, fiz assim:

 

class Default_Form_Diseases extends Zend_Form
{

   public function init()
   {
       $this->setMethod( "post" )->setAction( "default/diseases/index" );


       //campo email
       $this->addElement( 
                   "text", "search", array( 
                       "label" => "Doença:",
                       "required" => true,
                       "filters" => array( "StringTrim" ),
                       "validators" => array( "alnum" )
                   )
               );

       //submit
       $this->addElement( 
                   "submit", "submit", array(
                       "ignore"   => true,
                       "label"    => "Pesquisar"
                   ) 
               );

       $this->addElement( 
                   "hash", "csrf", array(
                       "ignore" => true
                   ) 
               );
   }


}

 

quando coloco o valor na input, e clico no submit, ele vai tranquilo, funciona minha pesquisa, mas se dou um back no navegador, volta a pedir o reenvio do formulario..

 

:mellow:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, ele vai pedir mas ao reenviar o formulário ele não vai ser validado, já que o token já expirou.

 

Eu imaginei que o seu problema era com relação a inserção duplicada de conteúdo ao re-submeter o formulário, neste caso o token evitaria isso.

 

No caso de uma busca não há problema em o formulário ser enviado novamente, pois ele apenas vai fazer a busca novamente. E na busca é preferível usar o método GET em vez de POST, assim se o usuário quiser enviar o link com o resultado da busca para alguém por exemplo, ele pode. Além é claro de facilitar na hora da paginação.

 

Caso você queira evitar mesmo que o formulário seja re-submetido, talvez a solução do Andrey seja mais apropriada, eu nunca testei mas parece interessante.

 

Você pode usar o helper redirector e informar o código de status 303 que deve funcionar.

 

EDIT:

 

Apenas para acrescentar, como não é elegante usar query string em um framework como o ZF, eu costumo tratar a busca da seguinte forma:

 

Crio um controller chamado Search com duas actions, a action Build e a action Results. A action Build recebe o POST vindo do formulário, trata o termo buscado e redireciona para a action Results.

 

Por exemplo, o usuário digita no formulário o termo "Termo de Busca", a action Build recebe este termo, o trata e envia para a action Results da seguinte forma: /search/results/term/termo-de-busca

 

Assim dá pra usar a paginação tranquilamente: /search/results/term/termo-de-busca/page/5

 

Modificando a rota você consegue simplificar isso deixando apenas assim: /search/termo-de-busca/5

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poutz =/

 

então quer dizer que o csrf é para quando eu for fazer uma requisição mais complexa, que mexa com informações mais confidenciais do meu usuário ?

 

eu tentei usar o header, mas não sei aonde posso coloca-lo...

 

vou fazer então com que o usuário seja obrigado a fazer o reenvio, até eu descobrir um modo de arrumar isso..

 

Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.