web-dev-qa-db-ja.com

zendFrameworkのモジュール構成とレイアウト構成

Zendフレームワークでモジュールとレイアウトを構成するための他の記事からいくつかのコードを入手しました。私は地元で試してみました。デフォルトと管理モジュールで異なるレイアウトを取得しませんでした。これは、zendフレームワークのモジュールとレイアウトを構成するための私のコードです。

configs/application.ini

[production]

# Debug output
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0

# Include path
includePaths.library = APPLICATION_PATH "/../library"

# Bootstrap
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

admin.bootstrap.path = APPLICATION_PATH "/modules/admin/Bootstrap.php"
admin.bootstrap.class = "admin_Bootstrap"

# Front Controller
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.env = APPLICATION_ENV

# Session
resources.session.name = "ZendSession"
resources.session.save_path = APPLICATION_PATH "/../data/session"
resources.session.remember_me_seconds = 86400

# Layout
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH "/layouts"
admin.resources.layout.layout = "admin"
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts"

# Views
resources.view.encoding = "UTF-8"
resources.view.basePath = APPLICATION_PATH "/views/"
resources.view[] =

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] =
resources.view[] =
admin.resources.view[] = 

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

application/Bootstrap.php

<?php

/**
* Ensure all communications are managed by sessions.
*/
require_once ('Zend/Session.php');
Zend_Session::start();

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

     protected function _initDoctype() {
      $this->bootstrap( 'view' );
      $view = $this->getResource( 'view' );
      $view->navigation = array();
      $view->subnavigation = array();
      $view->headTitle( 'Module One' );
      $view->headLink()->appendStylesheet('/css/clear.css');
      $view->headLink()->appendStylesheet('/css/main.css');
      $view->headScript()->appendFile('/js/jquery.js');
      $view->doctype( 'XHTML1_STRICT' );
      //$view->navigation = $this->buildMenu();
   }

    /*protected function _initAppAutoLoad()
    {
   $autoloader = new Zend_Application_Module_Autoloader(array(
       'namespace' => 'default',
       'basePath' => APPLICATION_PATH
        ));
   return $autoloader;
    }*/

    protected function _initLayoutHelper()
    {
        $this->bootstrap('frontController');
        $layout = Zend_Controller_Action_HelperBroker::addHelper(
            new ModuleLayoutLoader());
    }


   public function _initControllers()
   {
       $front = Zend_Controller_Front::getInstance();
      $front->addModuleDirectory(APPLICATION_PATH . '/modules/admin/', 'admin');
    }

    protected function _initAutoLoadModuleAdmin() {
        $autoloader = new Zend_Application_module_Autoloader(array(
            'namespace' => 'Admin',
            'basePath' => APPLICATION_PATH . '/modules/admin'
        ));

        return $autoloader;
    }

    protected function _initModuleutoload() {
      $autoloader = new Zend_Application_Module_Autoloader ( array ('namespace' => '', 'basePath' => APPLICATION_PATH ) );
      return $autoloader;
   }

}

class ModuleLayoutLoader extends Zend_Controller_Action_Helper_Abstract
// looks up layout by module in application.ini
{
    public function preDispatch()
    {
        $bootstrap = $this->getActionController()
                          ->getInvokeArg('bootstrap');
        $config = $bootstrap->getOptions();
        echo $module = $this->getRequest()->getModuleName();
        /*echo "Configs : <pre>";
        print_r($config[$module]);*/
        if (isset($config[$module]['resources']['layout']['layout'])) {
            $layoutScript = $config[$module]['resources']['layout']['layout'];
            $this->getActionController()
            ->getHelper('layout')
            ->setLayout($layoutScript);
        }
    }
}

application/modules/admin/Bootstrap.php

<?php
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
{
/*protected function _initAppAutoload()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => 'admin',
        'basePath' => APPLICATION_PATH . '/modules/admin/'
    ));
    return $autoloader;
}*/
   protected function _initDoctype() {
      $this->bootstrap( 'view' );
      $view = $this->getResource( 'view' );
      $view->navigation = array();
      $view->subnavigation = array();
      $view->headTitle( 'Module One' );
      $view->headLink()->appendStylesheet('/css/clear.css');
      $view->headLink()->appendStylesheet('/css/main.css');
      $view->headScript()->appendFile('/js/jquery.js');
      $view->doctype( 'XHTML1_STRICT' );
      //$view->navigation = $this->buildMenu();
   }
}

それを読んで、モジュールとレイアウトを正しい方法で構成する方法を知っている人がいたら教えてください。

ありがとう、よろしく、

プラサントP

14
Prasanth P

私が書いたこのコードでプラグインアプローチを使用します:

メインのブートストラップ:

protected function _initPlugins()
{
        // Access plugin
        $front = Zend_Controller_Front::getInstance(); 
        $front->registerPlugin(new MyApp_Plugin_Module());
}

プラグインディレクトリ:

