2

ZF2 アプリケーションにダッシュボードを追加しようとしています。複数のモジュールからビューを収集して、ダッシュボードを構築したいと考えています。アプリケーションに追加するすべてのモジュールは、独自のビューをダッシュ​​ボードに追加する必要があります。

どちらが最善のアプローチになるかはわかりません。ここに私のアイデアがあります:

1. ダッシュボードをレンダリングするコントローラー アクションで、イベントをトリガーします。このイベントは、モジュールの init() メソッドなどでキャッチされます。すべてのモジュールは、独自の ViewModel を追加します。私のコントローラー アクションでは、それらをベース ViewModel に追加できます。問題: ダッシュボードのパーシャル (他のモジュールによって追加された ViewModel) の並べ替え順序を設定する可能性がない

2. ZF2 ナビゲーションを拡張して、ラベルやルート以外の情報を収集できます。ウィジェットを作成できる見出しとファクトリ クラス名を収集し、ネイティブ ナビゲーションがメニュー項目をレンダリングするようにそれらをレンダリングする必要があります。その後、モジュール構成からダッシュボードにパーツを追加できました。これが可能かどうかはわかりませんが、ZF2 ナビゲーションを詳しく調べる必要があります。そのような複雑なダッシュボードを作成できるとは思えません。

ダッシュボードには何が必要ですか? たとえば、ウェアハウス在庫が重要な製品をリストしたいとします。

このようなダッシュボードをどのように構築しますか?

[編集 - 使用法]

@Rudolph Gottesheim さん、もう少し時間を見つけたら、その仕組みを詳しく説明します。すぐにお答えできるように、ダッシュボードで現在どのように作業できるかを説明します。

module.config.php で複数のダッシュボードを設定できるようになりました。これは次のようになります。

    'application_dashboard' => array(
        'application' => array(
            'elements' => array (
                array(
                    'label'=>'some dashboard element',
                    'sortorder'=>2,
                    //'contentString'=>'instead of contentService or contentElement'                    
                    //'contentElement'=> new SomeDashboardElementContent(),
                    'contentService'=>'name_of_a_service_that_provides_an_element',
                    'viewHelper'=>'name_of_a_viewhelper'
               ),
             ),
         ),
        'admin' => array(
            'elements' => array (
                array(
                    'label'=>'label for admin dashboard element',
                    'sortorder'=>2,
                    //'contentString'=>'hello world'
               ),
             ),
         ),
     ),

そのため、各モジュールから新しいダッシュボードと新しい要素を追加できます。要素は非常に複雑になる可能性があるため、たとえば、ダッシュボード要素はデータベースからユーザーのグリッドを表示できます。そのため、要素構成で「contentService」になりました。

このサービスはすべての複雑なことを行い、他のサービスにアクセスできるため、何でも構築して要素を返すことができます。私の DashboardProviderService は、要素を取得するために、ServiceLocator を使用して構成済みの「contentService」を呼び出します。「viewHelper」の値は、その特定の要素をレンダリングする方法を知っている ViewHelper です。前述したように、要素にはグリッドまたは ViewModel を含めることができます。私の DashboardProviderService は ViewHelperManager Service を使用して、その構成から特定の ViewHelper を取得します。

また、ZF2 の ViewRenderer Service にアクセスできる ViewModelRenderer ビュー ヘルパーも作成したため、Elements には ViewModel のインスタンスも含めることができます。

動的でない場合は「contentElement」を直接追加するか、ダッシュボード要素内でレンダリングされる文字列を追加することもできます。

これが私のクラスの現在のリストです。これについては、後で詳しく説明します。

Application\Service\DashboardProviderService
Application\Dashboard\Container implements Countable, RecursiveIterator
Application\Dashboard\Dashboard extends Application\Dashboard\Container
Application\Dashboard\Element\Element
Application\Dashboard\View\Helper

[編集 - クラス]

... 近日公開 ...

[編集 - 次のステップ]

  • ダッシュボード要素全体にボタンまたはリンクをレンダリングするために使用できるダッシュボード要素の「ルート」値を追加します。
  • ユーザーのロール権限によってダッシュボードをフィルタリングするために、ダッシュボードのアクセス制御を統合します。ZfcRbac とルート ファイアウォールを使用しているため、現時点では、要素の構成されたルート値によってダッシュボード要素へのアクセスをフィルタリングすることを考えています。
4

3 に答える 3

1

(ZF2で何をしているのか知っているように聞こえるので、クラス名の形でいくつかのアイデアを投げかけます。明確にしたい場合は、お知らせください。回答を更新します.)

s、ビューヘルパー、および構成にアクセスできるサービスをDashboard含むクラスを作成します。次に、各モジュールの構成ファイルにダッシュボード アイテムを追加し、そこからアイテムを作成します。DashboardItem$this->dashboard($dashboard)DashboardProvider

于 2014-07-12T12:58:06.170 に答える
0

forward()コントローラ プラグインを使用して、集約ビューを構築できます。プラグインは、ターゲット コントローラー アクションをディスパッチし、ビュー モデルを返します。

本当に簡単な例

 // FooController
 public function dashboardAction() {

   $view = new ViewModel(array('foo' => $foo));

   $productsView = $this->forward()->dispatch(
     'MyModule\Controller\Products', array('action' => 'index')
   );
   $salesView = $this->forward()->dispatch(
     'Sales\Controller\Sales', array('action' => 'sales-figures')
   );

   $view->addChild($productsView, 'products');
   $view->addChild($salesView, 'sales');

   return $view;
 }

ビューに出力するには

// dashboard.phtml

<h3>My Products</h3>
<?php echo $this->products; ?>

<h3>My Sales</h3>
<?php echo $this->sales; ?>
于 2014-07-11T08:30:37.183 に答える