gremio10 14 Denunciar post Postado Outubro 26, 2011 Fala galera, alguém, sabe um jeito, sem ser por GET, de quando eu der um back no navegador, ele ir para minha página de pesquisa, e não para um post anterior ? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
William Espindola 4 Denunciar post Postado Outubro 26, 2011 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
gremio10 14 Denunciar post Postado Outubro 26, 2011 Só que se eu dou um POST, crio u formulario, e como method, dou post, e depois, dou um back, ele cai em uma página de re-envio dos dados da busca, mas não quero isso... Compartilhar este post Link para o post Compartilhar em outros sites
William Espindola 4 Denunciar post Postado Outubro 26, 2011 De uma olhada neste post aqui do fórum. Clique aqui Veja se te ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 26, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Outubro 26, 2011 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
gremio10 14 Denunciar post Postado Outubro 26, 2011 Cara, desculpa minha ignorância, mas como estou usando o Zend, não sei como posso fazer isso... =( Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Outubro 26, 2011 Pois é, daí eu acho melhor você perguntar lá no fórum de Zend, posso te transferir pra lá se quiser. Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Outubro 27, 2011 Cara, eu agradeço ^_^ ... por que realmente, vou pesquisar se o próprio Zend possui uma ferramenta para isso, mas se alguém soube, melhor :lol: Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Ghean 0 Denunciar post Postado Outubro 27, 2011 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
gremio10 14 Denunciar post Postado Outubro 27, 2011 @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
Leozitho 81 Denunciar post Postado Novembro 3, 2011 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
gremio10 14 Denunciar post Postado Novembro 3, 2011 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
Leozitho 81 Denunciar post Postado Novembro 3, 2011 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
gremio10 14 Denunciar post Postado Novembro 3, 2011 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