5

デフォルトでは、ページはApplicationmodule.config 配列で次のように設定されています。

'template_map' => array(
    'error/404' => __DIR__ . '/../view/error/404.phtml'

ページを変更したい。ViewModel変数でいっぱいの新しいものが欲しいです。これは、単にテンプレートを変更するだけでは不十分であることを意味します。

'error/404' => __DIR__ . '/../view/error/my_new_404_template.phtml'

しかし、作り方がわかりません。リクエストが に届く方法がわかりません'error/404'

  • それのために新しいものを作成する方法はViewModel

  • それに変数をアタッチする方法は?

  • ルートはどのよう'error/404'に変化するのですか?

たとえば、'error/404'ページには次のようなメソッドがあります。

public function pageNotFoundAction() {

    $view = new ViewModel();

    $view->setTemplate('error/404');     // set my template

    $sm = $this->getServiceLocator()->get('SessionManager');
    $cont = new Container('SomeNamespace', $sm);

    $view->var1 = $cont->offsetGet('someValue1');   // the "error/404" template
    $view->var2 = $cont->offsetGet('someValue2');   //       is full of variables
    $view->var3 = $cont->offsetGet('someValue3');
    $view->var4 = "One more view variable";

    // And now I return it somewhere and want it to be called
    //    in case of "the page is not found"
    return $view;
}

そのような変更を行うにはどうすればよいですか?彼らが作成したシステムが、'error/404'. 助けてください。

更新 1

さらに複雑なタスク。複数の'error/404'ページを持つ方法は?'not_found_template'フレームワークを作成した人に、ページの配列を持つことができないこと を知っているかどうかを尋ねたいと思い'error/404'ます。それはどのようにできますか?このオプションを次のように設定すると:

'template_map' => array(
    'error/404' => __DIR__ . '/../view/error/404.phtml',
    'my-page/one_more_error404' => __DIR__ . '/../view/my-page/my-page/one_more_error404.phtml',
    'other_page/second_404' => __DIR__ . '/../view/other-page/one_more_error404.phtml',

'not_found_template' => array(
    'error/404',
    'my-page/one_more_error404',
    'other-page/second_404',
);

エラーがスローされます。テンプレート'not_found_template'を 1 つだけにする必要がありますか?'error/404'

4

7 に答える 7

5

別の方法があります。をキャッチしEVENT_DISPATCH_ERRORて完全に再構築しviewModelます。Cavern はそのレイアウトです – はルートviewModelであり、デフォルトでレイアウトに追加されるコンテンツは別のものviewModel(子) です。これらの点は、公式ドキュメントに記載されているほど明確ではありません。

これはあなたの中でどのように見えるかですModule.php

public function onBootstrap(MvcEvent $event)
{
    $app = $event->getParam( 'application' );
    $eventManager = $app->getEventManager();


    /** attach Front layout for 404 errors */
    $eventManager->attach( MvcEvent::EVENT_DISPATCH_ERROR, function( MvcEvent $event ){

        /** here you can retrieve anything from your serviceManager */
        $serviceManager = $event->getApplication()->getServiceManager();
        $someVar = $serviceManager->get( 'Some\Factory' )->getSomeValue();

        /** here you redefine layout used to publish an error */
        $layout = $serviceManager->get( 'viewManager' )->getViewModel();
        $layout->setTemplate( 'layout/start' );

        /** here you redefine template used to the error exactly and pass custom variable into ViewModel */
        $viewModel = $event->getViewModel();
        $viewModel->setVariables( array( 'someVar' => $someVar ) )
                  ->setTemplate( 'error/404' );
    });
}
于 2013-11-06T13:41:26.840 に答える
2

あなたが達成しようとしていることを私がフォローしているのかわかりませんが、あなたがしようとしていることの明確な例を挙げていただけますか?

渡されたビューモデルに変数を追加しようとしているだけの場合は、コントローラーでこれを行うこともできます。AbstractActionControllerを確認してください

/**
 * Action called if matched action does not exist
 *
 * @return array
 */
public function notFoundAction()
{
    $response   = $this->response;
    $event      = $this->getEvent();
    $routeMatch = $event->getRouteMatch();
    $routeMatch->setParam('action', 'not-found');

    if ($response instanceof HttpResponse) {
        return $this->createHttpNotFoundModel($response);
    }
    return $this->createConsoleNotFoundModel($response);
}

/**
 * Create an HTTP view model representing a "not found" page
 *
 * @param  HttpResponse $response
 * @return ViewModel
 */
protected function createHttpNotFoundModel(HttpResponse $response)
{
    $response->setStatusCode(404);

    // Add in extra stuff from your ServiceLocator here...

    // $viewModel->setTemplate(..); 

    return new ViewModel(array(
        'content' => 'Page not found',
    ));
}
于 2013-01-16T15:18:15.263 に答える