Crie um novo Gerador de Administração de Excluir Object_action em Symfony 1.4
-
23-09-2019 - |
Pergunta
Estou usando o gerador de administração do Symfony 1.4/Doutrina.
Há uma lista de perguntas e eu gostaria de poder executar uma objeto personalizado em cada uma delas.
O que estou procurando é imitar o _delete
ação objeto, mas fazendo algum cálculo antes disso.
Então eu criei uma nova ação:
public function executeListDeleteAndRecalculate(sfWebrequest $request)
{
// Do the calculation
// Then delete the question
}
E estou adicionando ao meu gerador.yml:
object_actions:
delete_and_recalculate: ~
A nova ação mostra no gerador de administrador, mas a parte excluída não funciona.
Eu tentei um monte de coisas para fazê -lo funcionar:
- Depois que todo o cálculo foi feito, tentei primeiro redirecionar para o
questionActions/delete
ação. - Eu também tentei copiar o
executeDelete
código para minha nova ação.
Mas toda vez que eu fico infame
500 | Erro do servidor interno | sfValidatorErrorRorsChema _CSRF_TOKen [requerido.
Então, acho que Symfony está fazendo alguma mágica antes de excluir um objeto.
Você sabe o que estou perdendo e Qual é a melhor maneira de implementar um tipo de ação deleteandreCalculate?
Editar:
Claro se eu remover o $request->checkCSRFProtection();
Tudo funciona muito bem. Mas suponho que seja muito importante, então eu gostaria de encontrar uma solução mais bonita.
Solução
Isso é porque o delete
O link do gerador de administrador usa um token para evitar ataques de CSRF.
Basicamente, ele coloca um token em sua sessão e entra em um campo oculto de um formulário e depois o verifica um contra o outro na solicitação. Isso é possível porque o delete
O link no gerador de administrador é na verdade um formulário (JavaScript gerado) (isso é feito para adicionar um sf_method
campo oculto para simular o comportamento de descanso).
Para obter mais informações sobre como o CSRF funciona e pode ser evitado, você pode ler mais na Wikipedia: http://en.wikipedia.org/wiki/cross-site_request_forgery
O que você pode fazer é usar o mesmo tipo de link, você só precisa passar um method
parâmetro para link_to
Para gerar um formulário, dê uma olhada lib/generator/sfModelGeneratorHelper.class.php
linha 32 para ver como é feito no administrador-general.
Você então executaria $request->checkCSRFProtection()
na tua executeDeleteAndRecalculate
Método e prossiga com o que quiser, incluindo a exclusão do objeto manualmente.
Para gerar corretamente o link, você adicionaria um linkToDeleteAndRecalculate
método na classe auxiliar do seu módulo (que deve estar no lib/${YourModule}GeneratorHelper.class.php
arquivo do seu diretório de módulos) e adicione o seguinte código (diretamente retirado e adaptado de sfModelGeneratorHelper
):
public function linkToDeleteAndRecalculate($object, $params)
{
if ($object->isNew())
{
return '';
}
return '<li class="sf_admin_action_delete">'.link_to(__($params['label'], array(), 'sf_admin'), 'delete_and_recalculate', $object, array('method' => 'delete', 'confirm' => !empty($params['confirm']) ? __($params['confirm'], array(), 'sf_admin') : $params['confirm'])).'</li>';
}
Observe que você precisa mudar a rota (eu coloquei delete_and_recalculate
por padrão, mas você pode prefixá -lo com o nome do seu módulo) do link_to
ligar.
Você pode então usar o seu delete_and_recalculate
quase como um método construído do gerador de administrador (e passa um rótulo do generator.yml
por exemplo)
Agora esse era o caminho difícil.
A maneira mais fácil seria assinar o admin.delete_object
Evento, do pré-atualização do seu módulo, por exemplo, e para o seu trabalho lá :-)