1

Skeleton ZendFramework2を使用してアプリケーションを構築しています。

layout.phtmlの現在のナビゲーションバーを変更して、標準で2つのリンクを表示し、次にユーザーのアクセス許可に基づいてさらにいくつかのリンクを表示したいと思います。

アクティブなモジュール(ZfcUserの場合は/ user)をli class = "active"として表示するにはどうすればよいですか?また、ロードされたモジュールに基づいてナビゲーションアイテムを実装するにはどうすればよいですか?

4

3 に答える 3

2

コントローラでは、次のようなアクティブなモジュールを取得できます。

$modules = $this->getEvent()->getApplication()->getServiceManager()->get('modulemanager')->getLoadedModules();
$moduleNames = array_keys($modules);

次に、モジュール名でロードされたモジュールを確認できます。

$moduleLoaded = in_array('ZfcUser', $moduleNames); //true or false
于 2012-10-15T01:59:22.517 に答える
0

ここに問題があります...「アクティブモジュール」の定義は何ですか?ZF2では、モジュールはトップレベルの名前空間によって大まかに定義されますが、モジュールは必要に応じて複数の名前空間でコードを提供できるため、絶対的なものではありません。

モジュール固有のレイアウトの構成に関するブログ投稿を書きました。この問題についてもう少し詳しく説明し、アクティブなモジュールに基づいてアクションを実行するための1つの可能な「解決策」を示します。http://blog.evan.pro/ module-specific-layouts-in-zend-framework-2

その例では、モジュール名(名前空間)であるイベント識別子を使用して「dispatch」イベントにアタッチしています。これは、ディスパッチされるコントローラーの最上位の名前空間に対してのみトリガーされます(この機能をZF2に特別に追加しました) 、ベータ期間で一般的な質問になりつつあったため)。これがどのように、またはなぜ機能するのか知りたい場合は、https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159(具体的には執筆時点で158行目)を参照してください。これ)。

または、ディスパッチイベントにアタッチして、ディスパッチされるコントローラーの最上位の名前空間を取得することもできます。繰り返しになりますが、これが実際に探している「モジュール名」であるという保証はありません。リクエストのディスパッチに関しては、「これはどのモジュールですか」ではなく、コントローラーとアクションについて考えるのが最善です。

class Module
{
    public function onBootstrap($e) {
        $events = $e->getApplication()->getEventManager()->getSharedManager();
        $events->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
            $controllerClass = get_class($e->getTarget()); // $e->getTarget() is the controller
            $controllerTopNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'))

            // Do whatever here, maybe something like:
            // $nav = $e->getTarget()->getServiceLocator()->get('navigation');
            // $nav->...
        });
    }
}
于 2012-10-15T06:16:20.293 に答える
0

コントローラでは、この方法でアクティブなモジュールを確認できます

$bIsModule = (bool) $this->getEvent()
             ->getApplication()
             ->getServiceManager()
             ->get('modulemanager')
             ->getModule('ZfcUser'); // returns true or false
于 2015-08-20T09:14:33.203 に答える