SonataAdminBundle:リストビューからオブジェクトを作成する(パート2)

問題の声明



記事の最初の部分では 、リストビューの文字行にボタンを作成しました。これにより、応答作成フォームに移動します。 ただし、少なくとも2つの重要な問題は未解決のままです。

  1. 手紙への応答の自動リンク
  2. 応答を作成するためのユーザー権利の検証




メールの返信を自動的にリンクする



SonataAdminBundleレベルで応答を電子メールに自動的にバインドするには、少なくとも3つの方法があります。

1)応答の本質をデータベースに保存する前にフォームを作成した (これには、AdminオブジェクトのprePersistメソッドを使用できます)。 この方法の主な機能は、フォームを操作するユーザーのために1つのエンティティを別のエンティティにアタッチする「不透明度」であり、目標に応じてメリットまたはデメリットとして機能します。

2)formBuilderを使用して必須フィールドの値を調整することにより、フォーム作成 。 このアプローチは、デフォルトのフィールド値を生成するロジックを実装するコードで、管理クラスの不要な混乱を招く可能性があります。

3)フォームを作成する 。 これを行うには、たとえば[1]で提案されているアプローチを使用できます。これは、getNewInstance Adminクラスの親メソッドをオーバーライドすることで構成されます。 このソリューションの代替として、CRUDコントローラーからの継承(継承プロセスの詳細は[2]で説明されています)と、フック操作の定義[3] preCreateがあります。 このような代替手段の利点の1つは、必要に応じて本格的な\ Symfony \ Component \ HttpFoundation \ Response()オブジェクトを返す「通常の」機能です。

どの方法を使用するかは手元のタスクに依存しますが、3番目の方法はCRUDコントローラーからの継承を使用することを検討します。

まず、3番目の引数をadmin.getRouteGenerator.generateUrl()関数に追加します。 これはリクエストパラメータの配列である必要があり、応答を作成する行から文字の識別子を追加します。 これを行うには、admin.getUrlsafeIdentifier()関数を使用します



{# src/AppBundle/Resources/views/CRUD/list__action_create_other_admin.html.twig #} <a href="{{ admin.getRouteGenerator.generateUrl(template_variables.otherAdmin, 'create', {'incoming_id': admin.getUrlsafeIdentifier(object)}) }}" class="btn btn-sm btn-default edit_link" title=" "> <i class="fa fa-plus"></i>   </a>
      
      





したがって、リンクをたどると、要求パラメーターincoming_idとして必要な文字の識別子を渡して、CRUDコントローラーのcreateActionを有効にできます。 これで、タスクは識別子によってレターオブジェクトを受信し、それに応答を添付することになります。 デフォルトでは空のpreCreateメソッドを定義することで解決します。このメソッドは、\ Symfony \ Component \ HttpFoundation \ Response()オブジェクトを返すか、単に$オブジェクトを変更して何も返しません。



 namespace Application\Sonata\AdminBundle\Controller; use AppBundle\Entity\Response; use Sonata\AdminBundle\Controller\CRUDController as BaseController; use Symfony\Component\HttpFoundation\Request; class CRUDController extends BaseController { public function preCreate(Request $request, $object) { //  Response -   ,    \Symfony\Component\HttpFoundation\Response() if ($object instanceof Response) { //     if ($incomingId = $request->get('incoming_id')) { //       if($incoming = $this->getDoctrine()->getRepository('AppBundle:Incoming')->find($incomingId)) { //     $object->setIncoming($incoming); //    ,     $incoming->setResponse($object); } } } } }
      
      





記事の冒頭で提示された主なタスク、つまり、レターのListViewから応答の本質を作成することは解決されました。 答えを作成するために、ユーザーの権利を確認する質問を検討してください。



応答を作成するためのユーザー権限の確認



直接、回答を作成するためのユーザー権利の設定の問題は、この記事の範囲外であり、 [4]に記載されている詳細情報に基づいて解決できます。 応答を作成するユーザーの権限の有無に応じて、レターのリストビューで「回答を追加」ボタンを表示または非表示にする問題を検討します。 これを行うには、list__action_create_other_admin.html.twigファイルを再度変更する必要があります



 {# src/AppBundle/Resources/views/CRUD/list__action_create_other_admin.html.twig #} {% if template_variables.otherAdmin.securityHandler.isGranted(template_variables.otherAdmin, 'CREATE', template_variables.otherAdmin) and template_variables.otherAdmin.hasRoute('create') %} <a href="{{ admin.getRouteGenerator.generateUrl(template_variables.otherAdmin, 'create', {'incoming_id': admin.getUrlsafeIdentifier(object)}) }}" class="btn btn-sm btn-default edit_link" title=" "> <i class="fa fa-plus"></i>   </a> {% endif %}
      
      





同時に、セキュリティシステムのレベルだけでなく、ルーティングシステムのレベルでも回答を作成できるかどうかを確認します。



まとめ



この記事では、SonataAdminBundleで、ユーザーの対応する権限の有無を考慮して、最初のエンティティに関連付けられた2番目のエンティティのListViewからエンティティを作成する問題の解決策について説明します。



使用されているリソースへのリンク



  1. 人口を置く フォームにデフォルト値を設定します。 SonataAdminBundleのオブジェクトまたはインスタンス
  2. カスタム管理アクションの作成
  3. フック操作
  4. セキュリティ



All Articles