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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top