2

元の投稿を編集して、より明確にします。ここで、純粋な構文であると私が信じる新しい問題領域があります。

OOP と Zend Framework 2 は初めてです。パーシャルの使用法を理解しようとしています。私はまた、他の誰かによって最初に開始されたアプリケーションを拡張しています。そのため、エンティティ/ゲートウェイ/コントローラー/ビューの命名規則により、指定されたアクションに対して正しいテンプレートが返されることが保証されます。

「partial('/nav/index.phtml');」を使用しようとしています。インデックス ページのヘッダーに 1 つのスニペットを挿入する方法として。しかし、他のページで別のパーシャルを使用したいと考えています。

マーシャルの提案に従って、TemplateController で、ナビゲーションに使用する部分を指定する変数 (nav_template) を viewModel に追加しています。

    <?php

    namespace Application\Controller;

    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;

    class TplController extends AbstractActionController
    {
        public function topicAviewAction()
        {
            $viewModel = new ViewModel();
            $viewModel->setTerminal(true);
        $viewModel->setVariable('nav_template', 'nav/topica.phtml');
            return $viewModel;
        }

        public function topicBviewAction()
        {
            $viewModel = new ViewModel();
            $viewModel->setTerminal(true);
        $viewModel->setVariable('nav_template', 'nav/topicb.phtml');
            return $viewModel;
        }
    }

以下のコマンドを使用して、変数がオブジェクトに含まれていることを確認しました。

    echo $viewModel->nav_template;

ただし、次を使用して、部分を layout.phtml に含める場合:

    <?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?>

$nav_template の値を使用/検索していないことは明らかです。どこで私は間違えましたか?

4

4 に答える 4

0

レイアウト テンプレートで、次のようなデフォルトのフォールバックを使用して動的パーシャルを呼び出します。

<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?>

次に、レイアウト ナビゲーションを変更するコントローラーで次のようにします。

$this->layout()->setVariable('nav_template', 'nav/other');

動作するはずです。(未テスト)

于 2013-06-28T05:29:54.533 に答える
0

FWIW、よくやった、Ruben。ただし、デフォルトのルーティング設定 (Skeleton アプリなど)'application\default'を使用すると、次のようなものが常に返されます。$routeMatch->getMatchedRouteName()

これは、正規表現セグメント ルートで動作するわずかな mod です。

public function onBootstrap(MvcEvent $e)
{
    $e->getApplication()->getEventManager()->attach(
            \Zend\Mvc\MvcEvent::EVENT_ROUTE,
            function($e) {
                $viewModel = $e->getViewModel();
                $nav = new \Zend\View\Model\ViewModel();
                $routeMatch = $e->getRouteMatch();
                $routeMatchParams = $routeMatch->getParams(); // <-- added this

                switch ($routeMatchParams['controller']) //  // <-- switch on invokable alias of your controller(s)
                {
                    case 'Application\Controller\YourController':
                        $template = 'your/custom-template';
                        break;

                    default:
                        $template = 'your/default-template';
                        break;

                }

                $nav->setTemplate($template);
                $viewModel->addChild($nav, 'nav');
            },
            -1000
    );
    ...
于 2013-07-02T23:43:28.797 に答える