Crear un nuevo object_action de eliminación en generador de administración de Symfony 1.4
-
23-09-2019 - |
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.
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í: -)