class MyApp_Plugin_Module extends Zend_Controller_Plugin_Abstract
{

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {

        $module = $request->getModuleName();
        $layout = Zend_Layout::getMvcInstance();

        // check module and automatically set layout
        $layoutsDir = $layout->getLayoutPath();
        // check if module layout exists else use default
        if(file_exists($layoutsDir . DIRECTORY_SEPARATOR . $module . ".phtml")) {
            $layout->setLayout($module);
        } else {
            $layout->setLayout("default");
        }
}

それが役に立てば幸い。

24
DavidHavl

あなたのコードから:

# Layout
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH "/layouts"
admin.resources.layout.layout = "admin"
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts"

管理モジュールレイアウトとしてyour_app/modules/admin/layouts/admin.phtmlを使用しており、your_app/layouts /layout.phtmlに取って代わったと思います。モジュールを切り替える方法を確認し、resources.layout.layoutの代わりにsite.ressources.layoutを試してください。私はゼンドの初心者です。設定方法を確認してくださいbootstrap at http://www.survivethedeepend.com/

同じ問題と解決策がここで強調されています: http://blog.astrumfutura.com/archives/415-Self-Contained-Reusable-Zend-Framework-Modules-With-Standardised-Configurators.html

8
P.M

私のアプリケーションでは、このように構成しました。それは完璧に機能しました。

protected function _initLayout(){
    $layout = explode('/', $_SERVER['REQUEST_URI']);

    if(in_array('admin', $layout)){
        $layout_dir = 'admin';
    }else if(in_array('default', $layout)){
        $layout_dir = 'default';
    }else{
        $layout_dir = 'default';
    }
      $options = array(
             'layout'     => 'layout',
             'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts"
      );
    Zend_Layout::startMvc($options);
}
6
Rubens Matos

最も簡単な方法はURI_Stringをチェックすることだと思います。下記を参照してください:

「admin」という名前のモジュールがあります。レイアウトフォルダの下に2つのディレクトリがあります。 "サイト"および "管理者"

\ application\layout\site\layout.phtmlおよび\ application\layout\admin\layout.phtml

Bootstrap.phpにこのコードブロックを追加します。レイアウトディレクトリのパスを変更するだけです。

protected function _initLayout(){
    $layout = explode('/', $_SERVER['REQUEST_URI']);

    if(in_array('admin', $layout)){
        $layout_dir = 'admin';
    }else{
        $layout_dir = 'site';
    }

      $options = array(
             'layout'     => 'layout',
             'layoutPath' => APPLICATION_PATH . "/layouts/scripts/".$layout_dir,
      );

    Zend_Layout::startMvc($options);
}
2
zurc

これを実現するには、コントローラープラグインを使用する必要があります。これは、レイアウトがリクエストエントリに基づいて設定され、bootstrapアプリケーションがディスパッチされていないため、コントローラーを使用する必要があるためです。レイアウトを切り替えるためにpreDispatchで動作するプラグイン。

2
Chris

あなたの質問は私の質問に答えました、そうです、私はそれが私のbootstrapモジュールで機能しなかった理由を見つけようとしていました、あなたが行を追加する必要があるその構成ファイルで見ました

administrador.resources.view [] =

バリューパートナー!

1
user1602214
<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

   public function _initAutoload() {
            $autoloader = Zend_Loader_Autoloader::getInstance();
            $moduleLoader = new Zend_Application_Module_Autoloader(
                    array(
                            'namespace' => '',
                             'basePath' => APPLICATION_PATH . '/modules'

                    )
            );

             return $moduleLoader;
    } 


protected function _initViewhelpers()
{
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $view->doctype('XHTML1_STRICT');
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
}


protected function _initNavigation()
{
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav');

    $navigation = new Zend_Navigation($config);
    $view->navigation($navigation);
}

}
0
vinod sorout

レイアウトとモジュールは、新しくzendプロジェクトで有効になっていません(ZFバージョン1)。有効にする必要があり、機能させる必要があります。

レイアウトは、作業中のzendプロジェクトの共通のヘッダーとフッターで機能しますが、モジュールは、ユーザー用のモジュール、管理者用のモジュール、訪問者用のモジュールなど、さまざまな種類のアクセスに使用できます。

クイックリファレンスについては、私のサイトで、ここから基本的なアイデアを得るための完全なプロジェクトを含む完全な説明を見つけることができます。 。 http://www.getallthing.com/how-to-use-layout-and-module-in-zend-framework/

頑張って乾杯!

0
user2344063
$options = array(
         'layout'     => 'layout',
         'layoutPath' => APPLICATION_PATH."/modules/".$layout_dir."/views/layouts"
  );
Zend_Layout::startMvc($options);

SOFから他のいくつかのソリューションを試しましたが、これはうまく機能しました。 layoutPathを実際のレイアウトのフォルダーにポイントする必要があります

0
Lionel Morrison