[Symfony2] Delete link

18 views
Skip to first unread message

Raphael

unread,
Oct 1, 2012, 12:19:15 PM10/1/12
to symfo...@googlegroups.com
No CRUD gerado pelo Doctrine (app/console generate:doctrine:crud) o link de delete é gerado com o seguinte código:

<form action="{{ path('card_delete', { 'id': entity.id }) }}" method="post">
  {{ form_widget(delete_form) }}
  <button type="submit">Delete</button>
</form>

Sendo que o delete_form é um form dinâmico gerado na action atual.
Eu pensei em inserir o link de remoção na listagem de registros. Com essa ideia de formulário, isso não iria ficar muito bacana.

Sei que eu posso alterar a action pra aceitar GET e não filtrar o CSRF, mas eu não gostaria de precisar fazer isso.

Eu também trabalho com Rails e existe uma gem para o Jquery que embute o TOKEN CSRF nas "metas" do html e quando se trata de um de DELETE, gera um link que faz o POST na action passando o ID e o TOKEN.

Alguém conhece uma alternativa como essa ou alguma outra que eu consiga gerar o link de delete com o CSRF embutido?

--
Raphael Almeida Araújo
Homepage: http://sites.google.com/site/raphoxaraujo

Raphael

unread,
Oct 1, 2012, 4:32:12 PM10/1/12
to symfo...@googlegroups.com
A única forma que consegui até agora foi criando uma action para ser renderizada na view:

// Controller
public function renderDeleteFormAction($id) {
    $form = $this->createDeleteForm($id);

    return $this->render('AcmeCardBundle:Card:_form_delete.html.twig', array(
                'id' => $id,
                'form' => $form->createView())
    );
}


// Parte da view de listagem
<li>{% render "AcmeCardBundle:Card:renderDeleteForm" with {'id': entity.id} %}</li>


// AcmeCardBundle:Card:_form_delete.html.twig
<form action="{{ path('card_delete', { 'id': id }) }}" method="post">
    {{ form_widget(form) }}
    <button type="submit">
        <i class="icon-trash"></i> Delete
    </button>
</form>

Mas isso não é nada genérico.
E ainda tem pra atrapalhar que eu não consigo gerar uma url com base no objeto. Assim meus path() ficam fixados a um só objeto, e não consigo compartilhar as partials com os demais objetos.

2012/10/1 Raphael <raphox...@gmail.com>

Rafael Goulart

unread,
Oct 1, 2012, 5:43:05 PM10/1/12
to symfo...@googlegroups.com
Você não precisa de um formulário para cada item, pode usar um pouco de javascript (ou jquery, para algo mais elegante) e reutilizar o form.

       $deleteForm = $this->createFormBuilder()
            ->add('fake', 'hidden')
            ->getForm()
            ->createView();

e passe isto para a view da listagem.

renderize:

<!-- Hidden form to submit Deletion -->
<form id="deleteForm" action="" method="post">
{{ form_widget(delete_form) }}
</form>

teu link é mais ou menos assim (atenção ao class)

<a href="{{ path('entity_delete', { 'id': entity.id}) }} class="object_delete">Delete</a>

E um javascript assim

$('.object_delete').click(function() {
   var answer = confirm(message)
   if (answer){
       $('#deleteForm').attr('action',$(this).attr('href'));
       $('#deleteForm').submit();
   }
   return false;
});

Eu escrevi agora sem testar, pois no meu generator uso um caminho um pouco diferente. Mas isto garante que o csrf_token é enviado... e é razoavelmente enxuto.

[]'s
Rafael

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Symfony Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para symfo...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para symfony-pt+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/symfony-pt?hl=pt-BR.

Reply all
Reply to author
Forward
0 new messages