Problem with ZF: Can't get modules to work. HALP!

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
Theory?
Forum Contributor
Posts: 138
Joined: Wed Apr 11, 2007 10:43 am

Problem with ZF: Can't get modules to work. HALP!

Post by Theory? »

So let's see if I can narrow this down:

I have my little app and now I want to add the back-end administration module. Simple task, no?

I have a bootstrap that has this thing going on:

Code: Select all

 
<?php
 
//...
 
$frontController = Zend_Controller_Front::getInstance();
        
        $frontController->throwExceptions(false);
        $frontController->setControllerDirectory(
            array(
                'default' => ROOT_DIR . '/application/controllers', //default module controllers live here!
                'admin' => ROOT_DIR . '/application/admin/controllers' //and their trusty sidekick the back-end admin lives here!
            )
        );
        
        $frontController->registerPlugin(new freeblankets_Controller_Plugin_ActionSetup()); //deals with the ActionStack, don't like.
        $frontController->registerPlugin(new freeblankets_Controller_Plugin_ViewSetup(), 98); //ViewSetup, yadda yadda yadda
        
        // setup the layout
        Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR . '/application/views/layouts', 
                                    'layout' => 'layout',
                                    'pluginClass' => 'freeblankets_Layout_Controller_Plugin_Layout')); //Used to switch layouts between modules
 
Then like it says there, I have this Layout_Controller_Plugin_Layout:

Code: Select all

 
<?php
 
class freeblankets_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
{
   
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        switch ($request->getModuleName())
        {
            case 'admin':
                $this->_moduleChange('admin');
        }
    }
 
    protected function _moduleChange($moduleName)
    {
        $this->getLayout()->setLayoutPath(
            dirname(dirname(dirname(                       //Watch the birdie! He's vicious and he will murder you! 
                $this->getLayout()->getLayoutPath()
            )))
            . DIRECTORY_SEPARATOR . $moduleName . '/views/layouts'
        );
        $this->getLayout()->setLayout($moduleName);
    }
   
}
 
Which basically takes the request and says, "If the module is called 'admin' I should load the admin layout instead of the default one. Duh!

So I goes aheads and loads the page at: http://.../public/admin (also tried with the controller name http://.../public/admin/index) and I get the following error:

Error: script 'admin.phtml' not found in path (/.../admin/views/layouts/:/.../application/views/scripts/:/.../application/admin/views/scripts/:./views/scripts/)

#0 /.../library/Zend/View/Abstract.php(783): Zend_View_Abstract->_script('admin.phtml')
#1 /.../library/Zend/Layout.php(787): Zend_View_Abstract->render('admin.phtml')
#2 /.../library/Zend/Layout/Controller/Plugin/Layout.php(142): Zend_Layout->render()
#3 /.../library/Zend/Controller/Plugin/Broker.php(331): Zend_Layout_Controller_Plugin_Layout->postDispatch(Object(Zend_Controller_Request_Http))
#4 /.../library/Zend/Controller/Front.php(945): Zend_Controller_Plugin_Broker->postDispatch(Object(Zend_Controller_Request_Http))
#5 /.../application/bootstrap.php(59): Zend_Controller_Front->dispatch()
#6 /.../public/index.php(9): Bootstrap->runApp()
#7 {main}

The rest of the site works fine, all front-end actions that load as part of the default module work exactly as they should. They load the default template and everything.

admin.phtml does, in fact, exist at /.../admin/views/layouts/

Code: Select all

 
<?php echo $this->doctype(); ?>
 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
    
    <head> 
        <?php echo $this->headMeta(); ?>      
        <?php echo $this->headTitle(); ?>     
        <?php echo $this->headLink(); ?>       
    </head>
    
    <body>
    
        <?php echo $this->partial("_header.phtml"); ?>
        
        <div id="container">
            <div id="content">
                <?php echo $this->layout()->content; ?>
            </div>
        </div>
        
        <?php echo $this->partial("_footer.phtml"); ?>
    
    </body>
 
</html>
 
The IndexController (Admin_IndexController) lives at /.../admin/controllers/IndexController.php

Code: Select all

 
<?php
 
class Admin_IndexController extends Zend_Controller_Action {
 
    public function indexAction() {
    
        //empty, just to see if the layout loads.
    }
}
 
I think there may be something wrong with how I'm utilising my naming conventions here, but it seems we haven't even gotten to this point in the script since we can't even load the layout. Either way...

What am I doing wrong? Did I omit any needed information? ... used for brevity and security. My file structure, as far as I know, is totally fine since, like I said, the rest of the site works fine.
Theory?
Forum Contributor
Posts: 138
Joined: Wed Apr 11, 2007 10:43 am

Re: Problem with ZF: Can't get modules to work. HALP!

Post by Theory? »

No one? If anyone has any idea, PLEASE, I'm really at wits end with this one and I have to figure it out.
[/bump]
Post Reply