Pregunta

Estoy usando Symfony 1.4 / generador de administración de Doctrina.

Hay una lista de preguntas y me gustaría ser capaz de realizar una object_action personalizada en cada uno de ellos.

Lo que estoy buscando es para imitar la acción del objeto _delete pero haciendo algunos cálculos antes de eso.

Así que creó una nueva acción:

  public function executeListDeleteAndRecalculate(sfWebrequest $request)
  {
    // Do the calculation

    // Then delete the question
  }

Y estoy añadiendo a mi generator.yml:

object_actions:
    delete_and_recalculate: ~

los nuevos programas de acción en el generador de administración, pero la parte de eliminación no funciona.

He intentado un montón de cosas para que funcione:

  • Una vez que se hace todo el cálculo, primero trató de redirigir a la acción questionActions/delete.
  • También trató de copiar el código executeDelete a mi nueva acción.

Sin embargo, cada vez que sale el famoso

  

500 | Error interno del servidor |   sfValidatorErrorSchema   _csrf_token [Obligatorio.]

Así que supongo Symfony está haciendo un poco de magia antes de que realmente la eliminación de un objeto.

¿Usted sabe lo que me falta y ¿cuál es la mejor manera de poner en práctica una especie deleteAndRecalculate de acción?

Editar

Por supuesto, si se quita la $request->checkCSRFProtection(); todo funciona muy bien. Pero supongo que es bastante importante por lo que me gustaría encontrar una solución más bonita.

¿Fue útil?

Solución

Esto es debido a que el enlace delete desde el generador de administración utiliza un identificador para prevenir ataques CSRF.

Básicamente, se establece un token en la sesión y en un campo oculto de un formulario y luego les cheques uno contra otro en la petición. Esto es posible porque el enlace delete en el generador de administración es en realidad un (JavaScript generado) forma (esto se hace para añadir un campo oculto sf_method al comportamiento RESTO simular).

Para obtener más información sobre cómo funciona CSRF y se puede prevenir, se puede leer más en la Wikipedia: http://en.wikipedia.org/wiki/Cross-site_request_forgery

Lo que puede hacer es usar el mismo tipo de enlace, sólo hay que pasar un parámetro method a link_to para que genere una forma, echar un vistazo a la línea lib/generator/sfModelGeneratorHelper.class.php 32 para ver cómo se hace en el admin-gen.

A continuación, se ejecutaría $request->checkCSRFProtection() en su método executeDeleteAndRecalculate, y proceder con lo que quiere hacer, incluyendo eliminar el objeto con la mano.

Para generar correctamente el enlace, deberá añadir un método linkToDeleteAndRecalculate en la clase ayudante de su módulo (que debe estar en el archivo lib/${YourModule}GeneratorHelper.class.php de su directorio de módulos) y añadir el siguiente código (directamente Tomado y 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>';
}

Tenga en cuenta que usted tiene que cambiar la ruta (He puesto delete_and_recalculate por defecto, pero puede que desee el prefijo con el nombre del módulo) de la llamada link_to.

A continuación, puede utilizar su delete_and_recalculate casi como un método de orden interna del generador de administración (y pasarlo una etiqueta de la generator.yml por ejemplo)

Ahora que era la manera más difícil.

La forma más fácil sería suscribirse al evento admin.delete_object, a partir de su módulo de pre-ejecución, por ejemplo, y para su trabajo allí: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top