Erstellen Sie ein neues Lösch object_action in Symfony 1.4 Admin-Generator
-
23-09-2019 - |
Frage
Ich bin mit Symfony 1.4 / Lehre Admin-Generator.
Es gibt eine Liste von Fragen, und ich möchte eine benutzerdefinierte object_action auf jeden von ihnen in der Lage sein durchzuführen.
Was ich suche ist zu imitieren die _delete
Objekt Aktion, sondern eine gewisse Berechnung vor, das zu tun.
Also habe ich eine neue Aktion erstellt:
public function executeListDeleteAndRecalculate(sfWebrequest $request)
{
// Do the calculation
// Then delete the question
}
Und ich hinzufüge, um es zu meinem generator.yml:
object_actions:
delete_and_recalculate: ~
Die neue Aktion zeigt im Admin-Generator aber der Lösch Teil nicht funktioniert.
Ich habe versucht, eine Reihe von Dingen, es Arbeit zu machen:
- Sobald alle die Berechnung fertig war, versuchte ich zuerst auf die
questionActions/delete
Aktion zu umleiten. - Ich habe auch versucht die
executeDelete
Code auf meine neue Aktion zu kopieren.
Aber jedes Mal wenn ich die berüchtigten
500 | Interner Serverfehler | sfValidatorErrorSchema _csrf_token [Erforderlich.]
So vermute ich, Symfony etwas Magie tut, bevor ein Objekt tatsächlich zu löschen.
Weißt du, was ich vermisse und Was ist der beste Weg, um eine deleteAndRecalculate Art von Aktion zu implementieren?
Edit:
Natürlich, wenn ich entferne die $request->checkCSRFProtection();
alles gut funktioniert. Aber ich nehme an, es ist ziemlich wichtig, so würde Ich mag eine schönere Lösung finden.
Lösung
Dies ist, weil der delete
Link aus dem Admin-Generator verwendet einen Token CSRF-Angriffe zu verhindern.
Im Grunde setzt es ein Token in die Sitzung und in einem versteckten Feld eines Formulars überprüft dann einen mit dem andern auf den Antrag. Dies ist möglich, weil die delete
-Link im Admin-Generator ist eigentlich ein (Javascript generiert) Form (dies geschieht mit Hilfe eines sf_method
versteckt Feld zu simulieren REST Verhalten hinzuzufügen).
Für weitere Informationen darüber, wie CSRF arbeitet und verhindert werden kann, können Sie weiter auf Wikipedia lesen: http://en.wikipedia.org/wiki/Cross-site_request_forgery
Was Sie ist die gleiche Art von Verbindung verwenden tun, müssen Sie nur noch einen method
Parameter link_to
Pass für sie eine Form zu erzeugen, haben einen Blick auf lib/generator/sfModelGeneratorHelper.class.php
Linie 32 zu sehen, wie es in der Admin-gen getan hat.
Sie würden dann $request->checkCSRFProtection()
in Ihrer executeDeleteAndRecalculate
Methode ausführen, und gehen Sie mit dem, was Sie tun wollen, auch das Objekt von Hand löschen.
Um den Link richtig generieren, würden Sie eine linkToDeleteAndRecalculate
Methode in der Helper hinzufügen Klasse des Moduls (das sollte in der lib/${YourModule}GeneratorHelper.class.php
Datei des Moduls Verzeichnis liegen) und fügen Sie den folgenden Code (direkt genommen und von sfModelGeneratorHelper
angepasst):
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>';
}
Bitte beachten Sie, dass Sie die Route ändern (Ich habe durch Standard setzen delete_and_recalculate
aber Sie könnten es voran wollen mit dem Namen Ihres Moduls) aus dem link_to
Anruf.
Sie können dann mit Ihrem delete_and_recalculate
fast wie eine eingebauten Methode aus dem Admin-Generator (und ihm ein Etikett aus dem generator.yml
zum Beispiel passieren)
Da nun der Fest-Weg war.
Der einfache Weg zum admin.delete_object
Ereignisse abonnieren wäre, von Ihrem Moduls vor dem Job ausgeführt zum Beispiel, und um Ihren Job dort: -)