3

私はSymfony1.4/Doctrineの管理ジェネレーターを使用しています。

質問のリストがあり、それぞれに対してカスタムobject_actionを実行できるようにしたいと思います。

私が探しているのは、_deleteオブジェクトのアクションを模倣することですが、その前にいくつかの計算を行います。

だから私は新しいアクションを作成しました:

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

    // Then delete the question
  }

そして、私はそれを私のgenerator.ymlに追加しています:

object_actions:
    delete_and_recalculate: ~

新しいアクションは管理ジェネレーターに表示されますが、削除部分は機能しません。

私はそれを機能させるためにたくさんのことを試みました:

  • questionActions/deleteすべての計算が完了したら、最初にアクションにリダイレクトしようとしました。
  • executeDeleteまた、コードを新しいアクションにコピーしようとしました。

しかし、私が悪名高いものになるたびに

500 | 内部サーバーエラー| sfValidatorErrorSchema_csrf_token[必須]

ですから、Symfonyは実際にオブジェクトを削除する前に魔法をかけていると思います。

私が欠けているものと、deleteAndRecalculateの種類のアクションを実装するための最良の方法を知っていますか?

編集:

もちろん、$request->checkCSRFProtection();すべてを削除すれば問題なく動作します。しかし、それはかなり重要だと思うので、もっときれいな解決策を見つけたいと思います。

4

1 に答える 1

4

これはdelete、admin ジェネレーターからのリンクがトークンを使用して CSRF 攻撃を防ぐためです。

基本的に、トークンをセッションとフォームの非表示フィールドに設定し、リクエストでそれらを互いにチェックします。これが可能なのdeleteは、admin ジェネレーターのリンクが実際には (JavaScript で生成された) フォームであるためです (これは、sf_method隠しフィールドを追加して REST の動作をシミュレートするために行われます)。

CSRF の仕組みと防止方法の詳細については、ウィキペディア ( http://en.wikipedia.org/wiki/Cross-site_request_forgery ) を参照してください。

できることは、同じ種類のリンクを使用することです。フォームを生成するためにmethodパラメーターを渡すだけです。32行目を見て、admin-genでどのように行われるかを確認してください。link_tolib/generator/sfModelGeneratorHelper.class.php

次に、メソッドで実行$request->checkCSRFProtection()し、executeDeleteAndRecalculate手動でオブジェクトを削除するなど、やりたいことを続行します。

リンクを適切に生成するにlinkToDeleteAndRecalculateは、モジュールのヘルパー クラスにメソッドを追加し (lib/${YourModule}GeneratorHelper.class.phpモジュール ディレクトリのファイルにある必要があります)、次のコードを追加します (から直接取得して適用します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>';
}

呼び出しからルートを変更する必要があることに注意してください (デフォルトで入れましdelete_and_recalculateたが、モジュールの名前を前に付けたい場合があります) link_to

次に、admin ジェネレーターの組み込みメソッドとほぼ同じように使用できます(たとえばdelete_and_recalculate、からラベルを渡します)。generator.yml

今ではそれは困難な方法でした。

簡単な方法はadmin.delete_object、たとえばモジュールの事前実行からイベントにサブスクライブし、そこでジョブにサブスクライブすることです:-)

于 2010-01-28T13:48:25.873 に答える