1

Symfony 1.4 バックエンドを使用して、異なる権限を持つユーザーを含む sfGuardUser プラグインでユーザーを作成/更新しています。

sfGuardUser と 1 対 1 の関係を持つ別のテーブルを使用しています。このテーブルには、権限によって区別された特定のタイプのユーザーに関連する情報を保存します。

Symfony はその仕事を終え、sfGuardUser に保存されたすべてのユーザーを含む選択フィールドを生成しました。

特定の権限を持つ sfGuardUsers のみを表示するために、このリストをフィルタリングしたいと思います。

バックエンドで特定のフィルターを作成する方法に関する多くの記事を見つけましたが、問題を解決する方法に関する記事はありませんでした。

4

2 に答える 2

1

@j0kの質問はこの問題にとって非常に重要です。常に同じ権限が必要な場合は、目的を達成するのはかなり簡単です。パーミッションを動的にしたい場合、ソリューションは少しトリッキーになります。

前者の場合、sgGuardUserに関連するテーブルのバックエンド(新規および編集)のアクションで使用されるFormクラスを編集する必要があります。ユーザーのリストを取得するための選択ウィジェットを編集する必要があります:(リレーション列がでuser_idあり、Doctrineを使用していると仮定します):

$this->widgetSchema['user_id']->setOption('table_method' => 'retrieveForPermissionX');

次にsfGuardUserTable.class.php、適切なクエリを準備する関数を追加する必要があります。

public function retrieveForPermissionX()
{
    return $this->createQuery('u')
        ->innerJoin('u.sfGuardUserPermission up')
        ->innerJoin('u.Permissions p')
        ->where('p.name = "PermissionX"')
        ->orderBy('u.first_name ASC');
} 

私が言ったように、異なる権限を使用する必要がある場合は、より注意が必要です。基本は同じです。フォーム内のウィジェットに適切なユーザーを選択する必要がありますが、使用する権限をフォームに通知する必要があります。

自動生成された新規アクションと編集アクションをオーバーライドする必要があると思います。必要なアクセス許可をURLのパラメーターとして渡し(または必要な特定のアクセス許可に特定のURLを使用し)、アクション内でアクセス許可をオプションとしてフォームに渡します。

$this->form = new UserInfoForm(null, array('permissions' => $permissions));

次に、この情報を使用して、選択ウィジェットで適切なテーブルメソッドを呼び出すことができます(またはクエリオブジェクトを生成します。代わりに、テーブルメソッドの代わりに、ウィジェットのオブジェクトを取得するために使用されるクエリオブジェクトを渡すこともできます)。

于 2013-02-21T20:15:40.277 に答える
1

まさに私が探していたもの。上記のように、クエリとコードにいくつかの変更を加えました。

lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardUserTable.class.php 内

public function retrieveForPermissionX()
{
     return $this->createQuery('u')
          ->leftJoin('u.sfGuardUserPermission up')
          ->innerJoin('u.Permissions p')
          ->where('p.name = "PermissionX"')
          ->orderBy('u.first_name ASC');             
}

apps/your_app_name/modules/your_module_name/actions/actions.class.php 内

public function executeNew(sfWebRequest $request)
{
    $this->table_client = new tableClient();
    $this->form = new TableClientForm($this->table_client);

    $widgetSchema = $this->form->getWidgetSchema();
    $widgetSchema['sf_guard_user_id']->setOption('table_method', 'retrieveForPermissionX');
}
于 2013-02-22T13:14:33.090 に答える