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.

Foi útil?

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á :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top